新手学习windows程序设计碰到对话框资源描述问题

bill_chuang 2009-09-05 07:52:33
最近才学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
}
...全文
212 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Five_Cent_Nicol 2009-09-06
  • 打赏
  • 举报
回复
资源模板文件,资源文件可以使用资源编辑器来编辑
资源模板文件,是给创建对话框的函数使用的
比如这两个函数
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
MoXiaoRab 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bill_chuang 的回复:]
TCHAR和char有关系吗?只是一个ascII码,一个Unicode
[/Quote]
这句话就是错的
bill_chuang 2009-09-06
  • 打赏
  • 举报
回复
对话框ID和对话框名称都是可以的,如果是ID可以用MAKEINTRESOURCE(ID)转化,问题不是出在这里,上面的代码没有任何问题,是出在对话框资源描述的引用上,希望各位可以自己测试下,把上面的对话框描述代码放在.rc文件中以及放在.dlg中,比较一下就可知了
bill_chuang 2009-09-06
  • 打赏
  • 举报
回复
我已经找到我的问题所在了,本来我打算加个菜单的,不过那时没写,但还是在.rc中对话框描述时添了个MENU Calculator,所以运行的时候对话框引用出现了问题,而后来放在.dlg中时发现没有菜单就把它删掉了,运行就OK了,这是个很小的细节,把我糊涂了好久,所以跟是否在.dlg中没什么关系,感谢各位的鼎力相助。
但是发现上面也有很多问题,大家多讨论讨论也不错的
wltg2001 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bill_chuang 的回复:]
引用 11 楼 wltg2001 的回复:
RC文件并不是手工写的,而是用VC里面的资源编辑器画出来的,不管是SDK还是MFC在这一点上是相同的.


RC文件一般的确是用资源编辑器绘制,但是有些东西资源编辑器不太好画的,可以自己按照资源描述的语法自己编写资源描述文件来创造自己特制的资源的
[/Quote]
编写是可以的,一般都是先画好,然后再以文本的方式打开进行适当的修改,一般对于对话框,我们还是用ID作为模板名用得多,而用字符串用得少,加上MAKEINTRESOURCE用起来不会产生混淆。

刚才他仔细地看了你的代码,其实,你的用法没有错,不过有一个很小的细节造成最后对话框没有显示出来,你char szAppName[] ="Calculator"; 和RC文件中的对话框模板名并不是一样。RC文件中是这样的:CALCULATOR
bill_chuang 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wltg2001 的回复:]
一般的用法是这样的,用资源编辑器画好对话框,假设ID为IDD_DIALOG1,在调用时写作:
hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,NULL);
就行了,当然你这个有点特殊,你是将对话框当作类来用的,还要在rc文件中加入CLASS "Calculator"
我试了你的代码,如果改成上面的样子,就没有问题了.
[/Quote]
win32程序和MFC还是有所区别的,MFC中基本上是用ID号,而win32中用资源名字来引用资源会比较方便,所以我也是按照书上所说用资源名字来引用资源。
还有我原来在.rc文件中加入Class "Calculator"了,上面写了
bill_chuang 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wltg2001 的回复:]
RC文件并不是手工写的,而是用VC里面的资源编辑器画出来的,不管是SDK还是MFC在这一点上是相同的.
[/Quote]

RC文件一般的确是用资源编辑器绘制,但是有些东西资源编辑器不太好画的,可以自己按照资源描述的语法自己编写资源描述文件来创造自己特制的资源的
bill_chuang 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 five_cent_nicol 的回复:]
资源模板文件,资源文件可以使用资源编辑器来编辑
资源模板文件,是给创建对话框的函数使用的
比如这两个函数
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
[/Quote]

第二个参数不是ID号,是一个指向字符串指针,如果是ID号,需要用MAKEINTRESOURCE(ID)转换成字符串指针
wltg2001 2009-09-06
  • 打赏
  • 举报
回复
一般的用法是这样的,用资源编辑器画好对话框,假设ID为IDD_DIALOG1,在调用时写作:
hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,NULL);
就行了,当然你这个有点特殊,你是将对话框当作类来用的,还要在rc文件中加入CLASS "Calculator"
我试了你的代码,如果改成上面的样子,就没有问题了.
wltg2001 2009-09-06
  • 打赏
  • 举报
回复
主要问题在资源描述性文件上,以前模态对话框是直接插入资源就行了,而这里要自己写资源描述性文件,以前对话框描述文件都是写在.rc文件里的,我尝试了,用CreateDialog创建对话框load不进去,加入断点发现CreateDialog时并没有发出WM_CREATE消息,所以断定是load时出错了,但描述性文件又没有错误,再参考一下书上的代码,发现它把对话框描述放在了一个.DLG文件里,然后在.rc文件里包含那个.dlg文件,在执行就可以了。我很郁闷这到底是为什么?
=======================================
RC文件并不是手工写的,而是用VC里面的资源编辑器画出来的,不管是SDK还是MFC在这一点上是相同的.
bill_chuang 2009-09-05
  • 打赏
  • 举报
回复
现在学的不是MFC,是win32 Application
  • 打赏
  • 举报
回复
直接使用MFC的CDialog就可以了
bill_chuang 2009-09-05
  • 打赏
  • 举报
回复
TCHAR和char有关系吗?只是一个ascII码,一个Unicode
bianfeng85 2009-09-05
  • 打赏
  • 举报
回复
问题出在这里hwnd=CreateDialog(hInstance,szAppName,0,NULL); 第二个参数是对话框模板,就是说必须是 主对话框资源ID.
hwnd=CreateDialog(hInstance,INITRESOURCE(IDD_DIALOG),0,NULL); IDD_DIALOG改成你的对话框ID
xylicon 2009-09-05
  • 打赏
  • 举报
回复
char szAppName[] ="Calculator";

把这个改成下面这样试试。

TCHAR szAppName[] =TEXT("Calculator");
bill_chuang 2009-09-05
  • 打赏
  • 举报
回复
但是直接写在.rc文件中就无法创建对话框,CreateDialog时无法发送WM_CREATE消息
xylicon 2009-09-05
  • 打赏
  • 举报
回复
对话框描述放在了一个.DLG文件里只是为了方便管理维护而已。实际上和直接写在rc文件中没什么两样。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