给对话框加上了Class Name属性,CreateDialog不能建立窗口了!

北京的雾霾天 2009-04-30 04:03:47
我在VS2005的Win32程序里添加一个对话框资源,设置其属性“Class Name”为一个自己定义的WNDCLASSEX。
当我使用CreateDialog建立这个对话框的时候返回NULL,使用GetLastError返回1420:窗口不是合法的对话窗口。

我怎么使我的WNDCLASSEX合法呢?

因为我把Class Name改成#32770是可以建立的。
...全文
258 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-05-01
使用对话框就要用#32770这个类的窗口函数,不用它当然也可以创建窗口(用CreateWindowEx),但是需要自己创建窗口中的控件。
回复
差一点我就使用了CreateWindowEx函数.在考虑了自己分析对话框资源创建窗体控件的繁重任务后,我还是决定了自己再访问一下MSDN,还是被我查了出来.在这里我很感谢cnzdgs的提醒:)
回复
查看了MSDN,找到了这样的一些文字:
WNDCLASSEX Structure
...

cbWndExtra
Specifies the number of extra bytes to allocate following the window instance. The system initializes the bytes to zero. If an application uses WNDCLASSEX to register a dialog box created by using the CLASS directive in the resource file, it must set this member to DLGWINDOWEXTRA.

这里给出了关键的一个部分:
If an application uses WNDCLASSEX to register a dialog box created by using the CLASS directive in the resource file, it must set this member to DLGWINDOWEXTRA.

接下来我马上试着改写了下面的代码:

WNDCLASSEX wcex1;
wcex1.cbSize = sizeof(WNDCLASSEX);
//::GetClassInfoEx(hInstance, _T("#32770"), &wcex1);
wcex1.style = CS_HREDRAW | CS_VREDRAW;
wcex1.lpfnWndProc = WndProc;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = DLGWINDOWEXTRA;//0;
wcex1.hInstance = hInstance;
wcex1.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32APP));
wcex1.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex1.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex1.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32APP);
wcex1.lpszClassName = _T("NOTE");
wcex1.hIconSm = LoadIcon(wcex1.hInstance, MAKEINTRESOURCE(IDI_SMALL));

RegisterClassEx(&wcex1);


OK!
可爱的对话框终于显示出来了.
那个讨厌的错误1420没有了,wcex1合法了!
谢谢MSDN,同时也感谢CSDN,呵呵.
回复
jyh_baoding 2009-05-01
帮顶
回复
难道离开了这个"#32770"是建立不了窗口了吗?
我可不可以完全自己建立一个新的类呢?
回复
HelloDan 2009-05-01
[Quote=引用 13 楼 cnzdgs 的回复:]
使用对话框就要用#32770这个类的窗口函数,不用它当然也可以创建窗口(用CreateWindowEx),但是需要自己创建窗口中的控件。
[/Quote]

哇,变钻石了。。。
回复
hurryboylqs 2009-05-01
你就是想改变对话框默认的类名么?
这个你要在创建对话框之前,一般在InitInstance()函数里取得对话框的窗口类结构
然后修改再注册回去即可

WNDCLASS wc;
::GetClassInfo(AfxGetInstanceHandle(),_T("#32770"),&wc);
wc.lpszClassName = _T("mydialog"); // 你自己给他个名字

if (!RegisterClass(&wc))
{
AfxMessageBox(_T("注册窗口类失败"));
return 0;
}
回复
cnzdgs 2009-04-30
先这样注册一个类,然后再创建对话框:
WNDCLASSEX wcx; 
wcx.cbSize = sizeof(wcx);
GetClassInfoEx(NULL, _T("#32770"), &wcx);
wcx.hInstance = GetModuleHandle(NULL);
wcx.lpszClassName = _T("NOTE");
回复
biweilun 2009-04-30
VS2005 中rc文件的属性有“Mfc Mode”呀,是一样的效果
回复
biweilun 2009-04-30
自己注册一个窗口当然行了。
回复
Kudeet 2009-04-30
support.microsoft.com/kb/251059
回复
[Quote=引用 3 楼 biweilun 的回复:]
资源标签上右键点击最上边的那个“xx resources”
在弹出的对话框中,去掉“Enable MFC feature”复选项.

打开你的对话框资源的属性对话框,在右下角的class name输入你要修改的类名。比如"TEST"
再加上“Enable MFC feature”复选项


在你的InstInstatce()虚函数中:
WNDCLASS wc = {0};
::GetClassInfo(AfxGetInstanceHandle(),"#32770",&wc);
wc.lpszClassName="TEST";
AfxRegisterClas…
[/Quote]

1:我用的是VS2005,没有那个“Enable MFC feature”选项了。
2:难道我一定要使用系统注册好的这个对话框类吗?我自己注册一个窗口不行吗?
回复
并且我试过了,如果设置的类名不存在,则是1407:“找不到窗口类别。”
但现在报的是:
1420:窗口不是合法的对话窗口。
回复
是添加上了,类似于如下的样子:

...
CAPTION "Dialog"
CLASS "NOTE"
...

NOTE就是我事先注册好的类名。
回复
biweilun 2009-04-30
资源标签上右键点击最上边的那个“xx resources”
在弹出的对话框中,去掉“Enable MFC feature”复选项.

打开你的对话框资源的属性对话框,在右下角的class name输入你要修改的类名。比如"TEST"
再加上“Enable MFC feature”复选项


在你的InstInstatce()虚函数中:
WNDCLASS wc = {0};
::GetClassInfo(AfxGetInstanceHandle(),"#32770",&wc);
wc.lpszClassName="TEST";
AfxRegisterClass(&wc);

因为对话框默认创建出来的类名就是#32770,你单改个Class Name属性还不够

回复
oyljerry 2009-04-30
rc资源中,对话框的类名是否添加上...
回复
wutaihua 2009-04-30
mark下
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告