Reputation: 31
Hello I'm attempting to learn how to create Windows Apps using the WIN32 API. To this end I am going through The Forgers Tutorial on the subject. I am stuck at trying to get my first dialog box to show up when my menu item is clicked. I have checked out the MSDN site and looked at the documentation on all relevant functions in my code and everything APPEARS correct TO ME. But, of course, I don't know because I'm just learning I wonder if anyone can point out my error or perhaps point me in the direction of what I may be missing in the documentation. I'm sure that it's something really dumb (as it always is with these things) at any rate here's my little script. Hopefully any of you can help. Thanks
#include <windows.h>
#include "resource.h"
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
{
HMENU hMenu, hSubMenu, hOtherMenu, hOtherSubMenu;
hMenu = CreateMenu();
hSubMenu = CreatePopupMenu();
hOtherMenu = CreateMenu();
hOtherSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File");
AppendMenu(hSubMenu, MF_STRING, ID_STUFF, "S&tuff");
AppendMenu(hOtherSubMenu, MF_STRING,ID_OTHER_SUB, "O&ther");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hOtherSubMenu, "&Other");
SetMenu(hwnd, hMenu);
//SetMenu(hwnd, hOtherMenu);
}
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "this is my program", "program box", 0);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_STUFF:
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), hwnd, AboutDlgProc);
break;
case ID_FILE_EXIT:
PostQuitMessage(0);
break;
}
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hwnd, IDOK);
break;
case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
this is the .rc
#include "resource.h"
#include <windows.h>
IDR_MYMENU MENU
BEGIN
POPUP "F&ile"
BEGIN
MENUITEM "E&xit", ID_FILE_EXIT
MENUITEM "stuff I like", ID_STUFF
END
END
IDD_ABOUT DIALOG DISCARDABLE 0,0,239,66
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About Box"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "&ok", IDOK, 174,18,50,14
PUSHBUTTON "&Cancel", IDCANCEL, 174,18,50,14
GROUPBOX "About this program...",IDC_STATIC,7,7,225,52
CTEXT "This is a Modular Database program", IDC_STATIC, 16,18,144,33
END
and this is the header for the .rc
#define IDR_MYMENU 101
#define ID_FILE_EXIT 4001
#define ID_STUFF 4002
#define IDC_STATIC -1
#define IDD_ABOUT 102
#define ID_OTHER_SUB 4003
P.S. I am a first time poster to any forum at all so I apologize if I didn't get the code in clearly please just let me know Thanks again!
Upvotes: 3
Views: 5804
Reputation: 1844
i think you didn't add resource.h
and recource.rc
to your project.
if you don't add them your project will compile but dialog-box will not shown.
I compiled your code and it worked fine.
i use mingw4.7 and devc++ IDE.
Upvotes: 1