The evolution of dialog templates – 16-bit Extended Templates

Raymond Chen

The next step in the evolution of dialog templates is the Extended Dialog or DIALOGEX. First, let’s look at the 16-bit version.

The 16-bit extended dialog template is purely historical. The only operating systems to support it were the Windows 95/98/Me series. It is interesting only as a missing link in the evolution towards the 32-bit extended dialog template.

The basic rules are the same as for the non-extended template. The extended dialog template starts off with a different header:

WORD  wDlgVer;      // version number - always 1
WORD  wSignature;   // always 0xFFFF
DWORD dwHelpID;     // help ID
DWORD dwExStyle;    // window extended style
DWORD dwStyle;      // dialog style
BYTE  cItems;       // number of controls in this dialog
WORD  x;            // x-coordinate
WORD  y;            // y-coordinate
WORD  cx;           // width
WORD  cy;           // height

The first two fields specify a version number (so far, only version 1 extended dialogs have been defined), and a signature value 0xFFFF which allows this template to be distinguished from a non-extended dialog template.

Next come two new fields. The help identifier is an arbitrary 32-bit value that you can retrieve from the dialog later with the GetWindowContextHelpId function. The extended dialog style you’ve seen before.

As before, after the header come the strings. First comes the menu, then the class, then dialog title, all encoded the same way as with the non-extended template.

If the DS_SETFONT style is set, then a custom font exists in the template. The format of the font information is slightly different for extended templates. In classic templates, all you get is a WORD of point size and a font name. But in the extended template, the font information is a little richer:

WORD wPoint;        // point size
WORD wWeight;       // font weight
BYTE bItalic;       // 1 if italic, 0 if not
BYTE bCharSet;      // character set (see CreateFont)
CHAR szFontName[];  // variable-length

New fields are the weight, character set, and whether the font is italic.

After the header come the dialog item templates, each of which looks like this:

DWORD dwHelpID;     // help identifier
DWORD dwExStyle;    // window extended style
DWORD dwStyle;      // window style
WORD  x;            // x-coordinate (DLUs)
WORD  y;            // y-coordinate (DLUs)
WORD  cx;           // width (DLUs)
WORD  cy;           // height (DLUs)
DWORD wID;          // control ID
CHAR  szClassName[];// variable-length (possibly ordinal)
CHAR  szText[];     // variable-length (possibly ordinal)
WORD  cbExtra;      // amount of extra data
BYTE  rgbExtra[cbExtra]; // extra data follows (usually none)

This takes the classic item template and adds the following:

  • New dwHelpID and dwExStyle fields.
  • dwStyle field moved.
  • control ID expanded to DWORD.
  • cbExtra expanded to WORD.

Not that expanding the control ID to a 32-bit value accomplishes much in 16-bit Windows, but it’s there nonetheless.

And that’s all.

Now the obligatory annotated hex dump.

