天天看点

如何给对话框设置窗口类名

今天在研究ATL的时候发现修改类名是一件相当简单的事情。

一,Win32应用程序类名修改

1.新建Win32应用程序(HelloWorld)

2.打开以程序命名(HelloWorld)的资源文件HelloWorld.rc(代码方式打开)

查找:STRINGTABLE

内容如下:

STRINGTABLE

BEGIN

   IDC_HELLOWORLD   "新类名"        //在这里修改成你要的类名即可

   IDS_APP_TITLE       "HelloWorld"

END

二,MFC应用程序类名修改

通过:

FROM:http://www.chinaitpower.com/A/2001-10-17/2016.html

OTHER:http://topic.csdn.net/t/20040227/13/2782754.html

知道了几个要点:

原理:在窗口显示之前用AfxRegisterClass重新注册类名

1、用记事本或其它文本编辑工具打以工程名命名的RC文件,找到这样的一段,加入自定义类名

段1:

IDD_TEST_DIALOG DIALOGEX 0, 0, 320, 200

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

EXSTYLE WS_EX_APPWINDOW

CAPTION "test"

CLASS "我的类名" // 在这加入类名

FONT 9, "宋体"

2、注册窗口类。

在InitInstance()函数中的&dlg.doModel()之前加入以下代码:

段2:

WNDCLASS wndMyClass;

::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wndMyClass);//取得原来对话框的窗口类属性

wndMyClass.lpszClassName = "我的类名";//将类名改成自定义的类名

AfxRegisterClass(&wndMyClass); //关键的一行,如果不注册,对话框就出不来了。

备注:

1建立对话框应用程序的时候 不应该包含 支持UNICODE库,否则会出现如下错误:

error C2664: “GetClassInfoW”: 不能将参数 2 从“const char [7]”转换为“LPCWSTR”

1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

error C2440: “=”: 无法从“const char [19]”转换为“LPCWSTR”

1>        与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

。用_T()来转换

使用了UNICODE必须下面的代码注册

段2(UNICODE版本)

   //如何改变对话框的窗口类名START

WNDCLASS wc;

::GetClassInfo(AfxGetInstanceHandle(),_T("#32770"),&wc);

wc.lpszClassName=_T("我的类名");

AfxRegisterClass(&wc);

//如何改变对话框的窗口类名END

吐血中~~~~,

经测试发现:

只需要 在代码(段2/段2(UNICODE版本))中修改就OK。不用在资源文件添加 Class 选项,

实现动态类名方便了!!!

感谢xyieou提出的建议,再次测试需要在资源文件添加Class选项

且新类名不能与应用程序名称相同(实例化theApp的类,本例中是CTestApp theApp;)即不可以是CTestApp否则会出现GetLastError returns 0x00000057的错误

转自: http://apps.hi.baidu.com/share/detail/17942019

继续阅读