|
|
/*****************************************************************************
* * diqhack.c * * Property sheet hacks. * * COMMCTRL's property sheet manager assume that all property sheet * pages use "MS Shell Dlg" as their font. We might not (especially * in Japan), so we need to touch up our dialog dimensions so that * when COMMCTRL computes page dimensions, it comes out okay again. * *****************************************************************************/
#include "diquick.h"
/*****************************************************************************
* * Diq_HackPropertySheets * * hdlg - a sample dialog box whose font is the one we are actually * using. * *****************************************************************************/
#pragma BEGIN_CONST_DATA
#define EMIT_IDD(idd, fn) idd
UINT c_rgidd[] = { EACH_PROPSHEET(EMIT_IDD) };
typedef struct DLGTEMPLATEEX { WORD wDlgVer; WORD wSignature; DWORD dwHelpID; DWORD dwExStyle; DWORD style; WORD cDlgItems; short x; short y; short cx; short cy; } DLGTEMPLATEEX, *PDLGTEMPLATEEX;
INT_PTR INTERNAL Diq_HackPropertySheets(HWND hdlg) { LOGFONT lf; HFONT hfShell, hfDlg, hfOld; HDC hdc; TEXTMETRIC tmDlg, tmShell; BOOL fRc = TRUE; int idlg;
hdc = GetDC(hdlg);
if( hdc == NULL ) { return FALSE; } /*
* For comparison purposes, we need "MS Shell Dlg" at 8pt. * * On Windows NT, "MS Shell Dlg" is a real font. * On Windows 95, it's a fake font that is special-cased by * the dialog manager. So first try to create it for real. * If that fails, then create it for fake. */
ZeroX(lf); lf.lfHeight = -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); lf.lfWeight = FW_NORMAL; lf.lfCharSet = DEFAULT_CHARSET; lstrcpy(lf.lfFaceName, TEXT("MS Shell Dlg")); hfShell = CreateFontIndirect(&lf); if (hfShell == 0) { lstrcpy(lf.lfFaceName, TEXT("MS Sans Serif")); hfShell = CreateFontIndirect(&lf); if (hfShell == 0) { fRc = FALSE; goto done; } }
hfDlg = GetWindowFont(hdlg); if (hfDlg == 0) { hfDlg = GetStockObject(SYSTEM_FONT); }
hfOld = SelectFont(hdc, hfDlg); GetTextMetrics(hdc, &tmDlg); SelectFont(hdc, hfShell); GetTextMetrics(hdc, &tmShell); SelectFont(hdc, hfOld); DeleteObject(hfShell);
/*
* Now adjust all the property sheet page dimensions so that * when COMMCTRL tries to adjust them, the two adjustments cancel * out and everybody is happy. */ for (idlg = 0; idlg < cA(c_rgidd); idlg++) { HRSRC hrsrc = FindResource(g_hinst, (PV)(UINT_PTR)c_rgidd[idlg], RT_DIALOG); if (hrsrc) { HGLOBAL hglob = LoadResource(g_hinst, hrsrc); if (hglob) { LPDLGTEMPLATE ptmp = LockResource(hglob); if (ptmp) { short *psi; DWORD dwScratch;
if (ptmp->style == 0xFFFF0001) { PDLGTEMPLATEEX pdex = (PV)ptmp; psi = &pdex->cx; } else { psi = &ptmp->cx; }
VirtualProtect(psi, 2 * sizeof(short), PAGE_READWRITE, &dwScratch);
psi[0] = (short)MulDiv(psi[0], tmDlg.tmAveCharWidth, tmShell.tmAveCharWidth); psi[1] = (short)MulDiv(psi[1], tmDlg.tmHeight, tmShell.tmHeight); } } } }
done:; ReleaseDC(hdlg, hdc);
return fRc; }
|