刷新,当然是要通过Win32的刷新机制,也就是说最终要走到OnPaint函数里面去!
最简单的办法就是在A中想B窗口发送WM_PAINT消息。你通过B的函数来刷新,最终不还是要在这个函数中Invalidate或者InvalidateRect或者UpdateWindow来发送WM_PAINT消息嘛?在你满足刷新条件的时候,直接在A中PsotMessage(B.m_hWnd,WM_PAINT,0,0)即可另外,你提到的会出错,是不是B对象创建了,但是B的窗口还没来得及创建?

解决方案 »

  1.   


    首先我的窗口其实是一个窗口分割成的几个小窗口,类似一个“田”字,
    1、出现死机我查了有的是因为指针为空,或者句柄为空。
    2、还有一个问题,就是我从A调用B的函数,不知道为什么最后运行的是A中的函数,跟踪显示,指针是指向A的,但我明明是在B中的函数。好奇怪。
    代码
    A中:
    一个按钮响应函数
    {
    //获取B窗口的指针
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    CMyB *pView2 = (CMyB*)pMainFrame->GetActiveView();
    pView2->fun();
    }B中的函数
    fun
    {
    this->InvalidateRect(NULL);
    }
    B中函数this显示的是指向A的,但我明明是写在B中的代码。但显示每次的刷新都是A窗口。3、还有我从A中发送给B的WM_PAINT消息,都会死机。
    A中我是这样写的
    一个按钮响应函数
    {
    //获取B窗口的指针
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    CMyB *pView2 = (CMyB*)pMainFrame->GetActiveView();
    pView2->OnPint();
    }
      

  2.   

    我在A中用的:
    A中PsotMessage(B.m_hWnd,WM_PAINT,0,0);有问题
    我改成这样到时可以了:
    A rb;
    ::PostMessage(rb.m_hWnd,WM_PAINT,0,0);但是A中我绘图用的OnDraw(),改为OnPoint();窗口会一直在那闪烁?????咋回事?
      

  3.   

    在A中给B发消息发成自定义的,然后再B中写个回调函数来处理这个消息,函数中的内容就是刷新界面
      

  4.   


    比如说?
    我写的一个刷新函数,明明是在B中写的this竟然指向的是A。
      

  5.   

    造假, 既然你要OnSize消息的效果, 就发送WM_SIZE消息,让他走WM_SIZE消息的流程,去刷新
      

  6.   

    A中:
    一个按钮响应函数
    {
    //获取B窗口的指针
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    CMyB *pView2 = (CMyB*)pMainFrame->GetActiveView();
    pView2->fun();
    }B中的函数
    fun
    {
    this->InvalidateRect(NULL);
    }
    B中函数this显示的是指向A的,但我明明是写在B中的代码。但显示每次的刷新都是A窗口。
    -------------------------------------------------------------------------------------------------------------------
    你的A是不是也是一个view?? 如果是,那么就是pMainFrame->GetActiveView()的问题了,由于你当前类A处于选中状态(ActiveView),所以CMyB *pView2 = (CMyB*)pMainFrame->GetActiveView();这句获取的pView2始终指向A如果你的A和B都是view的话,你这个设计本身就存在问题:多文档视图框架的各个视图之间最好不要有任何联系,毕竟每个视图都应该是一个完整的功能,更何况,当A处于Active状态下,通过A去控制B刷新,框架中A依然是Active状态,B刷没刷新我们是看不到任何效果的,除非你手动单击标签页B让B出去Active状态(或者通过代码控制,但这样一来逻辑就变的相当复杂,没有任何通用性可言)
      

  7.   

    出现死机我查了有的是因为指针为空,或者句柄为空
    ----------------------------------------------------------------------------------
    编写代码一定要保证代码的健壮性,指针一定要判断它的合法性(NULL); HWND要判断它的有效性(::IsWindow())
    我在A中用的:
    A中PsotMessage(B.m_hWnd,WM_PAINT,0,0);有问题
    我改成这样到时可以了:
    A rb;
    ::PostMessage(rb.m_hWnd,WM_PAINT,0,0);
    --------------------------------------------------------------------------------------
    我怎么有点迷糊呢?你不是要刷新B吗?刷新B有问题你就去刷新A了??
    有问题要查清楚是哪里出了问题呀,A中PsotMessage(B.m_hWnd,WM_PAINT,0,0)这句我只是举个例子,实际编码中要根据你的代码来确定,总之就是要先得到B实例对象的窗口句柄HWND,有了窗口句柄HWND就可以向该窗口发消息了。
    但是A中我绘图用的OnDraw(),改为OnPoint();窗口会一直在那闪烁?????咋回事?
    ---------------------------------------------------------------------------------------------------------------------------------------------
    1、貌似你对Win32绘图基本原理了解的不多
    2、CView/CFormView等MFC的视图类的刷新是通过先调用OnPaint,并在OnPaint中调用OnDraw(&dc)来实现的,仅从这一点,你就应该知道,你不需要把绘图用的OnDraw(),改为OnPaint():OnPaint由基类调用,由于OnDraw是个虚函数,所以当基类的OnPaint函数调用OnDraw的时候,自然而然就调到你的A类的OnDraw函数了!另外,就从你的这个思路触发,在类A中去处理WM_PAINT消息也是可以的,但是你必须要搞清楚上面我提到的原理先!
    问题1:你给类A添加了WM_PAINT消息映射了吗?
    问题2:你的类A中OnPaint函数怎么写的?
      

  8.   

    是啊,我的这个是单文档弄的,窗口切割为一个“田”字,基类都是CFormView,你说的这个我明白了,但我找不到什么好发办法,进行刷新,网上的窗口通信刷新都是用的
    pDoc->UpdateAllViews(NULL); //更新所有视图
    但我已经尽量弄了,还是很闪烁,这个和二次缓冲没有什么关系,
    我现在就是通过全局变量传递值,然后再调用一个刷新函数,显示传递的数据。
      

  9.   

    加WM_SIZE好像没有反应???????
    CB rb;
    ::PostMessage(rb.m_hWnd,WM_SIZE,0,0);
      

  10.   

    上面写错,
    A中
    B rb;
    ::PostMessage(rb.m_hWnd,WM_PAINT,0,0);另外在B中如果我是在OnDraw()中绘图,然后添加了OnPaint函数,即便是OnPaint函数中什么都不写,窗口都只显示背景了,没有显示OnDraw()的绘图。
    其实我现在想实在的效果很简单:
    就是一个分割窗口,中几个窗口之间传递数据,我不使用窗口通信,我想通过定义全局变量进行传递值,然后将传递的数据效果当场刷新显示出来。也就是A窗口给B窗口传递了一个值,然后显示传递的值,数据绘图的效果。
    在A给B传递值以后,B现在是没有显示传递的数据效果的,需要改变B的窗口大小一下,才会显示,所以需要一个同样效果的刷新函数。
      

  11.   

    定义CB类的方法肯定不行,通过获取B类指针调用可以,但A和B必须在同一线程中,否则必须通过消息,让B自己执行刷新。
      

  12.   

    另外在B中如果我是在OnDraw()中绘图,然后添加了OnPaint函数,即便是OnPaint函数中什么都不写,窗口都只显示背景了,没有显示OnDraw()的绘图。
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    前面我不是说了嘛,CView/CFormView等MFC的视图类的刷新是通过先调用OnPaint,并在OnPaint中调用OnDraw(&dc)来实现的,所以如果你在B view类中出处理WM_PAINT消息,你必须在B的OnPaint中手动调用OnDrawvoid CView::OnPaint()
    {
    CPaintDC dc(this);
    //OnPrepareDC(&dc);
    OnDraw(&dc);
    }也正如我前面说的,你不需要在B中处理WM_PAINT消息,直接重载OnDraw函数即可,让WM_PAINT消息在基类CView中处理我的这个是单文档弄的,窗口切割为一个“田”字,基类都是CFormView
    -------------------------------------------------------------------------------------------------------
    卧槽!原来是单文档视图,我以为多文档视图呢!!
    既然是单文档的,你为嘛要CMyB *pView2 = (CMyB*)pMainFrame->GetActiveView();来获取B窗口的指针??显然你没有搞清楚文档视图框架具体是啥意思,这个需要你下去好好看一下,我就不赘述了这样一来就好弄了啊,在一个视图当中切割(创建)多个子窗口,这个创建逻辑你总知道的吧,你只需要保存你创建出来的类对象的指针即可,不管是用全局变量还是类成员变量都可以另外,你的类A和类B都是作为子窗口创建在一个视图View上的吧,那么不要把A和B派生于CFormView,窗口类你只需要派生于CWnd或者你自己裸写一个Win32窗口类都行!毕竟CFormView/CView/CHtmlView等这些类是一种视图类,是用在文档视图框架上的
      

  13.   

    定义CB类的方法肯定不行,通过获取B类指针调用可以,但A和B必须在同一线程中,否则必须通过消息,让B自己执行刷新。
    B类自己刷新?
    比如说怎么刷新??
      

  14.   

    刚开始因为要在上面添加按钮所有就直接派生CFormView
    这样一来就好弄了啊,在一个视图当中切割(创建)多个子窗口,这个创建逻辑你总知道的吧,你只需要保存你创建出来的类对象的指针即可,不管是用全局变量还是类成员变量都可以
    ----------------------------------------------------------------------------------------------------------------
    这个就是在切割窗口的时候用全局变量分别保存几个窗口的指针对吧,
    我刚刚试试可以哦,本来在没有提问以前我就用过这个方法了,没有成功,没想到现在成功了
      

  15.   

    这个就是在切割窗口的时候用全局变量分别保存几个窗口的指针对吧
    ------------------------------------------------------------------------------------------------------------
    如果你的程序简单的话用全局变量是可以的,但还是建议最好不要用全局变量,显不出逻辑关系。
    你不是要在A中访问B嘛,那么可以在A中保存B对象指针(B指针变量作为A的成员变量)