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.
131 lines
3.4 KiB
131 lines
3.4 KiB
#include "pch.h"
|
|
|
|
#pragma pack(push, 2)
|
|
typedef struct tagDLGTEMPLATEEX {
|
|
WORD dlgVer;
|
|
WORD signature;
|
|
DWORD helpID;
|
|
DWORD exStyle;
|
|
DWORD style;
|
|
WORD cDlgItems;
|
|
short x;
|
|
short y;
|
|
short cx;
|
|
short cy;
|
|
} DLGTEMPLATEEX, *PDLGTEMPLATEEX;
|
|
typedef const DLGTEMPLATEEX* PCDLGTEMPLATEEX;
|
|
#pragma pack(pop)
|
|
|
|
BOOL loadDialogTemplate (HINSTANCE hinstDlg, UINT nID, PVOID *ppvDT, PDWORD pcbDT);
|
|
|
|
|
|
HRESULT PrepareDlgTemplate(HINSTANCE hInst, UINT nDlgID, DWORD dwStyle, PVOID *ppvDT)
|
|
{
|
|
PCDLGTEMPLATEEX pdt2;
|
|
LPCDLGTEMPLATE pdt; // for some weird reason there is no PCDLGTEMPLATE
|
|
PVOID pvDlg;
|
|
HRESULT hr;
|
|
DWORD cbDlg;
|
|
BOOL fResult;
|
|
|
|
//----- Initialization and parameter validation -----
|
|
if (hInst == NULL || nDlgID == 0)
|
|
return E_INVALIDARG;
|
|
|
|
if (ppvDT == NULL)
|
|
return E_POINTER;
|
|
*ppvDT = NULL;
|
|
|
|
//----- Resource allocation -----
|
|
fResult = loadDialogTemplate(hInst, nDlgID, &pvDlg, &cbDlg);
|
|
if (!fResult)
|
|
return E_FAIL;
|
|
|
|
*ppvDT = CoTaskMemAlloc(cbDlg);
|
|
if (*ppvDT == NULL)
|
|
return E_OUTOFMEMORY;
|
|
ZeroMemory(*ppvDT, cbDlg);
|
|
CopyMemory(*ppvDT, pvDlg, cbDlg);
|
|
hr = S_OK;
|
|
|
|
//----- Parse through Dialog Template -----
|
|
UINT nStyleOffset;
|
|
|
|
pdt = NULL;
|
|
pdt2 = (PCDLGTEMPLATEEX)pvDlg; // assume extended style
|
|
|
|
if (pdt2->signature == 0xFFFF) {
|
|
if (pdt2->dlgVer != 1)
|
|
return E_UNEXPECTED; // Chicago sanity check
|
|
|
|
nStyleOffset = (UINT) ((PBYTE)&pdt2->style - (PBYTE)pdt2);
|
|
}
|
|
else {
|
|
pdt = (LPCDLGTEMPLATE)pvDlg;
|
|
pdt2 = NULL;
|
|
|
|
nStyleOffset = (UINT) ((PBYTE)&pdt->style - (PBYTE)pdt);
|
|
}
|
|
|
|
// let party on it now, style is DWORD
|
|
|
|
// BUGBUG: (andrewgu) the code below regarding to styles was figured out by experement. if you
|
|
// can't understand it just believe in it and pray that it works. the idea is to preserve
|
|
// extended style bits from the old style if new style doesn't have any. on the other hand, if
|
|
// the new style has extended bits in it, i assume the caller knows what he's doing and i let
|
|
// it through.
|
|
PDWORD pdwOldStyle;
|
|
DWORD dwNewStyle;
|
|
|
|
pdwOldStyle = (PDWORD)((PBYTE)*ppvDT + nStyleOffset);
|
|
dwNewStyle = dwStyle;
|
|
if (dwNewStyle == 0)
|
|
dwNewStyle = WS_CHILD | DS_CONTROL;
|
|
|
|
if ((dwNewStyle & 0x0000FFFF) == 0)
|
|
dwNewStyle |= *pdwOldStyle & 0x0000FFFF;
|
|
|
|
*pdwOldStyle = dwNewStyle;
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Implementation helpers routines (private)
|
|
|
|
BOOL loadDialogTemplate(HINSTANCE hinstDlg, UINT nID, PVOID *ppvDT, PDWORD pcbDT)
|
|
{
|
|
PVOID p;
|
|
HANDLE h;
|
|
|
|
if (hinstDlg == NULL)
|
|
return FALSE;
|
|
|
|
if (ppvDT == NULL)
|
|
return FALSE;
|
|
*ppvDT = NULL;
|
|
|
|
if (pcbDT == NULL)
|
|
return FALSE;
|
|
*pcbDT = 0;
|
|
|
|
h = FindResource(hinstDlg, MAKEINTRESOURCE(nID), RT_DIALOG);
|
|
if (h == NULL)
|
|
return FALSE;
|
|
|
|
*pcbDT = SizeofResource(hinstDlg, (HRSRC)h);
|
|
if (*pcbDT == 0)
|
|
return FALSE;
|
|
|
|
h = LoadResource(hinstDlg, (HRSRC)h);
|
|
if (h == NULL)
|
|
return FALSE;
|
|
|
|
p = LockResource(h);
|
|
if (p == NULL)
|
|
return FALSE;
|
|
|
|
*ppvDT = p;
|
|
return TRUE;
|
|
}
|