MFC 窗体分割后的切分窗口间通信中GetRunTimeClass()的使用方法
在SDI程序中,如果各个子窗口都是基于视图的,那么,各个切分窗口之间的通信可以通过其共有的文档来进行,如果在子窗口中有不使用视图类的,
那么可以通过其共有的窗口框架来进行通信。但是,如果要实现实时通信,这两种通信方式只有通过"事件处理"完成。比如窗体分割 为3个,1上2下,CFormView1,CFormView2,CFormView3.
2和3窗口类之间如果要实时传递信息的话,一种简单的思路是,CFormView2向窗口框架CMainFrame发送信息,CMainFrame再把信息转送到CFormView3,CFormView3收到消息马上进行处理。
但是这一套消息传输机制,MFC并不直接支持,需要自已去完善。
另一种简单也推荐的是可以通过GetRunTimeClass()查找窗口运行类来实现
因为切分窗口都要通过RUNTIME_CLASS(CFormViewX)的方式与各子窗口关联的,所以要想在CFormView2中向CFormView3中发送信息或调用成员函数,只需要在内存中查找运行类为CFormView3的窗口就行了,只要找到窗口,就一定能直接操纵CFormView3。
如CFormView2为listctrl,里面显示文件夹名称,而CFormView3显示文件夹内容。当用户点击CFormView2时,获取所点击的文件夹名,从数据库中搜索出对应的项并显示到CFormView3中。
需要响应CFormView2的NM_CLICK,在里面通过GetRunTimeClass() 查找CFormView3的窗口类。
关键代码如:
void CFormView2::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;
if (-1 != pNMListView->iItem) // 如果iItem不是-1,就说明有列表项被选择
{
// 获取被选择列表项第一个子项的文本
m_strGroupName = m_projFolder.GetItemText(pNMListView->iItem, 0);
TRACE("ProjFolder:" + m_strGroupName + "\r\n");
CWnd *formView3 = NULL;
CWnd *temp = NULL;
temp = GetNextWindow();
while (temp)
{
// 查找CFormView3运行类
if (temp->GetRuntimeClass()->m_lpszClassName == "CFormView3")
{
formView3 = temp;
//强制转换,注意大括号位置, 并调用CFormView3 成员函数
((CFormView3*)formView3)->m_projItem.DeleteAllItems();
((CFormView3*)formView3)->ShowProjListItem(m_strGroupName);
temp = NULL;
}
else
{
temp = temp->GetNextWindow();
}
if (!formView3)
{
AfxMessageBox("No find");
}
}
后来又遇到另一种情况 确通过这种方式查找不到运行类:



浙公网安备 33010602011771号