VC++中定制个性化的对话框窗口类

转载 2006年06月25日 11:16:00
 相信很多人在VC下开发程序的时候大多都会采用基于对话框的开发吧,我也不例外,大多数的小型测试程序没有必要开发基于文档/视图的结构来测试,只要使用一些基本的对话框程序就可以达到这个目的 。

  但是在开发基于对话框的程序时,要使用到一些 Spy++ 的功能检测的时候,就会出现一些问题。什么问题呢?当我使用 Spy++ 去检测一个对话框的窗口类 时,并想得到一个对话框的窗口类,以便我在使用钩子的时候可以指定一个对话框进行 hook,但是结果出乎我意料之外 ,对话框的窗口类不是我在注册时所指定的对话框窗口类名。其类名是 "#32770(Dialog)",这是一个MFC自动为基于对话框的程序产生的默认窗口类 ,所有的基于MFC所产生的对话框程序都使用这一个默认类名。即是说,我在使用一个基于对话框的程序时,无论多少个对话框产生,它们的类名都会是 "#32770(Dialog)",这样我在打开对话框进行测试时,无法指定我需要的对话框的句柄。

  但是,当指定一个对话框的窗口标题的时候,这个对话框的名柄就可以找到了:

HWND hWnd = MULL;
hWnd = FindWindow( "#32770",lpszWindowName );
_ASSERT( hWnd != NULL );
//其中 lpszWindowName 是对话框的窗口标题目。

  这种方法也有一定的缺点,就是一个对话框的标题不确定时会怎么样,或对话框的标题在运行过程中要动态改变呢?这样根本无法保证所找到 的句柄就是所需要的句柄。我采取的方法就是在对话框的产生过程中为对话框指定一个唯一的窗口类,这样就可以找到所想要的指定句柄,而不必与其它的对话框混 淆。

HWND hWnd = MULL;
hWnd = FindWindow( lpszClassName, NULL );
_ASSERT( hWnd != NULL );
//其中 lpszClassName 是对话框的窗口类名。

  那怎么样实现自已定制的对话框类呢! 看过《深入浅出MFC》的读者一定会想到,在重载 CWinApp 的 InitInstance()函数中进行修改 ,不错,确实要在这儿修改。

// 在派生类的 InitIntace() 中
BOOL CLimitDlgInstanceApp::InitInstance()
{
  WNDCLASS wc;
  // Get the info for this class。
  // #32770 is the default class name for dialogs boxes。
  ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);

  // Change the name of the class。
  wc.lpszClassName = "MyPrivateClassName";

  // Register this class so that MFC can use it。
  AfxRegisterClass(&wc);

  // ......
}

  这里采用的方法是在产生注册窗口时,将注册窗口的窗口类名修改。再重新注册窗口类,一切看来很顺利,也不是非常难的操作,但是一切都如你预期一样么。很不辛,你再打开 Spy++ 观察窗口的时候 ,仍是 "#32770(Dialog)"。

  好了,你有其它办法吗? MSDN在这个时候还是最有用的,缺少 MSDN 就如在没有桨的船,MSDN 中提供了两种方法让我们可以定制自已的对话框窗口类。

第一种:

  1、打开这个对话框工程文件,打开 ResourceView。


  2、打开 Resource Editor,右击对话框,选择选项 Properties,在对话框的属性项中 ,最下角是一个类名的输入项, 但是这一个选项是禁止的, 你无法在些输入类名, 因为你在这里是选择了 MFC 类库的 支持。为了使这个选项可以输入。如图所示,在Resource View 的最顶项选择右键->属性,就会弹出
一个资源文件属性对话框,把其中的 Enable MFC Features 的项设为禁止, 则对话框的类名就可以在在资源编辑器中设定了。(在Visual C++ 。NET,设置 MFC Mode property 属性为 FALSE)

  第二种可供选择的方法就是修改 RC 文件和源代码! 在 CWinApp 的派生类的 Initinstance 函数中进行修改 :

