一个SDI程序,在CMainFrame中创建了一个CDialogBar的派生类,在CDialogBar上又创建了一个Tab控件,Tab控件中加入两页,第一页中创建一个ListBox控件,第二页中插入一个对话框,也就是说,结构是这样的:
CMainFrame
    |
     ----CDialogBar
             |
              ----Tab
                   |
                    ---ListBox
                   |
                    ---CDialog
上面的一层都是下面一层的父窗口问题是:我在ListBox中选择某一项的时候,如何在视图中作出响应,比如画圆,矩形等等。我该如何进行消息传递,和得到视图指针呢?
谢谢

解决方案 »

  1.   

    可以发送消息啊,用
    CMinFrame * pMainFrame=(CMinFrame *)GetParent((GetParent()->GetParent()))
    通过框架的指针就可以找到视图的指针了
      

  2.   

    CView* pView = AfxGetMainWnd()->GetActiveView();
      

  3.   

    对啊,SendMessage和PostMessage只需要知道要接收该消息的窗口就可以了,如果不怕指针结构,当视图创建出来之后,可以将它保存在CMainFrame中,这样可以很方便的得到视图指针,当然就可以很方便的发送消息.
    ListBox—>NM_CLICK—>调用(CMainFrame*)(::AfxGetMainWnd())->m_pView->SendMessage(....);
    总是能实现的,只不过做界面真的太麻烦了.
      

  4.   

    不知你怎么做的。直接Create,那调用时的指针很长哦。
    最简单的方式是全局变量。
    如选择了ListBox中的某一项,在其响应函数中设置全局变量,并使视图失效。
    在视图的OnDraw函数中,读取全局变量进行绘图。
    (CMyView *)AfxGetMainWnd()->GetActiveView()->Invalidate(true);
    至于ListBox的响应函数放在那儿,就看你是怎么做的了。
      

  5.   

    在视图里做个转换视图的成员函数,在你的控件所在的类中响应ListCtrl事件,调用视图的转换视图的成员函数就可以了.得到视图用:
    CView* pView = AfxGetMainWnd()->GetActiveView();