Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

384 lines
12 KiB

#include "windows.h"
#include "frame.h"
#include "dib.h"
#include "resource.h"
#include "mmfw.h"
//constants for bitmap placement in FRAME.BMP
#define PIECE_WIDTH 9
#define PIECE_HEIGHT 10
#define SMALL_MODE_OFFSET 90
//outer edges
#define TOP_LEFT_CORNER 0
#define TOP_STRIP 1
#define TOP_RIGHT_CORNER 2
#define LEFT_STRIP 3
#define SEPARATOR_BAR 4
#define RIGHT_STRIP 5
#define BOTTOM_LEFT_CORNER 6
#define BOTTOM_STRIP 7
#define BOTTOM_RIGHT_CORNER 8
//inner edges
#define TOP_LEFT_CORNER_VIEW 9
#define TOP_STRIP_VIEW 10
#define TOP_RIGHT_CORNER_VIEW 11
#define LEFT_STRIP_VIEW 12
#define RIGHT_STRIP_VIEW 13
#define BOTTOM_LEFT_CORNER_VIEW 14
#define BOTTOM_STRIP_VIEW 15
#define BOTTOM_RIGHT_CORNER_VIEW 16
#define LEFT_INNER_STRIP_VIEW 17
#define RIGHT_INNER_STRIP_VIEW 18
#define LEFT_INNER_X_OFFSET 5
#define LEFT_INNER_Y_OFFSET 7
#define RIGHT_INNER_X_OFFSET 9
#define RIGHT_INNER_Y_OFFSET 7
//system menu icon
#define SYSTEM_MENU_INDEX 52
#define SYSTEM_MENU_WIDTH 12
#define SYSTEM_MENU_HEIGHT 14
//volume control notch
#define VOLUME_X_OFFSET 2
#define BACKGROUND_COLOR RGB(0x7F, 0x7F, 0x7F)
#define BACKGROUND_COLOR_16 RGB(0xC0, 0xC0, 0xC0)
#define BACKGROUND_COLOR_HI RGB(0xFF, 0xFF, 0xFF)
extern HPALETTE hpalMain; //main palette of app
extern HINSTANCE hInst; //instance of app
extern int g_nColorMode; //color mode
HANDLE BuildFrameBitmap(HDC hDC, //dc to be compatible with
LPRECT pMainRect, //overall window size
LPRECT pViewRect, //rect of black viewport window,
//where gradient should begin,
//with 0,0 as top left of main
int nViewMode, //if in normal, restore, small
LPPOINT pSysMenuPt, //point where sys menu icon is placed
LPRECT pSepRects, //array of rects for separator bars
int nNumSeps, //number of separtors in array
BITMAP* pBM) //bitmap info
{
HDC memDC = CreateCompatibleDC(hDC);
HPALETTE hpalOld = SelectPalette(memDC, hpalMain, FALSE);
HBITMAP hbmpOld;
HBITMAP hbmpTemp;
HBITMAP hbmpFinal;
int nSmallOffset = 0;
if ((nViewMode != VIEW_MODE_NORMAL) && (nViewMode != VIEW_MODE_NOBAR))
{
nSmallOffset = SMALL_MODE_OFFSET;
}
//load frame bitmap
int nBitmap = IDB_FRAME_TOOLKIT;
switch (g_nColorMode)
{
case COLOR_16 : nBitmap = IDB_FRAME_TOOLKIT_16; break;
case COLOR_HICONTRAST : nBitmap = IDB_FRAME_TOOLKIT_HI; break;
}
hbmpTemp = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(nBitmap),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
HANDLE hbmpFrame = DibFromBitmap((HBITMAP)hbmpTemp,0,0,NULL,0);
DeleteObject(hbmpTemp);
hbmpFinal = CreateCompatibleBitmap(hDC,
pMainRect->right - pMainRect->left,
pMainRect->bottom - pMainRect->top);
hbmpOld = (HBITMAP)SelectObject(memDC, hbmpFinal);
//first paint the background
COLORREF colorBackground = BACKGROUND_COLOR;
switch (g_nColorMode)
{
case COLOR_16 : colorBackground = BACKGROUND_COLOR_16; break;
case COLOR_HICONTRAST : colorBackground = BACKGROUND_COLOR_HI; break;
}
HBRUSH hbrBack = CreateSolidBrush(colorBackground);
FillRect(memDC,pMainRect,hbrBack);
DeleteObject(hbrBack);
//now draw the separators
for (int i = 0; i < nNumSeps; i++)
{
StretchDibBlt(memDC,
pSepRects[i].left,
pSepRects[i].top,
PIECE_WIDTH,
pSepRects[i].bottom - pSepRects[i].top,
hbmpFrame,
SEPARATOR_BAR*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
}
//draw each side
StretchDibBlt(memDC,
pMainRect->left,
pMainRect->top,
pMainRect->right - pMainRect->left,
PIECE_HEIGHT,
hbmpFrame,
TOP_STRIP*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
pMainRect->left,
pMainRect->top,
PIECE_WIDTH,
pMainRect->bottom - pMainRect->top,
hbmpFrame,
LEFT_STRIP*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
pMainRect->right - PIECE_WIDTH,
pMainRect->top,
PIECE_WIDTH,
pMainRect->bottom - pMainRect->top,
hbmpFrame,
RIGHT_STRIP*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
pMainRect->left,
pMainRect->bottom - PIECE_HEIGHT,
pMainRect->right - pMainRect->left,
PIECE_HEIGHT,
hbmpFrame,
BOTTOM_STRIP*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
//draw each corner
DibBlt(memDC,
pMainRect->left,
pMainRect->top,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
TOP_LEFT_CORNER*PIECE_WIDTH,0,
SRCCOPY,0);
DibBlt(memDC,
pMainRect->right-PIECE_WIDTH,
pMainRect->top,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
TOP_RIGHT_CORNER*PIECE_WIDTH,0,
SRCCOPY,0);
DibBlt(memDC,
pMainRect->left,
pMainRect->bottom - PIECE_HEIGHT,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
BOTTOM_LEFT_CORNER*PIECE_WIDTH,0,
SRCCOPY,0);
DibBlt(memDC,
pMainRect->right - PIECE_WIDTH,
pMainRect->bottom - PIECE_HEIGHT,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
BOTTOM_RIGHT_CORNER*PIECE_WIDTH,0,
SRCCOPY,0);
//draw each side of the interior viewport
StretchDibBlt(memDC,
pViewRect->left,
pViewRect->top,
pViewRect->right - pViewRect->left,
PIECE_HEIGHT,
hbmpFrame,
TOP_STRIP_VIEW*PIECE_WIDTH+nSmallOffset,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
pViewRect->left,
pViewRect->top,
PIECE_WIDTH,
pViewRect->bottom - pViewRect->top,
hbmpFrame,
LEFT_STRIP_VIEW*PIECE_WIDTH+nSmallOffset,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
pViewRect->right - PIECE_WIDTH,
pViewRect->top,
PIECE_WIDTH,
pViewRect->bottom - pViewRect->top,
hbmpFrame,
RIGHT_STRIP_VIEW*PIECE_WIDTH+nSmallOffset,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
pViewRect->left,
pViewRect->bottom - PIECE_HEIGHT,
pViewRect->right - pViewRect->left,
PIECE_HEIGHT,
hbmpFrame,
BOTTOM_STRIP_VIEW*PIECE_WIDTH+nSmallOffset,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
//draw each corner of the interior viewport
DibBlt(memDC,
pViewRect->left,
pViewRect->top,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
TOP_LEFT_CORNER_VIEW*PIECE_WIDTH+nSmallOffset,0,
SRCCOPY,0);
DibBlt(memDC,
pViewRect->right-PIECE_WIDTH,
pViewRect->top,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
TOP_RIGHT_CORNER_VIEW*PIECE_WIDTH+nSmallOffset,0,
SRCCOPY,0);
DibBlt(memDC,
pViewRect->left,
pViewRect->bottom - PIECE_HEIGHT,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
BOTTOM_LEFT_CORNER_VIEW*PIECE_WIDTH+nSmallOffset,0,
SRCCOPY,0);
DibBlt(memDC,
pViewRect->right - PIECE_WIDTH,
pViewRect->bottom - PIECE_HEIGHT,
PIECE_WIDTH,
PIECE_HEIGHT,
hbmpFrame,
BOTTOM_RIGHT_CORNER_VIEW*PIECE_WIDTH+nSmallOffset,0,
SRCCOPY,0);
if ((nViewMode == VIEW_MODE_NORMAL) || (nViewMode == VIEW_MODE_NOBAR))
{
//draw the interiors of the viewport
StretchDibBlt(memDC,
pViewRect->left + LEFT_INNER_X_OFFSET,
pViewRect->top + LEFT_INNER_Y_OFFSET,
PIECE_WIDTH,
(pViewRect->bottom - PIECE_HEIGHT) - (pViewRect->top + LEFT_INNER_Y_OFFSET),
hbmpFrame,
LEFT_INNER_STRIP_VIEW*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
StretchDibBlt(memDC,
(pViewRect->right - RIGHT_INNER_X_OFFSET) - PIECE_WIDTH,
pViewRect->top + RIGHT_INNER_Y_OFFSET,
PIECE_WIDTH,
(pViewRect->bottom - PIECE_HEIGHT) - (pViewRect->top + RIGHT_INNER_Y_OFFSET),
hbmpFrame,
RIGHT_INNER_STRIP_VIEW*PIECE_WIDTH,0,
PIECE_WIDTH,
PIECE_HEIGHT,
SRCCOPY,0);
//draw the "notch" for the volume knob in this mode
nBitmap = IDB_NOTCH;
switch (g_nColorMode)
{
case COLOR_16 : nBitmap = IDB_NOTCH_16; break;
case COLOR_HICONTRAST : nBitmap = IDB_NOTCH_HI; break;
}
HBITMAP hbmpNotch = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(nBitmap),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
HDC memDC2 = CreateCompatibleDC(memDC);
HBITMAP hbmpOld2 = (HBITMAP)SelectObject(memDC2,hbmpNotch);
BITMAP bm;
GetObject(hbmpNotch,sizeof(bm),&bm);
BitBlt(memDC,
pViewRect->right - bm.bmWidth,
(pViewRect->bottom - PIECE_HEIGHT) - VOLUME_X_OFFSET,
bm.bmWidth,
bm.bmHeight,
memDC2,
0,0,SRCCOPY);
SelectObject(memDC2,hbmpOld2);
DeleteObject(hbmpNotch);
DeleteDC(memDC2);
}
//blit the system menu onto the picture, from the button toolkit bitmap
if (nViewMode < VIEW_MODE_SMALL)
{
nBitmap = IDB_BUTTON_TOOLKIT;
switch (g_nColorMode)
{
case COLOR_16 : nBitmap = IDB_BUTTON_TOOLKIT_16; break;
case COLOR_HICONTRAST : nBitmap = IDB_BUTTON_TOOLKIT_HI; break;
}
HBITMAP hbmpSys = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(nBitmap),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
HDC memDC2 = CreateCompatibleDC(memDC);
HBITMAP hbmpOld2 = (HBITMAP)SelectObject(memDC2,hbmpSys);
BitBlt(memDC,
pSysMenuPt->x,
pSysMenuPt->y,
SYSTEM_MENU_WIDTH,
SYSTEM_MENU_HEIGHT,
memDC2,
SYSTEM_MENU_INDEX,0,
SRCCOPY);
SelectObject(memDC2,hbmpOld2);
DeleteObject(hbmpSys);
DeleteDC(memDC2);
}
SelectObject(memDC,hbmpOld);
SelectPalette(memDC, hpalOld, TRUE);
DeleteDC(memDC);
GlobalFree(hbmpFrame);
if (pBM)
{
GetObject(hbmpFinal,sizeof(BITMAP),pBM);
}
HANDLE hdib = DibFromBitmap((HBITMAP)hbmpFinal,0,0,hpalMain,0);
DeleteObject(hbmpFinal);
return hdib;
}