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");
            }
            
            
        }

 后来又遇到另一种情况 确通过这种方式查找不到运行类:


 

类中的相关宏也加了呢。不知道为什么找不到。
posted @ 2019-07-21 09:24  伟大的厨师  阅读(8)  评论(0)    收藏  举报