none
新手学习windows程序设计有关创建无模态对话框的问题 RRS feed

  • 问题

  • 最近才学windows程序设计,看的是老版本的Charles Petzold的《windows程序设计》,书看的差不多了,想练练手,准备搞个简单的计算器,那本书上也有个,但我想弄个复杂点的、不一样的。
    我先写了一个框架代码,如下:
    #include <windows.h>
    #include "resource.h"

    LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM);
    BOOL CALLBACK AboutDlgProc(HWND , UINT , WPARAM , LPARAM);

    char szAppName[] ="Calculator";

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,INT iCmdShow)
    {
     HWND hwnd;
     MSG msg;
     WNDCLASS wndclass;

     wndclass.style                  =CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc            =WndProc;
     wndclass.cbWndExtra             =DLGWINDOWEXTRA;
     wndclass.cbClsExtra             =0;
     wndclass.hInstance              =hInstance;
     wndclass.hIcon                  =LoadIcon(hInstance,szAppName);
     wndclass.hCursor                =LoadCursor(NULL,IDC_ARROW);
     wndclass.hbrBackground          =(HBRUSH)(COLOR_BTNFACE+1);
     wndclass.lpszMenuName           =NULL;
     wndclass.lpszClassName          =szAppName;

     if(!RegisterClass(&wndclass))
     {
      MessageBox(NULL,"Error occurs!","Error",MB_OK | MB_ICONERROR);
      return 0;
     }

     hwnd=CreateDialog(hInstance,szAppName,0,NULL);

     ShowWindow(hwnd,iCmdShow);

     while(GetMessage(&msg,NULL,0,0))
     {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
     }

     return msg.wParam;

    }

    LRESULT CALLBACK WndProc(HWND hwnd ,UINT message,WPARAM wParam, LPARAM lParam)
    {
     switch(message)
     {
     case WM_CREATE:
      return 0;
     case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
     }

     return DefWindowProc(hwnd,message,wParam,lParam);
    }
    主要问题在资源描述性文件上,以前模态对话框是直接插入资源就行了,而这里要自己写资源描述性文件,以前对话框描述文件都是写在.rc文件里的,我尝试了,用CreateDialog创建对话框load不进去,加入断点发现CreateDialog时并没有发出WM_CREATE消息,所以断定是load时出错了,但描述性文件又没有错误,再参考一下书上的代码,发现它把对话框描述放在了一个.DLG文件里,然后在.rc文件里包含那个.dlg文件,在执行就可以了。我很郁闷这到底是为什么?
    请教!!
    我的对话框描述性文件如下:
    CALCULATOR DIALOG DISCARDABLE  0, 0, 120, 150
    STYLE WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
    CAPTION "Calculator"
    CLASS "Calculator"
    {
        EDITTEXT        0,10,5,100,15
    }

    2009年9月4日 23:50

答案

  • 书是错的,CreateDialog调用的是CreateWindowEx
    你的对话框模板怎么没有WS_VISIBLE


    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Tim Li 2009年9月11日 3:17
    2009年9月5日 13:20
    版主
  • 问题解决了,是在一个很小的细节上犯了错误,在资源描述文件中我原本多加了个MENU Calculator,我的本意是给窗口加个菜单的,但我菜单资源我还没写,所以在运行时引用资源时就出现问题了,因为压根就没有菜单资源,跟是否在.dlg中没关系。
    • 已标记为答案 Tim Li 2009年9月11日 3:17
    2009年9月6日 5:54

全部回复

  • CreateDialog不发WM_CREATE,CreateWindow才发.
    它发的是WM_INITDIALOG.
    0xBAADF00D
    2009年9月5日 4:51
    版主
  • 但是书上说,“这个CreateDialogue调用与对话框模板一起,被windows有效的转换为一个CreateWindow调用,与
    hwnd=CreateWindow("对话框名","标题",WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_MINIMIZEBOX,CW_USEDEFAULT,...,)等价”,
    而且在改过后加入断点后CreateDialog后可以发送WM_CREATE消息

    2009年9月5日 9:03
  • 书是错的,CreateDialog调用的是CreateWindowEx
    你的对话框模板怎么没有WS_VISIBLE


    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Tim Li 2009年9月11日 3:17
    2009年9月5日 13:20
    版主
  • CreateWindow和CreateWindowEx区别不是很大吧。
    因为是调用CreateWindow,WS_VISIBLE是可以不要的,因为下面的ShowWindow可以将窗口显示,效果相当于WS_VISIBLE

    2009年9月6日 2:44
  • 问题解决了,是在一个很小的细节上犯了错误,在资源描述文件中我原本多加了个MENU Calculator,我的本意是给窗口加个菜单的,但我菜单资源我还没写,所以在运行时引用资源时就出现问题了,因为压根就没有菜单资源,跟是否在.dlg中没关系。
    • 已标记为答案 Tim Li 2009年9月11日 3:17
    2009年9月6日 5:54