如何实现:父窗口移动时子窗口也随着移动?

eivanlee 2004-01-02 11:29:23
创建一个派生自CDialog的窗口pParent和一个派生自CWnd的窗口pChild,然后调用pChild->SetParent(pParent)设置父窗口。
调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?还要添加什么吗?
...全文
1601 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
eivanlee 2004-01-07
  • 打赏
  • 举报
回复
还发现:调用MoveWindow()并不必然导致系统调用OnMove()消息处理函数,只有当新的位置与当前位置不同时才调用OnMove().
eivanlee 2004-01-07
  • 打赏
  • 举报
回复
创建一个派生自CDialog的窗口pParent和一个派生自CWnd的窗口pChild,然后调用pChild->SetParent(pParent)设置父窗口。
调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?
--------------------------------------------------
因为父窗口是放在桌面上的(桌面是父窗口的父窗口),拖动父窗口时,其相对于桌面(父窗口的父窗口)发生了移动,故系统发送WM_MOVE消息,调用父窗口的OnMove消息处理函数;此时尽管子窗口相对于桌面(子窗口的祖父窗口?)发生了移动,但相对于父窗口并没有发生移动,因此系统不会发送WM_MOVE消息给子窗口,子窗口的OnMove函数当然不被调用。
因此,系统应当是按照下述方法判断窗口是否移动的:相对于其父窗口是否发生移动,而不是相对于桌面,除非桌面为窗口默认的父窗口。
不知我的理解是否正确?


如果是WS_CHILD的子窗口,不用处理也会随着父窗口移动
-----------------------------------------------
认真调试了,你是对的。多谢。


为什么当销毁一个父窗口时,程序会自动销毁其子窗口,而移动父窗口时却不会自动移动子窗口?
----------------------------------------
移动父窗口时也会自动移动子窗口。


eivanlee 2004-01-06
  • 打赏
  • 举报
回复
创建一个窗口:
// 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);
vollin 2004-01-06
  • 打赏
  • 举报
回复
不知道你的子窗口多不多?如果多或需要长期使用,应当在父窗口类中维护一个指针列表,存储其子窗口的指针,并在其子窗口注册时将其指针存放到该列表中,(当然子窗口注销时也要在通知其父窗口将其指针删除)如此不但可在OnMove中处理其子窗口的位置,还可以在一系列操作中对其子窗口操作。
MFC代码就是这样实现的。
vocanicy 2004-01-06
  • 打赏
  • 举报
回复
你把子窗口创建的代码贴出来看看

// 但framework并没有自动调用子窗口的OnMove消息处理函数,不知为什么?
移动父窗口,子窗口是不会接收到WM_MOVE消息

因为WM_MOVE是发送给父窗口的
eivanlee 2004-01-02
  • 打赏
  • 举报
回复
回复人: vocanicy(刺客)
对啊,我也是这么想的,也是这么做的,但framework并没有自动调用子窗口的OnMove消息处理函数,不知为什么?
vocanicy 2004-01-02
  • 打赏
  • 举报
回复
如果是WS_CHILD的子窗口,不用处理也会随着父窗口移动
alfwolf 2004-01-02
  • 打赏
  • 举报
回复
建议用 Semigod()的,可以自己将两种方法都试试
carbon107 2004-01-02
  • 打赏
  • 举报
回复
父窗口移动时子窗口也随着移动?

在父窗口的OnMove()中调用SetWindowPos()也可
Semigod 2004-01-02
  • 打赏
  • 举报
回复
方法只有一个,就是在父窗口的OnMove()中MoveWindow()子窗口
eivanlee 2004-01-02
  • 打赏
  • 举报
回复
为什么当销毁一个父窗口时,程序会自动销毁其子窗口,而移动父窗口时却不会自动移动子窗口?
是否只有在文档/视图架构中移动父窗口才会自动移动子窗口?
upuper 2004-01-02
  • 打赏
  • 举报
回复
up
这篇文章包含一个 demo project,一个继承于 CListCtrl 的类和一个快速查看这个类功能的 release。我 不想让这个类十全十美,但对于我当前的项目来讲,它的功能已经足够了。当然了,它还有更进一步完善 的地方,欢迎指正! 左图是程序演示的示例图片。 类 CDragDropListCtrl 具有以下的功能和特性: 1、支持单选和复选的任意托拽 2、所选择的托拽目标跟随这鼠标突现式的移动 3、当把目标托出上下边界的时候,List Control 会自动滚动 4、以 LVS_EX_FULLROWSELECT 风格的开关方式运行、 5、保存所托拽目标的状态 6、所有的代码都封装在 control 当中-无需修改类 本类源自 Wayne Berthin 以前写过的一篇文章,但我重写了大部分代码,并且又增加了很多。 CreateDragImageEx 方法跟 Frank Kobs 所给 出的大致相同,但修复了一个小的 bug 以便于程序能更好的运行。 要使用这个类,首先要把 DragDropListCtrl.cpp 和 DragDropListCtrl.h 两个文件添加到你的工程当中, 然后在你的对话框资源中增加一个 List Control,并设置 View 方式为 Report,用 ClassWizard 为这个 List Control 添加一个变量,变量的 类别为 Control,变量类型为 CDragDropListCtrl,最后,把下面一行加到你的对话框头文件的顶部: #include "DragDropListCtrl.h" 这样就大功告成了! MFC 窗口位置管理详细分析及实例 在一般用 MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有 W

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