Win32 API控件的子类化(1)
按钮、编辑框等控件各自都是独立的窗口,因此内部有WindowProc函数。可以准备自己的WindowProc函数来代替这个默认的WindowProc函数,以处理发送给控件的消息。这称为控件的子类化。
然而,大多数消息处理都是交给默认的WindowProc函数的,所以自己的WindowProc函数实际上是一个包装器。如果用面向对象语言如C++来说,自己的WindowProc函数相当于是子类。[2013.3.4] 在CreateWindowEx的样式参数中添加了ES_MULTILINE|ES_AUTOVSCROLL。如果没有这个,按下回车键时会发出beep声。
1. 控件的子类化方法
以EDIT控件为例说明子类化。如下所示,创建EDIT控件后,使用SetWindowLongPtr函数注册自己的EditWindowProc函数地址。返回之前的(默认的)WindowProc函数地址,然后设置到全局变量defEditWndProc中。
HWND hEdit = CreateWindowEx(0, "EDIT", "",
WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL|ES_MULTILINE|ES_AUTOVSCROLL,
30, 10, 100, 30, hWnd, (HMENU)777, NULL, NULL);
defEditWndProc = (WNDPROC)SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)EditWindowProc);
以下展示了自己的WindowProc函数。只处理按下Enter键时的消息,