关于MFC中 父窗口与子窗口 子窗口与子窗口之间的信息传递及控制

因为项目的需要,某子窗口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


你可能感兴趣的:(MFC)