|
|
/* FAKEWIN.C
Resident Code Segment // Tweak: make non-resident?
Most of this code is taken from the display CPLs adjusted to work with the Theme Switcher and cleaned up a little.
Routines for painting the preview box in the main window Window samples Icons (Desktop background is in BKGD.C)
Frosting: Master Theme Selector for Windows '95 Copyright (c) 1994-1999 Microsoft Corporation. All rights reserved. */
// ---------------------------------------------
// Brief file history:
// Alpha:
// Beta:
// Bug fixes
// ---------
#include "windows.h"
#include "frost.h"
#include "global.h"
#include "bkgd.h"
#include "fakewin.h"
#include "nc.h"
//
// local routines
void NEAR FakewinRecalc(void); void NEAR PASCAL Set3DPaletteColor(COLORREF rgb, int iColor); COLORREF NearestColor(int iColor, COLORREF rgb); void GetThemeColors(LPTSTR); void GetThemeFonts(LPTSTR); BOOL IsPaletteColor(HPALETTE, COLORREF); COLORREF GetNearestPaletteColor(HPALETTE, COLORREF);
// as per DavidBa 3/95 and MartinHa 4/95
WINUSERAPI HANDLE WINAPI SetSysColorsTemp(COLORREF FAR *, HBRUSH FAR *, UINT_PTR); // internal
WINUSERAPI int WINAPI DrawMenuBarTemp(HWND, HDC, LPRECT, HMENU, HFONT); #ifdef UNICODE
#define DrawCaptionTemp DrawCaptionTempW
#else
#define DrawCaptionTemp DrawCaptionTempA
#endif // !UNICODE
WINUSERAPI BOOL WINAPI DrawCaptionTemp(HWND, HDC, LPRECT, HFONT, HICON, LPTSTR, UINT);
// globals
ICONMETRICS imTheme; NONCLIENTMETRICS ncmTheme; // string size metrics
int cxNormalStr; int yButtonStr; int cxDisabledStr, cxSelectedStr; // includes extra 2 chars width cxAvgCharx2
int cyDisabledStr, cxAvgCharx2;
#define RGB_PALETTE 0x02000000
//
// FakewinInit/Destroy
//
// These are the the constant objects and one-time inits for
// things we need to paint the fake window sample.
//
// Taken from the display CPL code, rearranged, commented and cleaned up.
//
BOOL FAR PASCAL FakewinInit(void) { HDC hdc; int iter;
//
// Load our display strings.
LoadString(hInstApp, IDS_ACTIVE, szFakeActive, ARRAYSIZE(szFakeActive)); LoadString(hInstApp, IDS_INACTIVE, szFakeInactive, ARRAYSIZE(szFakeInactive)); LoadString(hInstApp, IDS_MINIMIZED, szFakeMinimized, ARRAYSIZE(szFakeMinimized)); LoadString(hInstApp, IDS_ICONTITLE, szFakeIconTitle, ARRAYSIZE(szFakeIconTitle)); LoadString(hInstApp, IDS_NORMAL, szFakeNormal, ARRAYSIZE(szFakeNormal)); LoadString(hInstApp, IDS_DISABLED, szFakeDisabled, ARRAYSIZE(szFakeDisabled)); LoadString(hInstApp, IDS_SELECTED, szFakeSelected, ARRAYSIZE(szFakeSelected)); LoadString(hInstApp, IDS_MSGBOX, szFakeMsgBox, ARRAYSIZE(szFakeMsgBox)); LoadString(hInstApp, IDS_BUTTONTEXT, szFakeButton, ARRAYSIZE(szFakeButton)); // LoadString(hInstApp, IDS_SMCAPTION, szFakeSmallCaption, ARRAYSIZE(szFakeSmallCaption));
LoadString(hInstApp, IDS_WINDOWTEXT, szFakeWindowText, ARRAYSIZE(szFakeWindowText)); LoadString(hInstApp, IDS_MSGBOXTEXT, szFakeMsgBoxText, ARRAYSIZE(szFakeMsgBoxText));
//
// store interesting gdi info
hdc = GetDC(NULL); bPalette = GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE; ReleaseDC(NULL, hdc);
//
// other sys info that doesn't change with theme
cyFixedBorder = GetSystemMetrics(SM_CYBORDER); cxFixedBorder = GetSystemMetrics(SM_CXBORDER); cxFixedEdge = GetSystemMetrics(SM_CXEDGE); cyFixedEdge = GetSystemMetrics(SM_CYEDGE);
//
// always make a palette even on non-pal device (???)
if (bPalette || TRUE) { DWORD dwPal[21]; HPALETTE hpal = GetStockObject(DEFAULT_PALETTE);
dwPal[0] = MAKELONG(0x300, 20); dwPal[1] = RGB(255, 255, 255); dwPal[2] = RGB(0, 0, 0 ); dwPal[3] = RGB(192, 192, 192); dwPal[4] = RGB(128, 128, 128); dwPal[5] = RGB(255, 0, 0 ); dwPal[6] = RGB(128, 0, 0 ); dwPal[7] = RGB(255, 255, 0 ); dwPal[8] = RGB(128, 128, 0 ); dwPal[9] = RGB(0 , 255, 0 ); dwPal[10] = RGB(0 , 128, 0 ); dwPal[11] = RGB(0 , 255, 255); dwPal[12] = RGB(0 , 128, 128); dwPal[13] = RGB(0 , 0, 255); dwPal[14] = RGB(0 , 0, 128); dwPal[15] = RGB(255, 0, 255); dwPal[16] = RGB(128, 0, 128);
// get magic colors
GetPaletteEntries(hpal, 8, 4, (LPPALETTEENTRY)&dwPal[17]);
hpal3D = CreatePalette((LPLOGPALETTE)dwPal); }
// init fonts/brushes arrays to null
for (iter = 0; iter < NUM_FONTS; iter++) { g_fonts[iter].hfont = NULL; } for (iter = 0; iter < MAX_COLORS; iter++) { g_brushes[iter] = NULL; }
// cleanup
return (TRUE); }
// final deletion of fonts, brushes, palette
void FAR PASCAL FakewinDestroy(void) { int i;
for (i = 0; i < NUM_FONTS; i++) { if (g_fonts[i].hfont) DeleteObject(g_fonts[i].hfont); } for (i = 0; i < MAX_COLORS; i++) { if (g_brushes[i]) DeleteObject(g_brushes[i]); }
if (hpal3D) DeleteObject(hpal3D); }
//
// FakewinSetTheme
//
// Reset all the things you're painting that change with each theme:
// colors, brushes, fonts, etc.
//
// Then given the current fonts and win sizes, call FakewinRecalc to
// recalculate all the rectangles for painting.
//
#define bThemed (*lpszTheme)
void FAR FakewinSetTheme(LPTSTR lpszTheme) { extern TCHAR szMetrics[]; extern TCHAR szNCM[]; extern TCHAR szIM[]; UINT uret; int iter;
//
// init colors: get theme's system colors and null out old brushes
GetThemeColors(lpszTheme); for (iter = 0; iter < MAX_COLORS; iter++) { if (g_brushes[iter]) DeleteObject(g_brushes[iter]); g_brushes[iter] = NULL; }
//
// tweak system color palette for 3D face color in array
if (bPalette) { PALETTEENTRY pePal[4]; HPALETTE hpal = GetStockObject(DEFAULT_PALETTE);
// get current magic colors
GetPaletteEntries(hpal, 8, 4, pePal); SetPaletteEntries(hpal3D, 16, 4, pePal);
// set up magic colors in the 3d palette
if (!IsPaletteColor(hpal, g_rgb[COLOR_3DFACE])) { Set3DPaletteColor(g_rgb[COLOR_3DFACE], COLOR_3DFACE); Set3DPaletteColor(g_rgb[COLOR_3DSHADOW], COLOR_3DSHADOW); Set3DPaletteColor(g_rgb[COLOR_3DHILIGHT], COLOR_3DHILIGHT); } }
//
// now go get new brushes for the new and tweaked sys colors
for (iter = 0; iter < MAX_COLORS; iter++) { g_rgb[iter] = NearestColor(iter, g_rgb[iter]); g_brushes[iter] = CreateSolidBrush(g_rgb[iter]); }
//
// get window/border/etc size info from theme
if (bThemed && // theme file and active checkbox
(bCBStates[FC_BORDERS] || bCBStates[FC_FONTS])) { // one or both checked
uret = (UINT) GetPrivateProfileString((LPTSTR)szMetrics, (LPTSTR)szNCM, (LPTSTR)szNULL, (LPTSTR)pValue, MAX_VALUELEN, lpszTheme); Assert(uret, TEXT("problem getting stored nonclient metrics for fakewin setup\n")); // translate stored data string to NONCLIENTMETRICS bytes
WriteBytesToBuffer((LPTSTR)pValue); // char str read from and binary bytes
// written to pValue. It's OK.
// get it into global NONCLIENTMETRICS struct
#ifdef UNICODE
// NONCLIENTMETRICS are stored in ANSI format in the Theme file
// so we need to convert them to UNICODE.
ConvertNCMetricsToWIDE((LPNONCLIENTMETRICSA)pValue, (LPNONCLIENTMETRICSW)&ncmTheme); #else
// Not UNICODE so no need to convert from ANSI...
ncmTheme = *((LPNONCLIENTMETRICS)pValue); #endif
// if _both_ checkboxes are checked, stay with theme file settings for all;
// if neither were checked, you're not in this code branch (see above);
// but if one or the other is unchecked, need to mix and match
if (!bCBStates[FC_BORDERS] || !bCBStates[FC_FONTS]) { NONCLIENTMETRICS ncmTemp;
// get cur system settings
ncmTemp.cbSize = sizeof(ncmTemp); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncmTemp), (void far *)(LPNONCLIENTMETRICS)&ncmTemp, FALSE);
//
// mix them in with theme file settings according to checkbox
// don't use theme's win borders/sizes and font sizes
if (!bCBStates[FC_BORDERS]) { ncmTheme.iBorderWidth = ncmTemp.iBorderWidth; ncmTheme.iScrollWidth = ncmTemp.iScrollWidth; ncmTheme.iScrollHeight = ncmTemp.iScrollHeight; ncmTheme.iCaptionWidth = ncmTemp.iCaptionWidth; ncmTheme.iCaptionHeight = ncmTemp.iCaptionHeight; ncmTheme.iSmCaptionWidth = ncmTemp.iSmCaptionWidth; ncmTheme.iSmCaptionHeight = ncmTemp.iSmCaptionHeight; ncmTheme.iMenuWidth = ncmTemp.iMenuWidth; ncmTheme.iMenuHeight = ncmTemp.iMenuHeight;
TransmitFontCharacteristics(&(ncmTheme.lfCaptionFont), &(ncmTemp.lfCaptionFont), TFC_SIZE); TransmitFontCharacteristics(&(ncmTheme.lfSmCaptionFont), &(ncmTemp.lfSmCaptionFont), TFC_SIZE); TransmitFontCharacteristics(&(ncmTheme.lfMenuFont), &(ncmTemp.lfMenuFont), TFC_SIZE); TransmitFontCharacteristics(&(ncmTheme.lfStatusFont), &(ncmTemp.lfStatusFont), TFC_SIZE); TransmitFontCharacteristics(&(ncmTheme.lfMessageFont), &(ncmTemp.lfMessageFont), TFC_SIZE); } // don't use theme's font styles
if (!bCBStates[FC_FONTS]) { // coulda been an else clause logically
TransmitFontCharacteristics(&(ncmTheme.lfCaptionFont), &(ncmTemp.lfCaptionFont), TFC_STYLE); TransmitFontCharacteristics(&(ncmTheme.lfSmCaptionFont), &(ncmTemp.lfSmCaptionFont), TFC_STYLE); TransmitFontCharacteristics(&(ncmTheme.lfMenuFont), &(ncmTemp.lfMenuFont), TFC_STYLE); TransmitFontCharacteristics(&(ncmTheme.lfStatusFont), &(ncmTemp.lfStatusFont), TFC_STYLE); TransmitFontCharacteristics(&(ncmTheme.lfMessageFont), &(ncmTemp.lfMessageFont), TFC_STYLE); } } } else { // no theme: cur windows settings
ncmTheme.cbSize = sizeof(ncmTheme); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncmTheme), (void far *)(LPNONCLIENTMETRICS)&ncmTheme, FALSE); }
//
// get icon info from theme
if (bThemed && bCBStates[FC_ICONS]) { // theme file and active checkbox
uret = (UINT) GetPrivateProfileString((LPTSTR)szMetrics, (LPTSTR)szIM, (LPTSTR)szNULL, (LPTSTR)pValue, MAX_VALUELEN, lpszTheme); Assert(uret, TEXT("problem getting stored icon metrics for fakewin setup\n")); // translate stored data string to ICONMETRICS bytes
WriteBytesToBuffer((LPTSTR)pValue); // char str read from and binary bytes
// written to pValue. It's OK.
// get it into global ICONMETRICS struct
#ifdef UNICODE
// ICONMETRICS are stored in ANSI format in the Theme file so
// we need to convert to UNICODE.
ConvertIconMetricsToWIDE((LPICONMETRICSA)pValue, (LPICONMETRICSW)&imTheme); #else
// Not UNICODE so no need to convert ICONMETRICS...
imTheme = *((LPICONMETRICS)pValue); #endif
} else { imTheme.cbSize = sizeof(imTheme); SystemParametersInfo(SPI_GETICONMETRICS, sizeof(imTheme), (void far *)(LPICONMETRICS)&imTheme, FALSE); }
//
// get fonts from theme and create the fonts
GetThemeFonts(lpszTheme); for (iter = 0; iter < NUM_FONTS; iter++) { if (g_fonts[iter].hfont) DeleteObject(g_fonts[iter].hfont); g_fonts[iter].hfont = CreateFontIndirect(&g_fonts[iter].lf); }
// lastly, call the painting rect recalc
// now that you have new fonts and sizes
FakewinRecalc(); }
//
// GetThemeColors
//
// This routine just gets colors from the theme into the global colors
// array. Luckily, we already have our own parallel arrays of color IDs
// and strings.
//
void GetThemeColors(LPTSTR lpszTheme) { int i; BOOL bGrad = FALSE; // Are gradient captions enabled?
// Init bGrad
SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, (LPVOID)&bGrad, 0);
// can't measure this with extern def'd arrays
#if 0
Assert ((sizeof(iSysColorIndices)/sizeof(int)) == MAX_COLORS, TEXT("wrong length color array in GetThemeColors\n")); #endif
// loop through our array and store theme color in their array
for (i = 0; i < MAX_COLORS; i++) {
if (bThemed && bCBStates[FC_COLORS]) { // theme file and active checkbox
// get string from theme
GetPrivateProfileString((LPTSTR)szColorApp, (LPTSTR)pRegColors[i], (LPTSTR)szNULL, (LPTSTR)pValue, MAX_VALUELEN, lpszTheme);
// Check to see if this is one of the Gradient title bar colors.
// If it is and there is no setting in the Theme file use the color
// for the NON-GRADIENT CAPTION instead.
if ((INDEX_GRADIENTACTIVE == i) && !*pValue) { GetPrivateProfileString((LPTSTR)szColorApp, (LPTSTR)pRegColors[INDEX_ACTIVE], (LPTSTR)szNULL, (LPTSTR)pValue, MAX_VALUELEN, lpszTheme); } if ((INDEX_GRADIENTINACTIVE == i) && !*pValue) { GetPrivateProfileString((LPTSTR)szColorApp, (LPTSTR)pRegColors[INDEX_INACTIVE], (LPTSTR)szNULL, (LPTSTR)pValue, MAX_VALUELEN, lpszTheme); }
// translate string and store in RGB array with corresponding index
g_rgb[iSysColorIndices[i]] = RGBStringToColor((LPTSTR)pValue); } else { // cur windows settings
// If this is one of the gradient colors and the system
// doesn't support gradient (bpp ! > 256) or gradients are
// not currently enabled then get the primary gradient color
// for the gradient colors
// bGrad -- are gradient captions enabled?
// g_bGradient -- enough colors for gradient captions?
if (((COLOR_GRADIENTACTIVECAPTION == iSysColorIndices[i]) || (COLOR_GRADIENTINACTIVECAPTION == iSysColorIndices[i])) && (!(bGrad && g_bGradient))) {
if (INDEX_GRADIENTACTIVE == i) g_rgb[i] = GetSysColor(COLOR_ACTIVECAPTION); else if (INDEX_GRADIENTINACTIVE == i) g_rgb[i] = GetSysColor(COLOR_INACTIVECAPTION); } else g_rgb[i] = GetSysColor(i); } } }
//
// GetThemeFonts
//
// This routine just gets fonts from the theme into the global fonts
// array. Need to do each font individually into the array.
// Would be cleaner if we were starting this from scratch. Just trying
// to munge it into the form the borrowed code uses.
//
// Note that for Cur Windows Settings, the ncmTheme and imTheme are already
// set to cur win settings, so this just works the same.
//
void GetThemeFonts(LPTSTR lpszTheme) { g_fonts[FONT_CAPTION].lf = ncmTheme.lfCaptionFont; g_fonts[FONT_MENU].lf = ncmTheme.lfMenuFont; g_fonts[FONT_STATUS].lf = ncmTheme.lfStatusFont; g_fonts[FONT_MSGBOX].lf = ncmTheme.lfMessageFont;
g_fonts[FONT_ICONTITLE].lf = imTheme.lfFont; }
// ----------------------------------------------------------------------------
// FakewinRecalc
//
// calculate all of the rectangles based on the given window rect
// ----------------------------------------------------------------------------
void FakewinRecalc(void) { // DWORD xyNormal;
// DWORD xyButton;
SIZE sizeExtent; RECT rc; HFONT hfontT; int cxFrame, cyFrame; int cyCaption; int i; HDC hdc;
// inits
hdc = GetDC(NULL); rc = rFakeWin;
//
// Get our drawing data
//
cxFrame = ((int)ncmTheme.iBorderWidth + 1) * cxFixedBorder + cxFixedEdge; cyFrame = ((int)ncmTheme.iBorderWidth + 1) * cyFixedBorder + cyFixedEdge; cyCaption = (int)ncmTheme.iCaptionHeight; // cxSize = GetSystemMetrics(SM_CXSIZE); // WHAT GIVES ***DEBUG***
cxSize = cyCaption - 2*cyFixedBorder; // Wild-Assed Guess
//
// Get text dimensions, with proper fonts
//
hfontT = SelectObject(hdc, g_fonts[FONT_CAPTION].hfont);
SelectObject(hdc, g_fonts[FONT_MENU].hfont);
//
// rewrite this to use win32 code
//
GetTextExtentPoint32(hdc, szFakeNormal, lstrlen(szFakeNormal), (LPSIZE)&sizeExtent); cxNormalStr = (int)(sizeExtent.cx);
GetTextExtentPoint32(hdc, szFakeDisabled, lstrlen(szFakeDisabled), (LPSIZE)&sizeExtent); cxDisabledStr = (int)(sizeExtent.cx); cyDisabledStr = (int)(sizeExtent.cy);
GetTextExtentPoint32(hdc, szFakeSelected, lstrlen(szFakeSelected), (LPSIZE)&sizeExtent); cxSelectedStr = (int)(sizeExtent.cx);
// get the average width (USER style) of menu font
GetTextExtentPoint32(hdc, szFakeABC, 52, (LPSIZE)&sizeExtent); cxAvgCharx2 = 2 * ((int)(sizeExtent.cx) / 52);
// actual menu-handling widths of strings is bigger
cxDisabledStr += cxAvgCharx2; cxSelectedStr += cxAvgCharx2; cxNormalStr += cxAvgCharx2;
GetTextExtentPoint32(hdc, szFakeButton, lstrlen(szFakeButton), (LPSIZE)&sizeExtent); yButtonStr = (int)(sizeExtent.cy);
#ifdef ORIG_OUTDATED_CPL_CODE
xyNormal = GetTextExtent(hdc, szFakeNormal, lstrlen(szFakeNormal)); cxDisabledStr = LOWORD(GetTextExtent(hdc, szFakeDisabled, lstrlen(szFakeDisabled))); cxSelectedStr = LOWORD(GetTextExtent(hdc, szFakeSelected, lstrlen(szFakeSelected))); // get the average width (USER style) of menu font
cxAvgCharx2 = 2 * (LOWORD(GetTextExtent(hdc, szFakeABC, 52)) / 52); // actual menu-handling widths of strings is bigger
cxDisabledStr += cxAvgCharx2; cxSelectedStr += cxAvgCharx2; LOWORD(xyNormal) += cxAvgCharx2; xyButton = GetTextExtent(hdc, szFakeButton, lstrlen(szFakeButton)); #endif
// done with dc
SelectObject(hdc, hfontT); ReleaseDC(NULL, hdc);
// donna paint dt! already done
#if 0
// Desktop
RCZ(ELEMENT_DESKTOP) = rc; InflateRect(&rc, -8*cxFixedBorder, -8*cyFixedBorder); #endif
//
// Windows
//
rc.bottom -= cyFrame + cyCaption; RCZ(ELEMENT_ACTIVEBORDER) = rc; OffsetRect(&RCZ(ELEMENT_ACTIVEBORDER), cxFrame, cyFrame + cyCaption + cyFixedBorder); RCZ(ELEMENT_ACTIVEBORDER).bottom -= cyCaption;
//
// Inactive window
//
rc.right -= cyCaption; RCZ(ELEMENT_INACTIVEBORDER) = rc;
// Caption
InflateRect(&rc, -cxFrame, -cyFrame); rc.bottom = rc.top + cyCaption + cyFixedBorder; RCZ(ELEMENT_INACTIVECAPTION) = rc;
// close button
InflateRect(&rc, -cxFixedEdge, -cyFixedEdge); rc.bottom -= cyFixedBorder; // compensate for magic line under caption
RCZ(ELEMENT_INACTIVESYSBUT1) = rc; RCZ(ELEMENT_INACTIVESYSBUT1).left = rc.right - (cyCaption - cxFixedEdge);
// min/max buttons
RCZ(ELEMENT_INACTIVESYSBUT2) = rc; RCZ(ELEMENT_INACTIVESYSBUT2).right = RCZ(ELEMENT_INACTIVESYSBUT1).left - cxFixedEdge; RCZ(ELEMENT_INACTIVESYSBUT2).left = RCZ(ELEMENT_INACTIVESYSBUT2).right - 2 * (cyCaption - cxFixedEdge);
// cpl code doesn't do this either
#if 0
//
// small caption window
//
RCZ(ELEMENT_SMCAPTION) = RCZ(ELEMENT_ACTIVEBORDER); RCZ(ELEMENT_SMCAPTION).bottom = RCZ(ELEMENT_SMCAPTION).top; RCZ(ELEMENT_SMCAPTION).top -= (int)ncmTheme.iSmCaptionHeight + cyFixedEdge + 2 * cyFixedBorder; RCZ(ELEMENT_SMCAPTION).right -= cxFrame; RCZ(ELEMENT_SMCAPTION).left = RCZ(ELEMENT_INACTIVECAPTION).right + 2 * cxFrame;
RCZ(ELEMENT_SMCAPSYSBUT) = RCZ(ELEMENT_SMCAPTION); // deflate inside frame/border to caption and then another edge's worth
RCZ(ELEMENT_SMCAPSYSBUT).right -= 2 * cxFixedEdge + cxFixedBorder; RCZ(ELEMENT_SMCAPSYSBUT).top += 2 * cxFixedEdge + cxFixedBorder; RCZ(ELEMENT_SMCAPSYSBUT).bottom -= cxFixedEdge + cxFixedBorder; RCZ(ELEMENT_SMCAPSYSBUT).left = RCZ(ELEMENT_SMCAPSYSBUT).right - ((int)ncmTheme.iSmCaptionHeight - cxFixedEdge); #endif
//
// Active window
//
// Caption
rc = RCZ(ELEMENT_ACTIVEBORDER); InflateRect(&rc, -cxFrame, -cyFrame); RCZ(ELEMENT_ACTIVECAPTION) = rc; RCZ(ELEMENT_ACTIVECAPTION).bottom = RCZ(ELEMENT_ACTIVECAPTION).top + cyCaption + cyFixedBorder;
// close button
RCZ(ELEMENT_ACTIVESYSBUT1) = RCZ(ELEMENT_ACTIVECAPTION); InflateRect(&RCZ(ELEMENT_ACTIVESYSBUT1), -cxFixedEdge, -cyFixedEdge); RCZ(ELEMENT_ACTIVESYSBUT1).bottom -= cyFixedBorder; // compensate for magic line under caption
RCZ(ELEMENT_ACTIVESYSBUT1).left = RCZ(ELEMENT_ACTIVESYSBUT1).right - (cyCaption - cxFixedEdge);
// min/max buttons
RCZ(ELEMENT_ACTIVESYSBUT2) = RCZ(ELEMENT_ACTIVESYSBUT1); RCZ(ELEMENT_ACTIVESYSBUT2).right = RCZ(ELEMENT_ACTIVESYSBUT1).left - cxFixedEdge; RCZ(ELEMENT_ACTIVESYSBUT2).left = RCZ(ELEMENT_ACTIVESYSBUT2).right - 2 * (cyCaption - cxFixedEdge);
// Menu
rc.top = RCZ(ELEMENT_ACTIVECAPTION).bottom; RCZ(ELEMENT_MENUNORMAL) = rc; rc.top = RCZ(ELEMENT_MENUNORMAL).bottom = RCZ(ELEMENT_MENUNORMAL).top + (int)ncmTheme.iMenuHeight; RCZ(ELEMENT_MENUDISABLED) = RCZ(ELEMENT_MENUSELECTED) = RCZ(ELEMENT_MENUNORMAL);
RCZ(ELEMENT_MENUDISABLED).left = RCZ(ELEMENT_MENUNORMAL).left + cxNormalStr; RCZ(ELEMENT_MENUDISABLED).right = RCZ(ELEMENT_MENUSELECTED).left = RCZ(ELEMENT_MENUDISABLED).left + cxDisabledStr; RCZ(ELEMENT_MENUSELECTED).right = RCZ(ELEMENT_MENUSELECTED).left + cxSelectedStr;
//
// Client
//
RCZ(ELEMENT_WINDOW) = rc;
//
// Scrollbar
//
InflateRect(&rc, -cxFixedEdge, -cyFixedEdge); // take off client edge
RCZ(ELEMENT_SCROLLBAR) = rc; rc.right = RCZ(ELEMENT_SCROLLBAR).left = rc.right - (int)ncmTheme.iScrollWidth; RCZ(ELEMENT_SCROLLUP) = RCZ(ELEMENT_SCROLLBAR); RCZ(ELEMENT_SCROLLUP).bottom = RCZ(ELEMENT_SCROLLBAR).top + (int)ncmTheme.iScrollWidth;
RCZ(ELEMENT_SCROLLDOWN) = RCZ(ELEMENT_SCROLLBAR); RCZ(ELEMENT_SCROLLDOWN).top = RCZ(ELEMENT_SCROLLBAR).bottom - (int)ncmTheme.iScrollWidth;
//
// Message Box
//
// rc.top = RCZ(ELEMENT_WINDOW).top + (RCZ(ELEMENT_WINDOW).bottom - RCZ(ELEMENT_WINDOW).top) / 2;
rc.top = RCZ(ELEMENT_WINDOW).top + (RCZ(ELEMENT_WINDOW).bottom - RCZ(ELEMENT_WINDOW).top) / 3; // rc.bottom = RCZ(ELEMENT_DESKTOP).bottom - 2*cyFixedEdge;
rc.bottom = rFakeWin.bottom - 2*cyFixedEdge; rc.left = RCZ(ELEMENT_WINDOW).left + 2*cyFixedEdge; rc.right = RCZ(ELEMENT_WINDOW).left + (RCZ(ELEMENT_WINDOW).right - RCZ(ELEMENT_WINDOW).left) / 2 + 3*cyCaption; RCZ(ELEMENT_MSGBOX) = rc;
// Caption
RCZ(ELEMENT_MSGBOXCAPTION) = rc; RCZ(ELEMENT_MSGBOXCAPTION).top += cyFixedEdge + cyFixedBorder; RCZ(ELEMENT_MSGBOXCAPTION).bottom = RCZ(ELEMENT_MSGBOXCAPTION).top + cyCaption + cyFixedBorder; RCZ(ELEMENT_MSGBOXCAPTION).left += cxFixedEdge + cxFixedBorder; RCZ(ELEMENT_MSGBOXCAPTION).right -= cxFixedEdge + cxFixedBorder;
RCZ(ELEMENT_MSGBOXSYSBUT) = RCZ(ELEMENT_MSGBOXCAPTION); InflateRect(&RCZ(ELEMENT_MSGBOXSYSBUT), -cxFixedEdge, -cyFixedEdge); RCZ(ELEMENT_MSGBOXSYSBUT).left = RCZ(ELEMENT_MSGBOXSYSBUT).right - (cyCaption - cxFixedEdge); RCZ(ELEMENT_MSGBOXSYSBUT).bottom -= cyFixedBorder; // line under caption
// Button
RCZ(ELEMENT_BUTTON).bottom = RCZ(ELEMENT_MSGBOX).bottom - (4*cyFixedBorder + cyFixedEdge); RCZ(ELEMENT_BUTTON).top = RCZ(ELEMENT_BUTTON).bottom - (yButtonStr + 8*cyFixedBorder);
i = (RCZ(ELEMENT_BUTTON).bottom - RCZ(ELEMENT_BUTTON).top) * 3; RCZ(ELEMENT_BUTTON).left = (rc.left + (rc.right - rc.left)/2) - i/2; RCZ(ELEMENT_BUTTON).right = RCZ(ELEMENT_BUTTON).left + i; }
// ----------------------------------------------------------------------------
//
// MyDrawFrame() -
//
// Draws bordered frame, border size cl, and adjusts passed in rect.
//
// ----------------------------------------------------------------------------
void NEAR PASCAL MyDrawFrame(HDC hdc, LPRECT prc, HBRUSH hbrColor, int cl) { HBRUSH hbr; int cx, cy; RECT rcT;
rcT = *prc; cx = cl * cxFixedBorder; cy = cl * cyFixedBorder;
hbr = SelectObject(hdc, hbrColor);
PatBlt(hdc, rcT.left, rcT.top, cx, rcT.bottom - rcT.top, PATCOPY); rcT.left += cx;
PatBlt(hdc, rcT.left, rcT.top, rcT.right - rcT.left, cy, PATCOPY); rcT.top += cy;
rcT.right -= cx; PatBlt(hdc, rcT.right, rcT.top, cx, rcT.bottom - rcT.top, PATCOPY);
rcT.bottom -= cy; PatBlt(hdc, rcT.left, rcT.bottom, rcT.right - rcT.left, cy, PATCOPY);
hbr = SelectObject(hdc, hbr);
*prc = rcT; }
/*
** draw a cyFixedBorder band of 3DFACE at the bottom of the given rectangle. ** also, adjust the rectangle accordingly. */ void NEAR PASCAL MyDrawBorderBelow(HDC hdc, LPRECT prc) { int i;
i = prc->top; prc->top = prc->bottom - cyFixedBorder; FillRect(hdc, prc, g_brushes[COLOR_3DFACE]); prc->top = i; prc->bottom -= cyFixedBorder; }
/*-------------------------------------------------------------------
** draw a full window caption with system menu, minimize button, ** maximize button, and text. **-------------------------------------------------------------------*/ void NEAR PASCAL DrawFullCaption(HDC hdc, LPRECT prc, LPTSTR lpszTitle, UINT flags) { int iRight; int iFont;
SaveDC(hdc);
// special case gross for small caption that already drew on bottom
if (!(flags & DC_SMALLCAP)) MyDrawBorderBelow(hdc, prc);
iRight = prc->right; prc->right = prc->left + cxSize; DrawFrameControl(hdc, prc, DFC_CAPTION, DFCS_CAPTIONCLOSE);
prc->left = prc->right; prc->right = iRight - 2*cxSize; // iFont = flags & DC_SMALLCAP ? FONT_SMCAPTION : FONT_CAPTION;
iFont = FONT_CAPTION; DrawCaptionTemp(NULL, hdc, prc, g_fonts[iFont].hfont, NULL, lpszTitle, flags | DC_ICON | DC_TEXT);
prc->left = prc->right; prc->right = prc->left + cxSize; DrawFrameControl(hdc, prc, DFC_CAPTION, DFCS_CAPTIONMIN); prc->left = prc->right; prc->right = prc->left + cxSize; DrawFrameControl(hdc, prc, DFC_CAPTION, DFCS_CAPTIONMAX);
RestoreDC(hdc, -1); }
void FAR PASCAL FakewinDraw(HDC hdc) { RECT rcT; int nMode; DWORD rgbBk; HANDLE hOldColors = NULL; // paranoid
HPALETTE hpalOld = NULL; HICON hiconLogo; HFONT hfontOld;
//
// inits
//
SaveDC(hdc); // sneaky!
if (hpal3D) { hpalOld = SelectPalette(hdc, hpal3D, TRUE); RealizePalette(hdc); }
hOldColors = SetSysColorsTemp(g_rgb, g_brushes, MAX_COLORS);
// Setup drawing stuff
nMode = SetBkMode(hdc, TRANSPARENT); rgbBk = GetTextColor(hdc);
hiconLogo = LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, // hiconLogo = LoadImage(NULL, IDI_WINLOGO, IMAGE_ICON,
(int)ncmTheme.iCaptionHeight - 2*cxFixedBorder, (int)ncmTheme.iCaptionHeight - 2*cyFixedBorder, 0);
// we leave the lovely desktop we've already painted there
#if 0
//
// Desktop
//
FillRect(hdc, &RCZ(ELEMENT_DESKTOP), g_brushes[COLOR_BACKGROUND]); #endif
//
// Inactive window
//
// Border
rcT = RCZ(ELEMENT_INACTIVEBORDER); DrawEdge(hdc, &rcT, EDGE_RAISED, BF_RECT | BF_ADJUST); MyDrawFrame(hdc, &rcT, g_brushes[COLOR_INACTIVEBORDER], (int)ncmTheme.iBorderWidth); MyDrawFrame(hdc, &rcT, g_brushes[COLOR_3DFACE], 1);
// Caption
rcT = RCZ(ELEMENT_INACTIVECAPTION); MyDrawBorderBelow(hdc, &rcT);
// NOTE: because USER draws icon stuff using its own DC and subsequently
// its own palette, we need to make sure to use the inactivecaption
// brush before USER does so that it will be realized against our palette.
// this might get fixed in USER by better be safe.
// "clip" the caption title under the buttons
rcT.left = RCZ(ELEMENT_INACTIVESYSBUT2).left - cyFixedEdge; FillRect(hdc, &rcT, g_brushes[g_bGradient ? COLOR_GRADIENTINACTIVECAPTION : COLOR_INACTIVECAPTION]); rcT.right = rcT.left; rcT.left = RCZ(ELEMENT_INACTIVECAPTION).left; DrawCaptionTemp(NULL, hdc, &rcT, g_fonts[FONT_CAPTION].hfont, hiconLogo, szFakeInactive, DC_ICON | DC_TEXT | (g_bGradient ? DC_GRADIENT : 0));
DrawFrameControl(hdc, &RCZ(ELEMENT_INACTIVESYSBUT1), DFC_CAPTION, DFCS_CAPTIONCLOSE); rcT = RCZ(ELEMENT_INACTIVESYSBUT2); rcT.right -= (rcT.right - rcT.left)/2; DrawFrameControl(hdc, &rcT, DFC_CAPTION, DFCS_CAPTIONMIN); rcT.left = rcT.right; rcT.right = RCZ(ELEMENT_INACTIVESYSBUT2).right; DrawFrameControl(hdc, &rcT, DFC_CAPTION, DFCS_CAPTIONMAX);
// cpl code doesn't do small caption sample
#if 0
//
// small caption window
//
{ HICON hicon; int temp; rcT = RCZ(ELEMENT_SMCAPTION); hicon = LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, (int)ncmTheme.iSmCaptionHeight - 2*cxFixedBorder, (int)ncmTheme.iSmCaptionHeight - 2*cyFixedBorder, 0); DrawEdge(hdc, &rcT, EDGE_RAISED, BF_TOP | BF_LEFT | BF_RIGHT | BF_ADJUST); MyDrawFrame(hdc, &rcT, g_brushes[COLOR_3DFACE], 1); // "clip" the caption title under the buttons
temp = rcT.left; // remember start of actual caption
rcT.left = RCZ(ELEMENT_SMCAPSYSBUT).left - cxFixedEdge; FillRect(hdc, &rcT, g_brushes[COLOR_INACTIVECAPTION]); rcT.right = rcT.left; rcT.left = temp; // start of actual caption
DrawCaptionTemp(NULL, hdc, &rcT, g_fonts[FONT_SMCAPTION].hfont, hicon, szFakeSmallCaption, DC_SMALLCAP | DC_ICON | DC_TEXT); DestroyIcon(hicon); DrawFrameControl(hdc, &RCZ(ELEMENT_SMCAPSYSBUT), DFC_CAPTION, DFCS_CAPTIONCLOSE); } #endif
//
// Active window
//
// Border
rcT = RCZ(ELEMENT_ACTIVEBORDER); DrawEdge(hdc, &rcT, EDGE_RAISED, BF_RECT | BF_ADJUST); MyDrawFrame(hdc, &rcT, g_brushes[COLOR_ACTIVEBORDER], (int)ncmTheme.iBorderWidth); MyDrawFrame(hdc, &rcT, g_brushes[COLOR_3DFACE], 1);
// Caption
rcT = RCZ(ELEMENT_ACTIVECAPTION); MyDrawBorderBelow(hdc, &rcT); // "clip" the caption title under the buttons
rcT.left = RCZ(ELEMENT_ACTIVESYSBUT2).left - cxFixedEdge;
FillRect(hdc, &rcT, g_brushes[g_bGradient ? COLOR_GRADIENTACTIVECAPTION : COLOR_ACTIVECAPTION]); rcT.right = rcT.left; rcT.left = RCZ(ELEMENT_ACTIVECAPTION).left; DrawCaptionTemp(NULL, hdc, &rcT, g_fonts[FONT_CAPTION].hfont, hiconLogo, szFakeActive, DC_ACTIVE | DC_ICON | DC_TEXT | (g_bGradient ? DC_GRADIENT : 0));
DrawFrameControl(hdc, &RCZ(ELEMENT_ACTIVESYSBUT1), DFC_CAPTION, DFCS_CAPTIONCLOSE); rcT = RCZ(ELEMENT_ACTIVESYSBUT2); rcT.right -= (rcT.right - rcT.left)/2; DrawFrameControl(hdc, &rcT, DFC_CAPTION, DFCS_CAPTIONMIN); rcT.left = rcT.right; rcT.right = RCZ(ELEMENT_ACTIVESYSBUT2).right; DrawFrameControl(hdc, &rcT, DFC_CAPTION, DFCS_CAPTIONMAX);
//
// Menu
//
// DrawMenuBarTemp(NULL, hdc, &rcT, hmenuFake, g_fonts[FONT_MENU].hfont);
// inits
SaveDC(hdc); // extra paranoid for changes here
rcT = RCZ(ELEMENT_MENUNORMAL); hfontOld = SelectObject(hdc, g_fonts[FONT_MENU].hfont); SetBkMode(hdc, TRANSPARENT);
// menu back color
FillRect(hdc, &rcT, g_brushes[COLOR_MENU]);
// ***DEBUG***
// normal text
rcT.right = RCZ(ELEMENT_MENUDISABLED).left; if (rcT.right > RCZ(ELEMENT_MENUNORMAL).right) rcT.right = RCZ(ELEMENT_MENUNORMAL).right; // det by caption width
SetTextColor(hdc, GetSysColor(COLOR_MENUTEXT)); rcT.right--; rcT.bottom--; // adjustment for DT positioning
DrawText(hdc, szFakeNormal, -1, (LPRECT)&rcT, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// disabled text
rcT = RCZ(ELEMENT_MENUDISABLED); if (rcT.right > RCZ(ELEMENT_MENUNORMAL).right) // two checks for really,
rcT.right = RCZ(ELEMENT_MENUNORMAL).right; if (rcT.left < RCZ(ELEMENT_MENUNORMAL).right) { // really big fonts
int iwidth, iheight;
rcT.right--; rcT.bottom--; // adjustment for DT positioning
iwidth = rcT.right-rcT.left; iheight = rcT.bottom-rcT.top;
DrawState(hdc, NULL, NULL, (LPARAM)(LPTSTR)szFakeDisabled, 0, rcT.left + (iwidth-(cxDisabledStr-cxAvgCharx2))/2, rcT.top + (iheight-cyDisabledStr)/2, iwidth, iheight, DST_TEXT | DSS_DISABLED); }
// selected rect back color
rcT = RCZ(ELEMENT_MENUSELECTED); if (rcT.right > RCZ(ELEMENT_MENUNORMAL).right) // two checks for really,
rcT.right = RCZ(ELEMENT_MENUNORMAL).right; if (rcT.left < RCZ(ELEMENT_MENUNORMAL).right) { // really big fonts
FillRect(hdc, &rcT, g_brushes[COLOR_HIGHLIGHT]);
// selected text
rcT.right--; rcT.bottom--; // adjustment for DT positioning
SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT)); DrawText(hdc, szFakeSelected, -1, (LPRECT)&rcT, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// refinish bottom of selection box
rcT.right++; rcT.bottom++; // readjustment back to FillRect()
MyDrawBorderBelow(hdc, &rcT); }
// clean up
if (hfontOld) SelectObject(hdc, hfontOld); RestoreDC(hdc, -1); // paranoid so restore
//
// Client area
//
rcT = RCZ(ELEMENT_WINDOW); DrawEdge(hdc, &rcT, EDGE_SUNKEN, BF_RECT | BF_ADJUST); FillRect(hdc, &rcT, g_brushes[COLOR_WINDOW]);
// window text
SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, g_rgb[COLOR_WINDOWTEXT]); TextOut(hdc, RCZ(ELEMENT_WINDOW).left + 2*cxFixedEdge, RCZ(ELEMENT_WINDOW).top + 2*cyFixedEdge, szFakeWindowText, lstrlen(szFakeWindowText));
//
// scroll bar
//
rcT = RCZ(ELEMENT_SCROLLBAR); //MyDrawFrame(hdc, &rcT, g_brushes[COLOR_3DSHADOW], 1);
//g_brushes[COLOR_SCROLLBAR]);
// jdk: they did this to get the brush used to paint the ctl background
// FillRect(hdc, &rcT, (HBRUSH)DefWindowProc(hWnd, WM_CTLCOLOR, (WPARAM)hdc, MAKELONG(hWnd, CTLCOLOR_SCROLLBAR)));
// ***DEBUG***
// will this work? or is this the thumb color? and why not MyDrawFrame()?
// seems to be a good approximation
FillRect(hdc, &rcT, g_brushes[COLOR_SCROLLBAR]);
DrawFrameControl(hdc, &RCZ(ELEMENT_SCROLLUP), DFC_SCROLL, DFCS_SCROLLUP); DrawFrameControl(hdc, &RCZ(ELEMENT_SCROLLDOWN), DFC_SCROLL, DFCS_SCROLLDOWN);
//
// MessageBox
//
rcT = RCZ(ELEMENT_MSGBOX); DrawEdge(hdc, &rcT, EDGE_RAISED, BF_RECT | BF_ADJUST); FillRect(hdc, &rcT, g_brushes[COLOR_3DFACE]);
rcT = RCZ(ELEMENT_MSGBOXCAPTION); MyDrawBorderBelow(hdc, &rcT); // "clip" the caption title under the buttons
rcT.left = RCZ(ELEMENT_MSGBOXSYSBUT).left - cxFixedEdge; FillRect(hdc, &rcT, g_brushes[g_bGradient ? COLOR_GRADIENTACTIVECAPTION : COLOR_ACTIVECAPTION]); rcT.right = rcT.left; rcT.left = RCZ(ELEMENT_MSGBOXCAPTION).left; DrawCaptionTemp(NULL, hdc, &rcT, g_fonts[FONT_CAPTION].hfont, hiconLogo, szFakeMsgBox, DC_ACTIVE | DC_ICON | DC_TEXT | (g_bGradient ? DC_GRADIENT : 0)); DrawFrameControl(hdc, &RCZ(ELEMENT_MSGBOXSYSBUT), DFC_CAPTION, DFCS_CAPTIONCLOSE);
// message box text
SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, g_rgb[COLOR_WINDOWTEXT]); hfontOld = SelectObject(hdc, g_fonts[FONT_MSGBOX].hfont); TextOut(hdc, RCZ(ELEMENT_MSGBOX).left + 3*cxFixedEdge, RCZ(ELEMENT_MSGBOXCAPTION).bottom + cyFixedEdge, szFakeMsgBoxText, lstrlen(szFakeMsgBoxText)); if (hfontOld) SelectObject(hdc, hfontOld);
//
// Button
//
rcT = RCZ(ELEMENT_BUTTON); DrawFrameControl(hdc, &rcT, DFC_BUTTON, DFCS_BUTTONPUSH);
// cpl code asks: ?????? what font should this use ??????
SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, g_rgb[COLOR_BTNTEXT]); DrawText(hdc, szFakeButton, -1, &rcT, DT_CENTER | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
//
// Cleanup
//
SetBkColor(hdc, rgbBk); SetBkMode(hdc, nMode); if (hiconLogo) DestroyIcon(hiconLogo); SetSysColorsTemp((COLORREF FAR *)NULL, (HBRUSH FAR *)NULL, (UINT_PTR)hOldColors); if (hpalOld) { SelectPalette(hdc, hpalOld, FALSE); RealizePalette(hdc); } RestoreDC(hdc, -1); // jdk: is this redundant to above cleanup?
}
//
// make the color a solid color if it needs to be.
// on a palette device make is a palette relative color, if we need to.
//
#define COLORFLAG_SOLID 0x0001
UINT g_colorFlags[MAX_COLORS] = { /* COLOR_SCROLLBAR */ 0, /* COLOR_DESKTOP */ 0, /* COLOR_ACTIVECAPTION */ COLORFLAG_SOLID, /* COLOR_INACTIVECAPTION */ COLORFLAG_SOLID, /* COLOR_MENU */ COLORFLAG_SOLID, /* COLOR_WINDOW */ COLORFLAG_SOLID, /* COLOR_WINDOWFRAME */ COLORFLAG_SOLID, /* COLOR_MENUTEXT */ COLORFLAG_SOLID, /* COLOR_WINDOWTEXT */ COLORFLAG_SOLID, /* COLOR_CAPTIONTEXT */ COLORFLAG_SOLID, /* COLOR_ACTIVEBORDER */ 0, /* COLOR_INACTIVEBORDER */ 0, /* COLOR_APPWORKSPACE */ 0, /* COLOR_HIGHLIGHT */ COLORFLAG_SOLID, /* COLOR_HIGHLIGHTTEXT */ COLORFLAG_SOLID, /* COLOR_3DFACE */ COLORFLAG_SOLID, /* COLOR_3DSHADOW */ COLORFLAG_SOLID, /* COLOR_GRAYTEXT */ COLORFLAG_SOLID, /* COLOR_BTNTEXT */ COLORFLAG_SOLID, /* COLOR_INACTIVECAPTIONTEXT */ COLORFLAG_SOLID, /* COLOR_3DHILIGHT */ COLORFLAG_SOLID, /* COLOR_3DDKSHADOW */ COLORFLAG_SOLID, /* COLOR_3DLIGHT */ COLORFLAG_SOLID, /* COLOR_INFOTEXT */ COLORFLAG_SOLID, /* COLOR_INFOBK */ 0 }; COLORREF NearestColor(int iColor, COLORREF rgb) { rgb &= 0x00FFFFFF;
//
// if we are on a palette device, we need to do special stuff...
//
if (bPalette) { if (g_colorFlags[iColor] & COLORFLAG_SOLID) { rgb = GetNearestPaletteColor(hpal3D, rgb) | RGB_PALETTE; } else { if (IsPaletteColor(hpal3D, rgb)) rgb |= RGB_PALETTE;
else if (IsPaletteColor(GetStockObject(DEFAULT_PALETTE), rgb)) rgb ^= 0x000001; // force a dither
} } else { // map color to nearest color if we need to for this UI element.
if (g_colorFlags[iColor] & COLORFLAG_SOLID) { HDC hdc = GetDC(NULL); rgb = GetNearestColor(hdc, rgb); ReleaseDC(NULL, hdc); } }
return rgb; }
COLORREF GetNearestPaletteColor(HPALETTE hpal, COLORREF rgb) { PALETTEENTRY pe; GetPaletteEntries(hpal, GetNearestPaletteIndex(hpal, rgb & 0x00FFFFFF), 1, &pe); return RGB(pe.peRed, pe.peGreen, pe.peBlue); }
BOOL IsPaletteColor(HPALETTE hpal, COLORREF rgb) { return GetNearestPaletteColor(hpal, rgb) == (rgb & 0xFFFFFF); }
// ------------------------ magic color utilities --------------------------
/*
** set a color in the 3D palette. */ void NEAR PASCAL Set3DPaletteColor(COLORREF rgb, int iColor) { int iPalette; PALETTEENTRY pe;
if (!hpal3D) return;
switch (iColor) { case COLOR_3DFACE: iPalette = 16; break; case COLOR_3DSHADOW: iPalette = 17; break; case COLOR_3DHILIGHT: iPalette = 18; break; default: return; }
pe.peRed = GetRValue(rgb); pe.peGreen = GetGValue(rgb); pe.peBlue = GetBValue(rgb); pe.peFlags = 0; SetPaletteEntries(hpal3D, iPalette, 1, (LPPALETTEENTRY)&pe); } // ------------end--------- magic color utilities --------------------------
// jdk: may need something like these to translate fonts ???
#if 0
void NEAR LF32toLF(LPLOGFONT_32 lplf32, LPLOGFONT lplf); void NEAR LFtoLF32(LPLOGFONT lplf, LPLOGFONT_32 lplf32); // ------------------------ manage system settings --------------------------
/*
** Helper Routine since USER's new METRICS structures are all 32-bit */ void NEAR LF32toLF(LPLOGFONT_32 lplf32, LPLOGFONT lplf) { lplf->lfHeight = (int) lplf32->lfHeight; lplf->lfWidth = (int) lplf32->lfWidth; lplf->lfEscapement = (int) lplf32->lfEscapement; lplf->lfOrientation = (int) lplf32->lfOrientation; lplf->lfWeight = (int) lplf32->lfWeight; *((LPCOMMONFONT) &lplf->lfItalic) = lplf32->lfCommon; } void NEAR LFtoLF32(LPLOGFONT lplf, LPLOGFONT_32 lplf32) { lplf32->lfHeight = (LONG)lplf->lfHeight; lplf32->lfWidth = (LONG)lplf->lfWidth; lplf32->lfEscapement = (LONG)lplf->lfEscapement; lplf32->lfOrientation = (LONG)lplf->lfOrientation; lplf32->lfWeight = (LONG)lplf->lfWeight; lplf32->lfCommon = *((LPCOMMONFONT) &lplf->lfItalic); }
/*
** Fill in a NONCLIENTMETRICS structure with latest preview stuff */ void NEAR GetMyNonClientMetrics(LPNONCLIENTMETRICS lpncm) { lpncm->iBorderWidth = (LONG)(int)ncmTheme.iBorderWidth; lpncm->iScrollWidth = lpncm->iScrollHeight = (LONG)(int)ncmTheme.iScrollWidth; lpncm->iCaptionWidth = lpncm->iCaptionHeight = (LONG)(int)ncmTheme.iCaptionHeight; lpncm->iSmCaptionWidth = lpncm->iSmCaptionHeight = (LONG)(int)ncmTheme.iSmCaptionHeight; lpncm->iMenuWidth = lpncm->iMenuHeight = (LONG)(int)ncmTheme.iMenuHeight; LFtoLF32(&(g_fonts[FONT_CAPTION].lf), &(lpncm->lfCaptionFont)); LFtoLF32(&(g_fonts[FONT_SMCAPTION].lf), &(lpncm->lfSmCaptionFont)); LFtoLF32(&(g_fonts[FONT_MENU].lf), &(lpncm->lfMenuFont)); LFtoLF32(&(g_fonts[FONT_STATUS].lf), &(lpncm->lfStatusFont)); LFtoLF32(&(g_fonts[FONT_MSGBOX].lf), &(lpncm->lfMessageFont)); } /*
** given a NONCLIENTMETRICS structure, make it preview's current setting */ void NEAR SetMyNonClientMetrics(LPNONCLIENTMETRICS lpncm) { (int)ncmTheme.iBorderWidth = (int)lpncm->iBorderWidth; (int)ncmTheme.iScrollWidth = (int)lpncm->iScrollWidth; (int)ncmTheme.iCaptionHeight = (int)lpncm->iCaptionHeight; (int)ncmTheme.iSmCaptionHeight = (int)lpncm->iSmCaptionHeight; (int)ncmTheme.iMenuHeight = (int)lpncm->iMenuHeight;
LF32toLF(&(lpncm->lfCaptionFont), &(g_fonts[FONT_CAPTION].lf)); LF32toLF(&(lpncm->lfSmCaptionFont), &(g_fonts[FONT_SMCAPTION].lf)); LF32toLF(&(lpncm->lfMenuFont), &(g_fonts[FONT_MENU].lf)); LF32toLF(&(lpncm->lfStatusFont), &(g_fonts[FONT_STATUS].lf)); LF32toLF(&(lpncm->lfMessageFont), &(g_fonts[FONT_MSGBOX].lf)); }
#endif
|