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

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

我怎么使我的WNDCLASSEX合法呢?

因为我把Class Name改成#32770是可以建立的。
...全文
414 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-05-01
  • 打赏
  • 举报
回复
使用对话框就要用#32770这个类的窗口函数,不用它当然也可以创建窗口(用CreateWindowEx),但是需要自己创建窗口中的控件。
北京的雾霾天 2009-05-01
  • 打赏
  • 举报
回复
差一点我就使用了CreateWindowEx函数.在考虑了自己分析对话框资源创建窗体控件的繁重任务后,我还是决定了自己再访问一下MSDN,还是被我查了出来.在这里我很感谢cnzdgs的提醒:)
北京的雾霾天 2009-05-01
  • 打赏
  • 举报
回复
查看了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
  • 打赏
  • 举报
回复
帮顶
北京的雾霾天 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
北京的雾霾天 2009-04-30
  • 打赏
  • 举报
回复
[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:难道我一定要使用系统注册好的这个对话框类吗?我自己注册一个窗口不行吗?
北京的雾霾天 2009-04-30
  • 打赏
  • 举报
回复
并且我试过了,如果设置的类名不存在,则是1407:“找不到窗口类别。”
但现在报的是:
1420:窗口不是合法的对话窗口。
北京的雾霾天 2009-04-30
  • 打赏
  • 举报
回复
是添加上了,类似于如下的样子:

...
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下

16,548

社区成员

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

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

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