Why can't I create my dialog box? Rookie mistake #1
Each dialog box resource is specified either by an integer ordinal or by a string name. But a simple typo will turn one into the other.
#define DLG_OPEN 1 #define DLG_WARN_REMOVEABLE 2 DLG_OPEN DIALOG 32, 32, 267, 73 ... BEGIN ... END DLG_WARN_REMOVABLE DIALOG 32, 32, 267, 73 ... BEGIN ... END DialogBox(hInstance, TEXT("DLG_OPEN"), hwnd, OpenDialogProc); DialogBox(hInstance, MAKEINTRESOURCE(DLG_WARN_REMOVEABLE), hwnd, WarnRemoveableDialogProc);
Do you see the two “classic rookie mistakes”?
It may be easier to spot if you take the resource file and send it through the preprocessor first:
1 DIALOG 32, 32, 267, 73 ... BEGIN ... END DLG_WARN_REMOVABLE DIALOG 32, 32, 267, 73 ... BEGIN ... END
The first call to
TEXT("DLG_OPEN") as the resource name.
But notice that there is no resource with that name.
The preprocessor turned
thanks to the line
#define DLG_OPEN 1 in the header file.
Therefore, the call to
since there is no dialog box named
The dialog box you want goes by the integer name 1.
DialogBox(hInstance, MAKEINTRESOURCE(DLG_OPEN), hwnd, OpenDialogProc);
The second mistake is more subtle.
Notice that the name of the second dialog is spelled inconsistently.
The header file calls it
DLG_WARN_REMOVEABLE, but the
resource file calls it
As a result, the preprocessor macro is not invoked,
and the result is a dialog that goes by the string name
However, the code asks for
which doesn’t exist.
To fix the second issue, you first have to decide what you really wanted. You probably wanted an integer dialog resource, in which case the fix is to correct the resource file:
DLG_WARN_REMOVEABLE DIALOG 32, 32, 267, 73
On the other hand, if you really wanted the dialog box to be a named resource (note: this is extremely rare), then you need to request it by name:
DialogBox(hInstance, TEXT("DLG_WARN_REMOVABLE"), hwnd, WarnRemoveableDialogProc);
We’ll look at a few more “rookie mistakes” over the next couple of days.