WEB开发网
开发学院软件开发VC 解说Win32的窗口子类化 阅读

解说Win32的窗口子类化

 2010-07-11 20:44:50 来源:WEB开发网   
核心提示:也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作——因为它只能够单纯的限制大小写或者纯数字,解说Win32的窗口子类化,当你在论坛上求救的时候,某个网友告诉你:“用子类化,我将对话框关闭(EndDialog);在对话框销毁(WM_DESTROY)

也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作——因为它只能够单纯的限制大小写或者纯数字。当你在论坛上求救的时候,某个网友告诉你:“用子类化。”你也许会在看到一线曙光的同时多出了一连串的问题:何为子类化?子类化的原理是什么?如何实现子类化?下面就让我从一个简单的C++程序开始,一步步解开你的疑团吧。

首先,我为你列出以下这个C++程序:

#include <iostream>
using namespace std;
class Parent
{
public:
 void func(void) { cout << "func of Parent" << endl; }
};
class Child : public Parent
{
public:
 void func(void) { cout << "func of Child" << endl; }
};
void main()
{
 Parent p;
 Child c;
 p.func();
 c.func();
}

现在我来解说一下。这段代码中我定义了两个C++类:父类和子类,并且子类是继承自父类的;它们有一个具有相同名称的成员函数func。在main函数中,我分别构造了父类和子类的对象,并调用了它们各自的成员函数func。结果如下:

func of Parent
func of Child

简单说来,这段代码就是子类根据自己的需要改写了func成员函数。而Win32的子类化的原理也与此类似,只不过子类化实际上并没有像C++一样重载哪个函数,而是靠拦截Windows系统中的某些消息来自己进行处理罢了。举例来说,请大家看以下这段简单的窗口回调过程:

LRESULT CALLBACK ProcMain(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
 switch (Msg)
 {
 case WM_CLOSE:
  EndDialog(hDlg, 0);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 }
 return 0;
}

在这个回调之中,我手动处理了两个消息:在单击了“关闭”按钮(WM_CLOSE)的时候,我将对话框关闭(EndDialog);在对话框销毁(WM_DESTROY)的时候,我向系统消息队列中发送了退出的消息来完成结束工作(PostQuitMessage)。也就是说,如果把WM_CLOSE的响应代码改成:

case WM_CLOSE:
  ShowWindow(hDlg, SW_MINIMIZE);
  break;

1 2  下一页

Tags:解说 Win 窗口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接