|
|
#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; }
|