创建一个派生自CDialog的窗口pParent和一个派生自CWnd的窗口pChild,然后调用pChild->SetParent(pParent)设置父窗口。
调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?还要添加什么吗?

解决方案 »

  1.   

    方法只有一个,就是在父窗口的OnMove()中MoveWindow()子窗口
      

  2.   

    父窗口移动时子窗口也随着移动?在父窗口的OnMove()中调用SetWindowPos()也可
      

  3.   

    建议用 Semigod()的,可以自己将两种方法都试试
      

  4.   

    如果是WS_CHILD的子窗口,不用处理也会随着父窗口移动
      

  5.   

    回复人: vocanicy(刺客)
    对啊,我也是这么想的,也是这么做的,但framework并没有自动调用子窗口的OnMove消息处理函数,不知为什么?
      

  6.   

    你把子窗口创建的代码贴出来看看// 但framework并没有自动调用子窗口的OnMove消息处理函数,不知为什么?
    移动父窗口,子窗口是不会接收到WM_MOVE消息因为WM_MOVE是发送给父窗口的
      

  7.   

    不知道你的子窗口多不多?如果多或需要长期使用,应当在父窗口类中维护一个指针列表,存储其子窗口的指针,并在其子窗口注册时将其指针存放到该列表中,(当然子窗口注销时也要在通知其父窗口将其指针删除)如此不但可在OnMove中处理其子窗口的位置,还可以在一系列操作中对其子窗口操作。
    MFC代码就是这样实现的。
      

  8.   

    创建一个窗口:
    // class CPlayWnd : public CWnd
    CPlayWnd* pPlayWnd = new CPlayWnd;
    ASSERT(pPlayWnd);
    pPlayWnd->Create(
    NULL,
    chNew.strName,
    WS_CHILD,
    CRect(0, 0, 352, 288),
    pPlayWnd->GetDesktopWindow(),
    1234
    );创建另一个窗口:
    // class CFourPlayWndFrm : public CDialog
    CFourPlayWndFrm* pFourPlayWndFrm = new CFourPlayWndFrm;
    ASSERT(pFourPlayWndFrm);
    pFourPlayWndFrm->Create(
    IDD_FOURPLAYWNDFRM,
    pFourPlayWndFrm->GetDesktopWindow()
    );需要时,将pFourPlayWndFrm设为pPlayWnd的父窗口:
    pPlayWnd->SetParent(pFourPlayWndFrm);
      

  9.   

    创建一个派生自CDialog的窗口pParent和一个派生自CWnd的窗口pChild,然后调用pChild->SetParent(pParent)设置父窗口。
    调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?
    --------------------------------------------------
    因为父窗口是放在桌面上的(桌面是父窗口的父窗口),拖动父窗口时,其相对于桌面(父窗口的父窗口)发生了移动,故系统发送WM_MOVE消息,调用父窗口的OnMove消息处理函数;此时尽管子窗口相对于桌面(子窗口的祖父窗口?)发生了移动,但相对于父窗口并没有发生移动,因此系统不会发送WM_MOVE消息给子窗口,子窗口的OnMove函数当然不被调用。
    因此,系统应当是按照下述方法判断窗口是否移动的:相对于其父窗口是否发生移动,而不是相对于桌面,除非桌面为窗口默认的父窗口。
    不知我的理解是否正确?
    如果是WS_CHILD的子窗口,不用处理也会随着父窗口移动
    -----------------------------------------------
    认真调试了,你是对的。多谢。
    为什么当销毁一个父窗口时,程序会自动销毁其子窗口,而移动父窗口时却不会自动移动子窗口?
    ----------------------------------------
    移动父窗口时也会自动移动子窗口。
      

  10.   

    还发现:调用MoveWindow()并不必然导致系统调用OnMove()消息处理函数,只有当新的位置与当前位置不同时才调用OnMove().