如何更改MFC对话框默认的窗口类名

Windows操作系统中有一个概念——窗口类。窗口类是抽象的,它可以有很多窗口实例,即HWND/CWnd。在一个程序中,你可以定制并注册一个窗口类,然后用它创建窗口,也可以直接用已经注册的窗口类创建我们的窗口。

为了减轻我们的编程负担,也为了隐藏具体的实现,MFC已经为我们定制并注册了很多窗口类,我们可以直接使用它们。比如,对话框的窗口类为“#32770”,按钮的窗口类为“Button”,列表框的窗口类为“ListBox”……等等。

很多时候,我们需要用到FindWindow函数来查找已经存在的窗口,然后给它发送消息。或者查询系统是否已经存在指定的窗口(进程),如果存在,我们就不再创建程序的新进程,而仅仅是激活它。FindWindow函数的声明为:

1.  HWND FindWindow(      

2.      LPCTSTR lpClassName,

3.      LPCTSTR lpWindowName

4.  );

我们可以通过窗口类名(lpClassName)查找,也可以通过窗口标题文本(lpWindowName)查找,或者同时使用。窗口的标题文本并不总是十分可靠,很多时候,它是动态变化的。所以通过窗口类名来查找就很有必要了。

那么怎样把MFC提供给我们的对话框的默认窗口类名“#32770“改成我们程序特有的呢?以下是更改步骤:

1.    打开工程的资源视图

2.    更改对话框资源的ClassName属性。有两种方法:

第一种方法,在需要更改类名的对话框资源上右击,选择 属性 ,打开属性对话框,可以看到有一个名为 “Class Name” 的属性,我们在其中输入一个自己定义的名称(如 “MyPrivateClassName” )即可。但是, MFC 默认设置这个属性选项是灰色不可用的,我们先要开启它。切换到资源视图,右击根节点(如 “XxxXxx.rc” ),选属性,去掉勾选 Enable  MFC Features 项(如果是 VS.Net ,把 MFC Modeproperty” 项改为 False )。这样就可以修改对话框的 Class Name 属性了。

另一种方法是直接用文本编辑器打开资源文件,修改对话框定义代码,插入CLASS项,如:

1.  IDD_LIMITDLGINSTANCE_DIALOG DIALOGEX 0, 0, 195, 44

2.  STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

3.  EXSTYLE WS_EX_APPWINDOW

4.  CAPTION "LimitDlgInstance"

5.  CLASS "MyPrivateClassName" // Add your class name here!

6.  FONT 8, "MS Sans Serif"

7.  BEGIN

8.      DEFPUSHBUTTON   "OK",IDOK,138,7,50,14

9.      PUSHBUTTON      "Cancel",IDCANCEL,138,23,50,14

10.     PUSHBUTTON      "&Test!",IDC_BUTTON1,48,14,49,15

11. END

3.    定制并注册新窗口类。在应用程序类的InitInstance()函数中添加以下代码,以注册资源文件中用到的新窗口类:

1.   WNDCLASS wc;

2.   

3.   // 获取窗口类信息。MFC默认的所有对话框的窗口类名为 #32770

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

5.   

6.   // 改变窗口类名

7.   wc.lpszClassName = _T("MyPrivateClassName");

8.   

9.   // 注册新窗口类,使程序能使用它

10.  AfxRegisterClass(&wc);

注意:

1.    在调用函数::GetClassInfo()时,请确保传入的第一个参数HINSTANCE是包含你对话框资源所在的dllexe的进程实例。

2.    请确保资源中指定的Class NameInitInstance()中指定的窗口类名完全相同,否则程序不能运行。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值