Introduction to Dialogs
Dialogs
known officially as dialog boxes
are
popup windows which are created from dialog
templates. The use of templates simplify the creation of
windows containing controls. The predefined window procedure for
a dialog also gives you a standard set of keyboard navigation
functions.
Back to Win32 ASM Page
Modal and modeless dialogs
Dialog boxes can be either modal or
modeless.
A modal dialog disables its owner window and
consequently
its owner's child windows. It also executes its own
message loop
commandeering the thread
until the dialog is
terminated. Although the dialog owner won't receive mouse- or
keyboard-generated messages
it can accept and process messages
sent to it by other means.
A modeless dialog acts like any other popup window.
Creating a dialog box
A modal dialog box is created with either DialogBoxParam or
DialogBoxIndirectParam. A modeless dialog box is created with
either CreateDialogParam and CreateDialogIndirectParam. (If
you've been writing Win32 in C or C++
surprise!--windows.h uses
macros to convert the other dialog creation functions into these
forms.)
These functions load a dialog template
the "direct" version
loads from the resource section of an EXE or DLL file
the
indirect version from memory.
The dialog procedure
Each dialog is created with the dialog window class (it's called
#32770). The window procedure of this class calls an application
supplied dialog procedure to handle its messages.
When a dialog is first being created
the window procedure
creates the dialog and all of the controls
and then calls the
dialog procedure with the WM_INITDIALOG message. In addition to
further dialog initialization
the dialog procedure should
respond to this message by returning nonzero (TRUE) if the
default of setting the focus to the first control is desired.
For most messages
the dialog procedure will return nonzero
(TRUE) if the given message was processed. If a message requires
a return value
SetWindowLong should be used to set the
DWL_MSGRESULT field in the dialog's (internal) window structure.
There are a few exceptions that were created before MS got
wise. Instead of a "processed?" status
the following messages
expect the dialog procedure to return values:
WM_CTLCOLORxxxxx
WM_COMPAREITEM
WM_VKEYTOITEM
WM_CHARTOITEM
WM_QUERYDRAGICON
If the dialog box is modal
EndDialog will terminate the
dialog.
If the dialog box is modeless
DestroyWindow will terminate the
dialog.
Communicating with the dialog
box
The dialog box procedure is where the dialog box communicates
with its controls. But how do we get the data to and from the
dialog box?
One solution is to use global memory
that is
letting the
dialog box directly access fixed locations (e.g.
in the .data
segment). Many people dislike this solution. This is bad if you
want to have more than one instance of a particular dialog --
like the property pages that you can pop up all over Win95.
The common dialogs use a different solution -- an information
structure. The address of an information structure
which can be
allocated anywhere in memory (global
stack
or heap)
is passed
to the dialog box when it is created. It can include starting
values
which the dialog box can use to initialize its controls.
The dialog box can fill in fields
in the information structure
by querying its controls or as a response to control
notifications. After the dialog box is terminated
the
application can use the captured information. The dialog box
creation functions have a parameter argument that
can be used for this purpose. This argument becomes the lParam of
the WM_INITDIALOG message.
Keyboard navigation
A modal dialog will automatically handle keyboard navigation.
To make a modeless dialog handle keyboard navigation
call
IsDialogMessage in the message loop. If it processes a keyboard
message
the function returns nonzero (TRUE)
and the rest of the
message loop should be skipped.
Creating a dialog template with a
resource compiler
Dialog editors are the preferred way of creating
dialog boxes. They simplify sizing and placement of controls.
They may be part of a suite of resource editors.
Resource editors
such as dialog editors
may produce text files
that can be compiled by a resource compiler. The
result of the resource compiler can then be included in an EXE or
DLL file as a resource.
The resource compiler will produce dialog templates for
inclusion as resources. The dialog box functions can then access
the dialog templates by name or by resource number.
Creating a dialog template in memory
without a resource compiler
It's also possible to build a dialog template in memory and use
the indirect dialog box functions to create dialogs.
The dialog template is an "internal" format
and because the
Win32 version was first implemented in NT
all strings that it
uses must be in Unicode. This is in spite of the fact that there
are two entry points (A and W) for the indirect functions.
The following is the extended Win95 dialog template. Check the
SDK documentation for the old NT dialog template. (Win95 can
handle the old dialog template.)
The Win95 dialog template is divided into three parts: the
header
an optional font item
and a sequence of dialog
items.
The header contains a fixed-size section followed by three
variable-sized fields.
DLGTEMPLATEEX STRUC ; the header
dlttex_wDlgVer DW 1 ; overlays old dltt_style
dlttex_Signature DW 0FFFFh ; overlays old dltt_style
dlttex_HelpID DD ?
dlttex_ExStyle DD ?
dlttex_style DD ?
dlttex_cDlgItems DW ? ; number of dialog items
dlttex_x DW ? ; location of top left corner
dlttex_y DW ?
dlttex_cx DW ? ; size
dlttex_cy DW ?
DLGTEMPLATEEX ENDS
The three variable-sized fields are the menu
class
and
title. The first word of each field has special meaning. If it's
not one of the special values
it's the first character of a zero
terminated Unicode string.
Menu: 0000h = no menu
0FFFFh = next word is menu id
Class: 0000h = standard dialog class
0FFFFh = next word is
window class atom
Title: 0000h = no title
The font item exists only if dlttex_style contains
DS_SETFONT.
The font item has a fixed-size section followed by the font name
in zero terminated Unicode.
FONTINFOEX STRUC
dfont_PointSize DW ?
dfont_Weight DW ? ; FW_ constants
dfont_Italic DW ? ; TRUE or FALSE
FONTINFOEX ENDS
The final section is the sequence (list) of dialog items. Each
dialog item has a fixed-size section followed by three
variable-sized fields.
DLGITEMTEMPLATEEX STRUC
dlitex_HelpID DD ?
dlitex_ExStyle DD ?
dlitex_Style DD ?
dlitex_x DW ? ; location of top left corner
dlitex_y DW ?
dlitex_cx DW ? ; size
dlitex_cy DW ?
dlitex_id DD ? ; control ID
DLGITEMTEMPLATEEX ENDS
The three variable-sized fields are the class
title
and
creation data. The first word of each field has special meaning.
If it's not one of the special values
it's the first character
of a zero terminated Unicode string.
Class: 0000h = standard dialog class
0FFFFh = next word
is window class atom
Title: 0000h = no title
Creation data: the first word is byte count of actual creation
data which follows immediately