137 lines
3.7 KiB
C
137 lines
3.7 KiB
C
|
/*****************************************************************************
|
||
|
*
|
||
|
* 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;
|
||
|
}
|