0000  01 00 FF FF 00 00 00 00-00 00 00 00 C4 00 C8 80  ................
0010  0B 24 00 2C 00 E6 00 5E-00 00 00 52 65 70 6C 61  .$.,...^...Repla
0020  63 65 00 08 00 90 01 00-00 4D 53 20 53 68 65 6C  ce.......MS Shel
0030  20 44 6C 67 00 00 00 00-00 00 00 00 00 00 00 02   Dlg............
0040  50 04 00 09 00 30 00 08-00 FF FF FF FF 82 46 69  P....0........Fi
0050  26 6E 64 20 77 68 61 74-3A 00 00 00 00 00 00 00  &nd what:.......
0060  00 00 00 00 80 00 83 50-36 00 07 00 72 00 0C 00  .......P6...r...
0070  80 04 00 00 81 00 00 00-00 00 00 00 00 00 00 00  ................
0080  00 00 02 50 04 00 1A 00-30 00 08 00 FF FF FF FF  ...P....0.......
0090  82 52 65 26 70 6C 61 63-65 20 77 69 74 68 3A 00  .Re&place with:.
00A0  00 00 00 00 00 00 00 00-00 00 80 00 83 50 36 00  .............P6.
00B0  18 00 72 00 0C 00 81 04-00 00 81 00 00 00 00 00  ..r.............
00C0  00 00 00 00 00 00 03 00-03 50 05 00 2E 00 68 00  .........P....h.
00D0  0C 00 10 04 00 00 80 4D-61 74 63 68 20 26 77 68  .......Match &wh
00E0  6F 6C 65 20 77 6F 72 64-20 6F 6E 6C 79 00 00 00  ole word only...
00F0  00 00 00 00 00 00 00 00-03 00 01 50 05 00 3E 00  ...........P..>.
0100  3B 00 0C 00 11 04 00 00-80 4D 61 74 63 68 20 26  ;........Match &
0110  63 61 73 65 00 00 00 00-00 00 00 00 00 00 00 01  case............
0120  00 03 50 AE 00 04 00 32-00 0E 00 01 00 00 00 80  ..P....2........
0130  26 46 69 6E 64 20 4E 65-78 74 00 00 00 00 00 00  &Find Next......
0140  00 00 00 00 00 00 00 03-50 AE 00 15 00 32 00 0E  ........P....2..
0150  00 00 04 00 00 80 26 52-65 70 6C 61 63 65 00 00  ......&Replace..
0160  00 00 00 00 00 00 00 00-00 00 00 03 50 AE 00 26  ............P..&
0170  00 32 00 0E 00 01 04 00-00 80 52 65 70 6C 61 63  .2........Replac
0180  65 20 26 41 6C 6C 00 00-00 00 00 00 00 00 00 00  e &All..........
0190  00 00 00 03 50 AE 00 37-00 32 00 0E 00 02 00 00  ....P..7.2......
01A0  00 80 43 61 6E 63 65 6C-00 00 00 00 00 00 00 00  ..Cancel........
01B0  00 00 00 00 00 03 50 AE-00 4B 00 32 00 0E 00 0E  ......P..K.2....
01C0  04 00 00 80 26 48 65 6C-70 00 00 00              ....&Help...

Once again, we start with the header.

0000  01 00         // wVersion
0002  FF FF         // wSignature
0004  00 00 00 00   // dwHelpID
0008  00 00 00 00   // dwExStyle
000C  C4 00 C8 80   // dwStyle
0010  0B            // cItems
0011  24 00 2C 00   // x, y
0015  E6 00 5E 00   // cx, cy

The header breaks down as follows:

wVersion = 0x0001 = 1
wSignature = 0xFFFF
dwHelpID = 0x00000000 = 0
dwExStyle = 0x00000000 = 0
dwStyle = 0x80C800C4 = WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK
cItems = 0x0B = 11
x = 0x0024 = 36
y = 0x002C = 44
cx = 0x00E6 = 230
cy = 0x005E = 94

Next come the menu name, class name, and dialog title:

0019  00            // no menu
001A  00            // default dialog class
001B  52 65 70 6C 61 63 65 00 // "Replace"

Same as the 16-bit classic template.

The presence of DS_SETFONT means that there’s font information ahead. This looks slightly different.

0023  08 00         // wSize = 8
0025  90 01         // wWeight = 0x02BC = 700 = FW_NORMAL
0027  00            // Italic
0028  00            // Character set = 0x00 = ANSI_CHARSET
0029  4D 53 20 53 68 65 6C 20 44 6C 67 00
                    // "MS Shell Dlg"

Now follow the extended dialog item templates. This should all be old hat by now, so I won’t go into detail.

// First control
0035  00 00 00 00   // dwHelpID
0039  00 00 00 00   // dwExStyle
003D  00 00 02 50   // dwStyle
0041  04 00 09 00   // x, y
0045  30 00 08 00   // cx, cy
0049  FF FF FF FF   // dwID
004D  82            // szClass = ordinal 0x82 = "static"
004E  46 69 26 6E 64 20 77 68 61 74 3A 00
                    // "Fi&nd what:"
005A  00 00         // no extra data
// Second control
005C  00 00 00 00   // dwHelpID
0060  00 00 00 00   // dwExStyle
0064  80 00 83 50   // dwStyle
0068  36 00 07 00   // x, y
006C  72 00 0C 00   // cx, cy
0070  80 04 00 00   // dwID
0074  81            // "edit"
0075  00            // ""
0076  00 00         // no extra data
// Third control
0078  00 00 00 00   // dwHelpID
007C  00 00 00 00   // dwExStyle
0080  00 00 02 50   // dwStyle
0084  04 00 1A 00   // x, y
0088  30 00 08 00   // cx, cy
008C  FF FF FF FF   // dwID
0090  82            // "static"
0091  52 65 26 70 6C 61 63 65 20 77 69 74 68 3A 00
                    // "Re&place with:"
