INFO: DIALOGEX Resource Template Differences from DIALOG Template
ID: Q141201
|
The information in this article applies to:
-
Microsoft Win32 Software Development Kit (SDK), used with:
-
Microsoft Windows NT 3.51
-
Microsoft Windows 95
SUMMARY
When you create or modify a dialog box 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 INFORMATION
The 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 Sample
The 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 box. */
nchar = nCopyAnsiToWideChar (p, TEXT("Dialog"));
p += nchar;
/* Font information because of DS_SETFONT. */
*p++ = 18; // Point size
*p++ = FW_DONTCARE; // Weight
*p++ = MAKEWORD( FALSE, DEFAULT_CHARSET ); // italic flag and charset.
nchar = 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 control.
nchar = 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;
}
REFERENCES
For further information on using dialog templates, please see the SDK
documentation for the DLGTEMPLATE and DLGITEMTEMPLATE structures.
Additional query words:
4.00 kbinf
Keywords : kbcode kbNTOS351 kbWinOS95 kbDSupport
Version : WINDOWS:95
Platform : WINDOWS
Issue type : kbinfo