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

相信很多人在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 中提供了两种方法让我们可以定制自已的对话框窗口类。

时间: 2024-10-14 07:32:13

定制个性化的对话框窗口类的相关文章

聊天主题:如何用C#定制个性化的界面控件

控件 聊天主题:如何用C#定制个性化的界面控件 主持人和专家介绍主持人:Guest_jswang_MS 微软专家: 韩定一(Guest_Danny_MS),赵彦(Guest_Francs_MS) Host Guest_jswang_MS says: 欢迎大家参加微软在线技术聊天. Host Guest_jswang_MS says: 本次聊天的主题是如何用C#定制个性化的界面控件 Host Guest_jswang_MS says: 首先,让我们欢迎来自微软全球技术中心工程师赵彦,韩定一 Hos

WINX窗口类对象的内存管理

为了引入WINX窗口类对象的内存管理(生命周期模型),我绕了一大圈子.实在是,内存 管理太重要了,花多少口舌介绍它都不过分.我曾经见到这样一句话:"C++程序员觉得 内存管理太重要了,所以一定要自己进行管理:Java/C#程序员觉得内存管理太重要了,所以 一定不能自己去管理".从某种意义上说,两者都是对的. 那么WINX的窗口对象是否也是采用gc allocator呢? 答:不是. 具体问题具体分析.在通常情况下,我个人确实已经非常习惯使用gc allocator来进行内 存管理,但是

定制个性化按钮

定制个性化按钮   效果   说明 通过捕捉一个按钮不同状态的值来定制我们自己的按钮动画,本人仅仅提供了实现的抽象基类以及一个简单的示例,剩下的需要你根据自己的想象力创造了.   源码 https://github.com/YouXianMing/UI-Component-Collection // // BaseControl.h // BaseButton // // Created by YouXianMing on 15/8/27. // Copyright (c) 2015年 YouX

cdialog 1.1-20110630发布 屏幕显示对话框基类

Chttp://www.aliyun.com/zixun/aggregation/16497.html">Dialog类是在屏幕上显示的对话框基类.对话框有两类:模态对话框和非模态对话框.模态对话框在应用继续进行之前必须关闭.非模态对话框允许用户执行另外的操作而不必取消或删除该对话框. 一个CDialog对象是对话框模板与一个CDialog派生类的组合.使用对话框编辑器创建对话框并存入资源之中,然后使用ClassWizard创建一个CDialog派生类. 同其它窗口一样,对话框从Windo

VC实现对话框窗口任意分割_C 语言

    个人认为简单问题最好就是直接贴源代码,一看就明白,说来说去反而弄不清楚,那我就少废话了,自己看吧,注释很清楚. 先来张图片 1. 新建一个MFC对话框程序MySplitterDlg. 再插入两个Dialog资源 ,这里一定要选择IDD_FORMVIEW类别的对话框,分别新建类CMyFormView0 和CMyFormView1,基类别选CDialog,一定要选择CFormView. 2. CMySplitterDlg中增加WM_CREATE的消息响应,编辑OnCreate() int C

VC定制个性化的MessageBox解决方法_C 语言

相信学过VC的人都知道MessageBox()函数的用法: int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in message box LPCTSTR lpCaption, // message box title UINT uType // message box style ); 虽然在参数uType中可以指定一些样式,但你在程序中能够对MessageBox的外观所做的定义却不多.原因

VC++中HTControl控制类使用之CHTDlgBase对话框基类实例_C 语言

本文所述为VC++界面编程的一个MFC例子,基于HTControl控件类的CHTDlgBase对话框基类主文件代码.该程序可完成动态创建框架窗体,窗体外观(客户区与非客户区),调整窗体大小,无效子窗口的控制等功能. 具体实现代码如下: /**************************************************************************** | Copyright (c) 2012, | ******************************

c++-MFC怎么在普通的函数中操作窗口类的成员变量

问题描述 MFC怎么在普通的函数中操作窗口类的成员变量 例如我想在函数f中操作CtestDlg类的变量e.该怎么做? 解决方案 定义一个全局变量 CtestDlg dlg 创建对话框给它赋值 e定义成public的 用dlg.e 得到变量. 解决方案二: 类的普通成员函数的指针类普通成员函数与函数的区别类成员函数与普通函数的区别 解决方案三: 给函数传入形参,用引用&实现

VC++实现非窗口类中使用定时器的方法

定时器在Windows 的程序中的作用不可忽略,也随处可见.设定一个时间间隔每0.5秒或者1秒钟刷新一次时钟,这样就可以完成一个简单的电子钟程序.在不同的编程工具中定时器的用法也不同,Visual C++中也给我们提供了实现这种功能的方法,而且方法不只一种.在窗口类中是使用定时器比较很简单,用SetTimer()设置了定时器之后,并在Class Wizard中添加了WM_TIMER消息映射后,您就可以在映射函数OnTimer()中添加代码实现,来定时完成您的任务,而且还支持任意多个定时器,这种方