因为项目的需要,某子窗口B的设置变动,经常需要联动其他子窗口C,或者父窗口A控件的名称更新,数据更新等等问题。再网上查了许久,不得解
,特抛砖引玉,提供几种思路。
以下都以A为父窗口,A1为A中的Tab控件, B和C为子窗口被非模态创建于A1上,所以之间的关系为
A
|
A1 A2 A3 (An为A上控件)
|
B C
|
C1 C2 C3 (Cn 为C上控件)
一、发送消息
1、自定义消息,网上很多
http://blog.sina.com.cn/s/blog_4a1695ff0100ckgo.html
自定义消息中,加入自己要更新的消息内容,如果控件颜色,文字等等。
2、在A类中定义C类的对象page2
即可通过调用page2.SendMessage(WM_MYMSG, NULL, NULL); 实现。
二、如果在C中的控件要控制A2的数据显示。
GetParent()->GetParent()->SetDlgItemText(A2, "XXXXX"); 实现。
其中,第一个getparent()获得A1的窗口指针,第二个getparent()获得A的窗口指针。
三、通过二可以知道,其实每个控件都是一个子窗口,它可以包含其他子窗口,成为Parent.
我们通过GetParent()或的A1的窗口指针之后,可以通过FindWindow()等其他方式获得C的窗口指针,然后进行如二中的操作。
// TODO: 在此添加控件通知处理程序代码
TCHAR className[MAX_PATH], WinText[MAX_PATH];
CString str;
HWND hWnd =::GetWindow(m_hWnd, GW_CHILD);
while(hWnd != NULL)
{
HWND hhWnd = ::GetWindow(hWnd, GW_CHILD);
while(hhWnd != NULL)
{
::GetWindowText(hhWnd, className, MAX_PATH);
MessageBox(className);
hhWnd = ::GetWindow(hhWnd, GW_HWNDNEXT);
}
::GetWindowText(hWnd, className, MAX_PATH);
MessageBox(className);
hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
}
四、刚发现的一种方式,比如主对话框中MainDlg.cpp 中,子类或者对话框中Page.cpp中使用主对话框的资源。
1、在MainDlg.cpp中 传输自己的对象到Page.cpp中。 PageX.SetDlgPtr(this);
2、在Page.cpp中成员函数: void SetDlgPtr(class MainDlg *p){ m_pDlg = p; } 成员变量: class MainDlg *m_pDlg;
3、使用m_pDlg使用MainDlg中的函数控制控件的显示信息。
五、 其他
1、GetWindowedChildCount();获得子窗口的个数。static不算子窗口。
2、http://blog.163.com/fengxuedong_fxd/blog/static/719263062011920102930356/ 句柄和窗口类指针的关系转换
3、修改窗口类名http://blog.csdn.net/flyoxs/article/details/2812625