DUI中的窗口子类化过程
HWND CWindowWnd::Subclass(HWND hWnd)
{
ASSERT(::IsWindow(hWnd)); //判断给定的句柄是否是一个已经存在的窗口
ASSERT(m_hWnd==NULL);
m_OldWndProc = SubclassWindow(hWnd, __WndProc); //设置新的窗口过程函数,进行子类化
if( m_OldWndProc == NULL ) return NULL;
m_bSubclassed = true; //子类化的标识,子类化是否成功
m_hWnd = hWnd; //子类化后,设置子类化后的窗口句柄
return m_hWnd;
}
MFC中的窗口子类化
MFC中的窗口子类化
VC 中基于 SDK 编程的窗口子类化的基本步骤如下:
(1) 正常创建原始窗口,得到窗口的句柄。
(2) 调用 GetWindowLong 得到原来的窗口函数 OldWndProc 。
(3) 调用 SetWindowLong 设置新的窗口函数 NewWndProc 。
新的窗口函数的代码如下所示:
LRESULT NewWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if(message==WM_IcareIt)
{
// 截取自己感兴趣的消息,作一些处理,达到改变特性的目的
}
// 必要时可以调用原来的窗口函数,使被子类化的窗口仍具有原来的很多特性
return CallWndowProc(OldWndProc,hWnd,message,wParam,lParam);
}