00A0  00 00         // no extra data
// Fourth control
00A2  00 00 00 00   // dwHelpID
00A6  00 00 00 00   // dwExStyle
00AA  80 00 83 50   // dwStyle
00AE  36 00 18 00   // x, y
00B2  72 00 0C 00   // cx, cy
00B6  81 04 00 00   // dwID
00BA  81            // "edit"
00BB  00            // ""
00BC  00 00         // no extra data
// Fifth control
00BE  00 00 00 00   // dwHelpID
00C2  00 00 00 00   // dwExStyle
00C6  03 00 03 50   // dwStyle
00CA  05 00 2E 00   // x, y
00CE  68 00 0C 00   // cx, cy
00D2  10 04 00 00   // dwID
00D6  80            // "button"
00D7  4D 61 74 63 68 20 26 77 68 6F 6C 65 20 77
      6F 72 64 20 6F 6E 6C 79 00
                    // "Match &whole word only"
00EE  00 00         // no extra data
// Sixth control
00F0  00 00 00 00   // dwHelpID
00F4  00 00 00 00   // dwExStyle
00F8  03 00 01 50   // dwStyle
00FC  05 00 3E 00   // x, y
0100  3B 00 0C 00   // cx, cy
0104  11 04 00 00   // dwID
0108  80            // "button"
0109  4D 61 74 63 68 20 26 63 61 73 65 00
                    // "Match &case"
0115  00 00         // no extra data
// Seventh control
0117  00 00 00 00   // dwHelpID
011B  00 00 00 00   // dwExStyle
011F  01 00 03 50   // dwStyle
0123  AE 00 04 00   // x, y
0127  32 00 0E 00   // cx, cy
012B  01 00 00 00   // dwID
012F  80            // "button"
0130  26 46 69 6E 64 20 4E 65 78 74 00
                    // "&Find Next"
013B  00 00         // no extra data
// Eighth control
013D  00 00 00 00   // dwHelpID
0141  00 00 00 00   // dwExStyle
0145  00 00 03 50   // dwStyle
0149  AE 00 15 00   // x, y
014D  32 00 0E 00   // cx, cy
0151  00 04 00 00   // dwID
0155  80            // "button"
0156  26 52 65 70 6C 61 63 65 00
                    // "&Replace"
015F  00 00         // no extra data
// Ninth control
0161  00 00 00 00   // dwHelpID
0165  00 00 00 00   // dwExStyle
0169  00 00 03 50   // dwStyle
016D  AE 00 26 00   // x, y
0171  32 00 0E 00   // cx, cy
0175  01 04 00 00   // dwID
0179  80            // "button"
017A  52 65 70 6C 61 63 65 20 26 41 6C 6C 00
                    // "Replace &All"
0187  00 00         // no extra data
// Tenth control
0189  00 00 00 00   // dwHelpID
018D  00 00 00 00   // dwExStyle
0191  00 00 03 50   // dwStyle
0195  AE 00 37 00   // x, y
0199  32 00 0E 00   // cx, cy
019D  02 00 00 00   // dwID
01A1  80            // "button"
01A2  43 61 6E 63 65 6C 00
                    // "Cancel"
01A9  00 00         // no extra data
// Eleventh control
01AB  00 00 00 00   // dwHelpID
01AF  00 00 00 00   // dwExStyle
01B3  00 00 03 50   // dwStyle
01B7  AE 00 4B 00   // x, y
01BB  32 00 0E 00   // cx, cy
01BF  0E 04 00 00   // dwID
01C3  80            // "button"
01C4  26 48 65 6C 70 00
                    // "&Help"
01CA  00 00         // no extra data

The original dialog template is the one you’ve seen twice already, with only one change: The DIALOG keyword has been changed to DIALOGEX.

DIALOGEX 36, 44, 230, 94
...

Tomorrow, we reach the modern era with the 32-bit DIALOGEX template.

0 comments

Discussion is closed.

Feedback usabilla icon