更改MFC对话框默认的窗口类名
来源:互联网 发布:乐语软件好用吗 编辑:程序博客网 时间:2024/06/06 02:55
下方所述我通过VC2008试过了,可能跟VC6有稍许差别.
Windows操作系统中有一个概念——窗口类。窗口类是抽象的,它可以有很多窗口实例,即HWND/CWnd。在一个程序中,你可以定制并注册一个窗口类,然后用它创建窗口,也可以直接用已经注册的窗口类创建我们的窗口。
为了减轻我们的编程负担,也为了隐藏具体的实现,MFC已经为我们定制并注册了很多窗口类,我们可以直接使用它们。比如,对话框的窗口类为“#32770”,按钮的窗口类为“Button”,列表框的窗口类为“ListBox”……等等。
很多时候,我们需要用到FindWindow函数来查找已经存在的窗口,然后给它发送消息。或者查询系统是否已经存在指定的窗口(进程),如果存在,我们就不再创建程序的新进程,而仅仅是激活它。FindWindow函数的声明为:
HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
我们可以通过窗口类名(lpClassName)查找,也可以通过窗口标题文本(lpWindowName)查找,或者同时使用。窗口的标题文本并不总是十分可靠,很多时候,它是动态变化的。所以通过窗口类名来查找就很有必要了。
那么怎样把MFC提供给我们的对话框的默认窗口类名“#32770“改成我们程序特有的呢?以下是更改步骤:
1. 打开工程的资源视图
2. 更改对话框资源的ClassName属性。有两种方法:
第一种方法,在需要更改类名的对话框资源上右击,选择“属性”,打开属性对话框,可以看到有一个名为“Class Name”的属性,我们在其中输入一个自己定义的名称(如“MyPrivateClassName”)即可。但是,MFC默认设置这个属性选项是灰色不可用的,我们先要开启它。切换到资源视图,右击根节点(如“XxxXxx.rc”),选属性,去掉勾选“Enable MFC Features”项(如果是VS.Net,把“MFC Mode property”项改为False)。这样就可以修改对话框的Class Name属性了,假如为"MyClassName"。
然后在BOOL CXXXXApp::InitInstance()方法的WNDCLASS wc;下方加上如下代码:
//////////////////////注册新类名///////////////////////////
// 获取窗口类信息。MFC默认的所有对话框的窗口类名为 #32770
::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
// 改变窗口类名
wc.lpszClassName = _T("MyClassName");
// 注册新窗口类,使程序能使用它
AfxRegisterClass(&wc);
///////////////////////////////////////////////////////////
这段代码必须加上并且需要注册,要不然程序启动不了。
另一种方法是直接用文本编辑器打开资源文件,修改对话框定义代码,插入CLASS项,如:
IDD_LIMITDLGINSTANCE_DIALOG DIALOGEX 0, 0, 195, 44
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "LimitDlgInstance"
CLASS "MyPrivateClassName" // Add your class name here!
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,138,7,50,14
PUSHBUTTON "Cancel",IDCANCEL,138,23,50,14
PUSHBUTTON "&Test!",IDC_BUTTON1,48,14,49,15
END
3. 定制并注册新窗口类。在应用程序类的InitInstance()函数中添加以下代码,以注册资源文件中用到的新窗口类:
WNDCLASS wc;
// 获取窗口类信息。MFC默认的所有对话框的窗口类名为 #32770
::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
// 改变窗口类名
wc.lpszClassName = _T("MyPrivateClassName");
// 注册新窗口类,使程序能使用它
AfxRegisterClass(&wc);
注意:
1. 在调用函数::GetClassInfo()时,请确保传入的第一个参数HINSTANCE是包含你对话框资源所在的dll或exe的进程实例。
2. 请确保资源中指定的Class Name与InitInstance()中指定的窗口类名完全相同,否则程序不能运行。
更改完成,请重建工程,运行程序,使用Spy++查看最终效果吧!
- 更改MFC对话框默认的窗口类名
- 更改MFC对话框dialog默认的窗口类名classname
- 更改MFC对话框默认的窗口类名
- 更改MFC对话框默认的窗口类名
- 更改MFC对话框默认的窗口类名
- 如何更改MFC对话框默认的窗口类名
- 更改MFC对话框默认的窗口类名
- 更改MFC默认的窗口类#32770
- 更改MFC子窗口的类名#32770
- MFC 更改默认窗口大小的方法
- 修改mfc对话框程序窗口类名
- 修改基于对话框的MFC程序的主窗口类名
- 如何自定义MFC的窗口类名
- 2014-05-13MFC对话框:改变MFC中按钮的文字,更改窗体的大小,通过类名能够查找到该类对应的对话框,MFC中获取文本框中的内容,updatedata函数,两种对话框比较,oncreate起点
- MFC编程:窗口的更改
- 更改对话框和框架窗口图标 (VC/MFC)
- 更改VSS的默认登录名
- MFC 修改窗口类名
- 没有为扩展名“.html”注册的生成提供程序 (解决办法)
- memcached install and brief intro
- sql server 2000总是自动停止的解决方法
- ORACLE一条SQL查等待语句
- 第六讲:用户界面 View(二)
- 更改MFC对话框默认的窗口类名
- 从java写的存储过程转换到DB2的SQL存储过程的笔记
- lingo sample code for a QP problem
- JavaScript实现Shift+鼠标左键多选
- 利用Filter及HttpServletResponseWrapper修改Response的内容(内容更改利用正则表达式)
- sqlite3 基本操作
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序
- 以检测WWW,ftp,ssh,sendmail + pop3服务是否开启
- xml不支持自定义的css模式(浏览器问题)