// 在派生类的 InitIntace() 中
BOOL CLimitDlgInstanceApp::InitInstance()
{
  WNDCLASS wc;

  // Get the info for this class。
  // #32770 is the default class name for dialogs boxes。
  ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);

  // Change the name of the class。
  wc.lpszClassName = "MyPrivateClassName";

  // Register this class so that MFC can use it。
  AfxRegisterClass(&wc);

  // ......
}

  其中 ::GetClassInfo 保证了即使你的资源文件在不同的 Dll 中也能正确得到 HINSTANCE 跟着就是要修改资源文件了,用文本编辑器打开 rc 文件 ,加上" ClASS 类名 "如下图所示:

  注意,如果你 rc 文件中的类名与 Initinstance 中的类名不一致,程序不会运行,这是非常重要的。切记。

  结束语:

  这只是一个小技巧,希望对于大家的开发有所帮助,例如在开发基于对话框的程序中,使应用程序只有一个运行实例,注册唯一的窗口类是非常有用的。或作一个进行程序监控的时候,可以进行快速定位。

定制个性化的对话框窗口类

定制个性化的对话框窗口类作者:赖锋  相信很多人在VC下开发程序的时候大多都会采用基于对话框的开发吧,我也不例外,大多数的小型测试程序没有必要开发基于文档/视图的结构来测试,只要使用一些基本的对话框程...
  • wirror800
  • wirror800
  • 2009年05月04日 13:27
  • 963

VC++6.0定制窗口的方法

  一、如何在多文档界面下去掉开始的子窗口 在多文档界面下,自动生成一个新的子窗口,而一个实际的应用系统往往是由用户操作后再生成新的窗口。为了去掉开始的子窗口,可在应用程序文件分析命令行的语句 Cco...
  • ziren235
  • ziren235
  • 2006年11月05日 14:15
  • 1407

VC++模式对话框和非模式对话框的步骤

VC3 1.面向对象:封装、继承、多态2.类与对象3.strcpy("a","b");4.析构函数5.抛出异常:throws6.文本控件---只支持应用的输出,不接受用户的输入Static Text ...
  • loveheronly
  • loveheronly
  • 2010年10月14日 00:41
  • 2204

【VC】Dialog 窗口任意分割子窗口。

用 Dialog 对话框来实现窗口的任意分割。 在资源中添加  Dialog 选择  IDD_FORMVIEW 资源。。分别新建FormViewOne,FormViewTwo FormViewTh...
  • shen_wei
  • shen_wei
  • 2014年11月06日 11:14
  • 4164

VC++对话框的任意扩展

  我们在信息输入的时候,可能有很大的信息量,而这些信息又不是必须的,这时我们就需要给信息输入人员一个选择的接口。例如一个人事部门的职工信息录入系统就有这样的问题 ,其中的姓名、性别、年龄、政治面目、...
  • mynote
  • mynote
  • 2005年03月09日 08:55
  • 1624

VC如何让对话框一显示就最大化

VC如何让对话框一显示就最大化方法一:在OnInitDialog()函数中 ShowWindow(SW_SHOWMAXIMIZED); 初始化的时候方法二:当然,你可以获取屏幕大小,然后设置窗口位...
  • u011100345
  • u011100345
  • 2016年10月08日 13:42
  • 659

如何在VC++6.0中修改主窗口风格

Visual C++是一种面向对象的可视化编程工具,它提供的AppWizard能自动生成应用程序的标准框架,大大减轻了编程的工作量。本文主要介绍如下的编程技巧:修改主窗口风格、创建不规则形状窗口、用鼠...
  • dragon101788
  • dragon101788
  • 2011年12月22日 14:33
  • 2871

VC++修改对话框颜色方法

在软件开发中,出于界面的美观或是别的目的我们需要修改对话框的颜色,这时我们可以通过如下方法来达到目的。 注:本例使用VC++2010测试, 以下第一种方法不适合该版本的VC++库。...
  • xbmoxia
  • xbmoxia
  • 2014年09月10日 16:48
  • 1393

对话框弹出右键菜单

使用上下文菜单 Windows 95应用程序支持单击鼠标右键弹出上下文菜单的功能,这可通过处理WM_CONTEXTMENU消息来实现。当在窗口内单击鼠标右键时,窗口将接收到WM_CONTEXTMENU...
  • chinafe
  • chinafe
  • 2007年05月08日 08:18
  • 2486

原创vc: 对话框嵌入到对话框 或者:窗口嵌入到窗口,一个窗口嵌入到另一个窗口

1、用vc新建一个dialog1工程。属性默认。2、insert一个dialog2,改为child。3、在dialog1中包含dialog2头文件,在一个按钮事件中显示dialog2:Cdialog2...
  • lanmanck
  • lanmanck
  • 2009年02月02日 10:30
  • 11911
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++中定制个性化的对话框窗口类
举报原因:
原因补充:

(最多只允许输入30个字)