DIALOGEX Resource Template Differences from DIALOG TemplateLast reviewed: December 14, 1995Article ID: Q141201 |
The information in this article applies to:
SUMMARYWhen you create or modify a dialog template in memory, it is necessary to know the form of the DLGTEMPLATE and DLGITEMTEMPLATE structures. While these structures are well documented for DIALOG resources, they take a different form for DIALOGEX resources, and are not well documented in the SDK.
MORE INFORMATIONThe extended DLGTEMPLATE structure, call it DLGTEMPLATEEX, has this form: typedef struct tagDLGTEMPLATEEX{ WORD wDlgVer; // use 1 WORD wSignature; // use 0xFFFF DWORD dwHelpID; // Dialog's context help ID DWORD dwExStyle; // Extended style DWORD dwStyle; // Style WORD cDlgItems; // Number of controls in dialog short x; // Initial position, horizontal short y; // Initial position, vertical short cx; // Width short cy; // Height} DLGTEMPLATEEX; This is followed by menu name, class name, title, and font info if style includes DS_SETFONT, which have the same form as documented in the SDK for DLGTEMPLATE. The extended DLGITEMTEMPLATE structure, call it DLGITEMTEMPLATEEX, has this form: typedef struct tagDLGITEMTEMPLATEEX{ DWORD dwHelpID; // Context help ID for control DWORD dwExStyle; // Control extended styles DWORD dwStyle; // Style short x; // Initial position, horizontal short y; // Initial position, vertical short cx; // Width short cy; // Height DWORD dwID; // Window ID} DLGITEMTEMPLATEEX; This is followed by class name, title, and creation data for the control, which have the same form as documented in the SDK for DLGITEMTEMPLATE.
Code SampleThe following code creates a DIALOGEX resource in memory with a button and a custom control to which it passes creation data:
/* allocate some memory */pdlgtemplate = p = (PWORD) LocalAlloc (LPTR, 1000);
/* start to fill in the dlgtemplate information, addressing by WORDs */lStyle = DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU| DS_SETFONT; *p++ = 1; // DlgVer *p++ = 0xFFFF; // Signature *p++ = 0; // LOWORD HelpID *p++ = 0; // HIWORD HelpID *p++ = 0; // LOWORD (lExtendedStyle) *p++ = 0; // HIWORD (lExtendedStyle)*p++ = LOWORD (lStyle); *p++ = HIWORD (lStyle); *p++ = 2; // NumberOfItems *p++ = 210; // x *p++ = 10; // y *p++ = 100; // cx *p++ = 100; // cy *p++ = 0; // Menu *p++ = 0; // Class /* copy the title of the dialog */nchar = nCopyAnsiToWideChar (p, TEXT("Dialog")); p += nchar;
/* Font information because of DS_SETFONT */ *p++ = 18; // point sizenchar = nCopyAnsiToWideChar (p, TEXT("Times New Roman")); // Face name p += nchar;
/* make sure the first item starts on a DWORD boundary */p = lpwAlign (p);
/* now start with the first item */lStyle = BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP; *p++ = 0; // LOWORD (lHelpID) *p++ = 0; // HIWORD (lHelpID) *p++ = 0; // LOWORD (lExtendedStyle) *p++ = 0; // HIWORD (lExtendedStyle)*p++ = LOWORD (lStyle); *p++ = HIWORD (lStyle); *p++ = 10; // x *p++ = 60; // y *p++ = 80; // cx *p++ = 20; // cy *p++ = IDOK; // LOWORD (Control ID) *p++ = 0; // HOWORD (Control ID) /* fill in class i.d., this time by name */ char = nCopyAnsiToWideChar (p, TEXT("BUTTON"));p += nchar;
/* copy the text of the first item */nchar = nCopyAnsiToWideChar (p, TEXT("OK")); p += nchar; *p++ = 0; // advance pointer over nExtraStuff WORD
/* make sure the second item starts on a DWORD boundary */p = lpwAlign (p); lStyle = WS_VISIBLE | WS_CHILD; *p++ = 0; // LOWORD (lHelpID) *p++ = 0; // HIWORD (lHelpID) *p++ = 0; // LOWORD (lExtendedStyle) *p++ = 0; // HIWORD (lExtendedStyle)*p++ = LOWORD (lStyle); *p++ = HIWORD (lStyle); *p++ = 20; // x *p++ = 5; // y *p++ = 65; // cx *p++ = 45; // cy *p++ = 57; // LOWORD (Control ID) *p++ = 0; // HOWORD (Control ID) // The class name of the custom controlnchar = nCopyAnsiToWideChar (p, TEXT("ACustomControl")); p += nchar;
/* copy the text of the second item, null terminate the string. */nchar = nCopyAnsiToWideChar (p, TEXT("")); p += nchar; *p++ = 8; // number of bytes of extra data
*p++ = 0xA1; //extra data*p++ = 0xA2; *p++ = 0xA3; *p++ = 0xA4; DialogBoxIndirect (ghInst, (LPDLGTEMPLATE) pdlgtemplate, hwnd, (DLGPROC) About); LocalFree (LocalHandle (pdlgtemplate));
/////////////////////////////////////////////////////////////////////////// // //Helper routines taken from the WIN32SDK DYNDLG sample /////////////////////////////////////////////////////////////////////////// // //LPWORD lpwAlign ( LPWORD lpIn) { ULONG ul; ul = (ULONG) lpIn; ul +=3; ul >>=2; ul <<=2; return (LPWORD) ul;}
int nCopyAnsiToWideChar (LPWORD lpWCStr, LPSTR lpAnsiIn){ int nChar = 0; do { *lpWCStr++ = (WORD) *lpAnsiIn; nChar++; } while (*lpAnsiIn++); return nChar;}
REFERENCEFor further information on using Dialog templates, please see the SDK documentation for the DLGTEMPLATE and DLGITEMTEMPLATE structures.
|
Additional reference words: 4.00 kbinf
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |