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.
|
|
/*
* prsht.c - Hacky property sheet code */
#include "tweakui.h"
/***************************************************************************
* * @doc INTERNAL * * @func Prsht_SkipDlgString | * * Skip a thing-that-might-be-a-string in a dialog template. * * It could be 0xFFFF, meaning that the next word is all. * Or it's a unicode string. * * Note that everything stays word-aligned, so we don't need * to worry about UNALIGNEDness. * ***************************************************************************/
LPWORD PASCAL Prsht_SkipDlgString(LPWORD pw) { if (*pw == 0xFFFF) { pw += 2; } else { while (*pw++) { /* Skip over the UNICODE string */ } } return pw; }
/***************************************************************************
* * @doc INTERNAL * * @func Prsht_PropertySheetCallback | * * We also want to force single-line tabs. We must do it * here so that the margins are set up correctly. (If we * wait until WM_INITDIALOG, then when we change to * single-line tabs, we get messed-up margins.) * * We need single-line tabs because multi-line tabs cause * our property sheet to be too large to fit on an 640x480 * screen. * * Do this only if we are running on a 640 x 480 display. * ***************************************************************************/
typedef struct DLGFINISH { WORD cdit; short x; short y; short cx; short cy; } DLGFINISH, *PDLGFINISH;
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;
typedef struct DLGITEMTEMPLATEEX { DWORD dwHelpID; DWORD dwExStyle; DWORD style; short x; short y; short cx; short cy; DWORD dwID; } DLGITEMTEMPLATEEX, *PDLGITEMTEMPLATEEX;
typedef struct DLGITEMCOORDS { short x; short y; short cx; short cy; } DLGITEMCOORDS, *PDLGITEMCOORDS;
WCHAR c_wszTabClass[] = WC_TABCONTROLW;
int CALLBACK Prsht_PropertySheetCallback(HWND hwnd, UINT pscb, LPARAM lp) { LPDLGTEMPLATE pdt; UINT idit; LPWORD pw; BOOL fEx; DWORD dwStyle; PDLGFINISH pdf;
hwnd;
switch (pscb) { case PSCB_PRECREATE:
if (GetSystemMetrics(SM_CYSCREEN) <= 480) { pdt = (LPDLGTEMPLATE)lp;
if (pdt->style == 0xFFFF0001) { PDLGTEMPLATEEX pdtex= (PDLGTEMPLATEEX)lp; fEx = 1; dwStyle = pdtex->style; pdf = (PDLGFINISH)&pdtex->cDlgItems; pw = (LPWORD)(pdtex+1); } else { fEx = 0; dwStyle = pdt->style; pdf = (PDLGFINISH)&pdt->cdit; pw = (LPWORD)(pdt+1); }
/*
* After the DLGTEMPLATE(EX) come three strings: * the menu, the class, and the title. */ pw = Prsht_SkipDlgString(pw); /* Menu */ pw = Prsht_SkipDlgString(pw); /* Class */ pw = Prsht_SkipDlgString(pw); /* Title */
/*
* Then the optional font. */ if (dwStyle & DS_SETFONT) { pw++; /* Font size */ if (fEx) { pw++; /* Font weight */ pw++; /* Font style and charset */ } pw = Prsht_SkipDlgString(pw); /* Font name */ }
/*
* Now walk the item list looking for the tab control. */ for (idit = 0; idit < pdf->cdit; idit++) { /* Round up to next dword; all aligned and happy again */ LPDLGITEMTEMPLATE pdit = (LPDLGITEMTEMPLATE)(((DWORD_PTR)pw + 3) & ~3); PDLGITEMTEMPLATEEX pditex = (PDLGITEMTEMPLATEEX)pdit; PDLGITEMCOORDS pdic;
if (fEx) { pw = (LPWORD)(pditex+1); } else { pw = (LPWORD)(pdit+1); }
/* Immediately after the pdit is the class name */ if (memcmp(pw, c_wszTabClass, cbX(c_wszTabClass)) == 0) {
LPDWORD pdwStyle;
/* Found it! Nuke the multiline style */ if (fEx) { pdwStyle = &pditex->style; pdic = (PDLGITEMCOORDS)&pditex->x; } else { pdwStyle = &pdit->style; pdic = (PDLGITEMCOORDS)&pdit->x; }
*pdwStyle &= ~TCS_MULTILINE;
break; }
/* Oh well, on to the next one */
pw = Prsht_SkipDlgString(pw); /* Class */ pw = Prsht_SkipDlgString(pw); /* Title */
pw = (LPWORD)((LPBYTE)pw + 2 + *pw); /* Goo */ } } break; } return 0; }
|