当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 定制个性化的对话框窗口类

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 85 ::
收藏到网摘: n/a

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

作者:赖锋

  相信很多人在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 保证了即使你的资源文件在不