subclasswindow函数:
1.我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach)
2.系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。 但是学习的一个sample中 我把m_sBar.SubclassWindow(m_hWndStatusBar);替换成m_sBar.Attach(m_hWndStatusBar);
替换之后m_sBar.SetText(1, " Distorted icon. ");便无法显示
想问下什么情况下用subclasswindow 什么情况下用attach
1.我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach)
2.系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。 但是学习的一个sample中 我把m_sBar.SubclassWindow(m_hWndStatusBar);替换成m_sBar.Attach(m_hWndStatusBar);
替换之后m_sBar.SetText(1, " Distorted icon. ");便无法显示
想问下什么情况下用subclasswindow 什么情况下用attach
我们对该窗体实例调用成员函数将会直接改变相关窗体句柄对应的窗体(Attach)
系统传给相关窗体句柄的消息会先经过该窗体实例的消息映射(SetWindowLong)。
BOOL CWnd::SubclassWindow(HWND hWnd)
{
if (!Attach(hWnd)) //注意这里调用了Attach
return FALSE; // allow any other subclassing to occur
PreSubclassWindow(); // now hook into the AFX WndProc
WNDPROC* lplpfn = GetSuperWndProcAddr();
WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC,
(DWORD)AfxGetAfxWndProc()); //设置重新设置窗口的窗口函数
ASSERT(oldWndProc != (WNDPROC)AfxGetAfxWndProc()); if (*lplpfn == NULL)
*lplpfn = oldWndProc; // the first control of that type created return TRUE;
}
subclasswindow实现了Attach,
且替换原来窗口的WndProc 函数.
subclasswindow相当与调用了Attach,
再调用SetWindowLong
通常用在已存在内存实例对象与CWnd对象相连接
只样的意思是实例对象已被创建,但没有相对应的抽象类给以操作,用CWnd连接后就以CWnd对象来替代实例对象操作.
Attach不会对你的窗口产生任何的影响
subclasswindow更多的是代表依附 这样去理解可以不