今天在研究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