Microsoft KB Archive/141201

{|
 * width="100%"|

INFO: DIALOGEX Resource Template Differences from DIALOG Template

 * }

Q141201

-

The information in this article applies to:


 * Microsoft Win32 Software Development Kit (SDK), used with:
 * Microsoft Windows NT Server version 3.51
 * Microsoft Windows NT Workstation version 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)

nchar = nCopyAnsiToWideChar (p, TEXT("BUTTON"));
 * Fill in class i.d., this time by name. */

/* 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; }