最近才学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
}

解决方案 »

  1.   

    对话框描述放在了一个.DLG文件里只是为了方便管理维护而已。实际上和直接写在rc文件中没什么两样。
      

  2.   

    但是直接写在.rc文件中就无法创建对话框,CreateDialog时无法发送WM_CREATE消息
      

  3.   

    char szAppName[] ="Calculator"; 把这个改成下面这样试试。TCHAR szAppName[] =TEXT("Calculator"); 
      

  4.   

    TCHAR和char有关系吗?只是一个ascII码,一个Unicode
      

  5.   

    现在学的不是MFC,是win32 Application
      

  6.   

    问题出在这里hwnd=CreateDialog(hInstance,szAppName,0,NULL); 第二个参数是对话框模板,就是说必须是 主对话框资源ID.
    hwnd=CreateDialog(hInstance,INITRESOURCE(IDD_DIALOG),0,NULL); IDD_DIALOG改成你的对话框ID
      

  7.   

    对话框ID和对话框名称都是可以的,如果是ID可以用MAKEINTRESOURCE(ID)转化,问题不是出在这里,上面的代码没有任何问题,是出在对话框资源描述的引用上,希望各位可以自己测试下,把上面的对话框描述代码放在.rc文件中以及放在.dlg中,比较一下就可知了
      

  8.   

    资源模板文件,资源文件可以使用资源编辑器来编辑
    资源模板文件,是给创建对话框的函数使用的
    比如这两个函数
    HWND CreateDialog(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);
    int DialogBox(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);第二个参数就是资源的ID号具体参考
    http://baike.baidu.com/view/1079962.htm
    http://baike.baidu.com/view/1079950.htm
      

  9.   

    主要问题在资源描述性文件上,以前模态对话框是直接插入资源就行了,而这里要自己写资源描述性文件,以前对话框描述文件都是写在.rc文件里的,我尝试了,用CreateDialog创建对话框load不进去,加入断点发现CreateDialog时并没有发出WM_CREATE消息,所以断定是load时出错了,但描述性文件又没有错误,再参考一下书上的代码,发现它把对话框描述放在了一个.DLG文件里,然后在.rc文件里包含那个.dlg文件,在执行就可以了。我很郁闷这到底是为什么? 
    =======================================
    RC文件并不是手工写的,而是用VC里面的资源编辑器画出来的,不管是SDK还是MFC在这一点上是相同的.
      

  10.   

    一般的用法是这样的,用资源编辑器画好对话框,假设ID为IDD_DIALOG1,在调用时写作:
    hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,NULL); 
    就行了,当然你这个有点特殊,你是将对话框当作类来用的,还要在rc文件中加入CLASS "Calculator" 
    我试了你的代码,如果改成上面的样子,就没有问题了.
      

  11.   


    第二个参数不是ID号,是一个指向字符串指针,如果是ID号,需要用MAKEINTRESOURCE(ID)转换成字符串指针
      

  12.   

    win32程序和MFC还是有所区别的,MFC中基本上是用ID号,而win32中用资源名字来引用资源会比较方便,所以我也是按照书上所说用资源名字来引用资源。
    还有我原来在.rc文件中加入Class "Calculator"了,上面写了
      

  13.   

    编写是可以的,一般都是先画好,然后再以文本的方式打开进行适当的修改,一般对于对话框,我们还是用ID作为模板名用得多,而用字符串用得少,加上MAKEINTRESOURCE用起来不会产生混淆。刚才他仔细地看了你的代码,其实,你的用法没有错,不过有一个很小的细节造成最后对话框没有显示出来,你char szAppName[] ="Calculator"; 和RC文件中的对话框模板名并不是一样。RC文件中是这样的:CALCULATOR
      

  14.   

    我已经找到我的问题所在了,本来我打算加个菜单的,不过那时没写,但还是在.rc中对话框描述时添了个MENU Calculator,所以运行的时候对话框引用出现了问题,而后来放在.dlg中时发现没有菜单就把它删掉了,运行就OK了,这是个很小的细节,把我糊涂了好久,所以跟是否在.dlg中没什么关系,感谢各位的鼎力相助。
    但是发现上面也有很多问题,大家多讨论讨论也不错的