您的位置:首页 > 其它

SubclassWindow和SubclassDlgItem介绍

2015-05-04 11:14 543 查看
在对话框中将一个控件映射到一个变量,有三种方法:

1.       DDX的方法

2.       GetDlgItem的方法,例如CEdit pEdt = (CEdit *)GetDlgItem(IDC_EDIT1);

3.       SubclassWindow的方法(或者其扩展SubclassDlgItem),例如CEditm_edit;m_edit.SubclassDlgItem(IDC_EDIT1);

SubclassWindow

      CWnd::SubclassWindow(HWND hWnd)中调用两个主要操作:Attach(hWnd)和WNDPROC
oldWndProc = (WNDPROC)::SetWindowLong(hWnd,GWL_WNDPROC, (DWORD)AfxGetAfxWndProc());

    前者的作用是把CWnd中的m_hWnd设置为hWnd,后者的作用是改变该窗口的窗口函数为AfxGetAfxWndProc()的返回.

AfxGetAfxWndProc返回了AfxWndProc的函数指针,即窗口函数的指针,AfxWndProc包裹了AfxCallWndProc,后者又调用了pWnd->WindowProc(nMsg,
wParam, lParam);。

可见SubclassWindow完成了两项功能:

1.       我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach)

2.       系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。

SubclassDlgItem

      调用了SubclassWindow,但之前调用了::GetDlgItem获取一个控件ID对应的窗口句柄。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: