我用CSplitterWnd分了左右两个窗口,都继承formview想要在左边树控件选中
一项之后,右边的listcontrol控件显示信息.
我用pFrame = (CRightView *)AfxGetApp()->GetMainWnd();这样得到右边
视图的指针,在左边调用右边视图里的函数,
void CRightView::ListBoxFresh()
{
MessageBox("try");
}
这样一点问题也没有,但是一调用关于listcontrol控件的函数比如
DeleteAllItems();就会非法操作,程序中断
不知是为何?
我右想用消息映射来完成,pFrame->PostMessage(WM_MY_MESSAGE,0,0);这回连MessageBox("try");也出不来了.
谢谢高人指点

解决方案 »

  1.   

    我觉得你是在左视图中调用右视图的控件的指针,这样一定是非法的,因为m_list为类的私有成员变量,转到右视图中调用试试。
    如果不是上述原因,那要判断你的m_list是否得到的正确。pFrame->PostMessage(WM_MY_MESSAGE,0,0)这样做是不正确的,因为CView类根本得不到CFramMain发送的消息。只能是CFramMain中得到当前CView类的指针,调用其中的公有成员函数。
      

  2.   

    比如我这样做:
    void CMainFrame::OnUpdateUserState(WPARAM wparam,LPARAM lparam)
    {
    //---------------2003.2.20 by yang-------------------
    //更新用户状态
    CString *pUserName = new CString;
    pUserName = (CString*)wparam;
    if(lparam == 0)
    {
    //界面端为登陆上来的客户,包括本地用户和服务器登陆
    if((pUserName->Compare(m_strCurrentUserName) == 0 || pUserName->Compare("Server") == 0)&& m_strCurrentUserName.GetLength() != 0)
    {
    CFormViewUserState *pView = (CFormViewUserState*)m_wndSplitter.GetPane(0,1);
    pView->UpdateUserState();
    }
    }
    if(lparam == 1)
    {
    //本机作为子服务器,登陆到其它服务器
    if(pUserName->Compare(m_strCurrentUserName) == 0 && m_strCurrentUserName.GetLength() != 0)
    {
    CFormViewUserState *pView = (CFormViewUserState*)m_wndSplitter.GetPane(0,1);
    pView->UpdateServerState();
    }
    }
    //---------------------------------------------------
    }CMainFrame类接收左视图发送的消息,再得到右视图的指针,调用右视图的公有成员函数更新右视图。
      

  3.   

    pFrame = (CRightView *)AfxGetApp()->GetMainWnd();这个样的方法是带有歧义的,以为如果用了SplitWnd后,这个Frame 未必就是你想要的,最简单的办法是你创建Frame的时候,保存Frame对象的指针,明确的向指定Frame发送消息,或者调用其成员