创建一个派生自CDialog的窗口pParent和一个派生自CWnd的窗口pChild,然后调用pChild->SetParent(pParent)设置父窗口。
调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?还要添加什么吗?
调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?还要添加什么吗?
解决方案 »
- 对话框编辑框变量如何在*Dlg.cpp外文件中赋值?
- 200分求一函数:把matalab函数转化为vc
- 对函数超时限定问题!
- RMB求购EVC开发界面控件
- 如何响应键盘上的分号键以及如何实现受手轮式的按钮
- 请问IOCP发送数据的问题
- VirtualProtectEx出错的问题!
- 如何让一个datetimepicker只显示年和月。
- pArgList = (char *) &szFormat + sizeof (szFormat) 请问这局句子是什么意思?谢谢
- 派生的CComboBox 类,执行到OnSelchange之后,出现Edit部分没有显示选择的部分
- 动态链接库怎样调试
- dll中可以调用FreeLibrary卸载自己吗?
对啊,我也是这么想的,也是这么做的,但framework并没有自动调用子窗口的OnMove消息处理函数,不知为什么?
移动父窗口,子窗口是不会接收到WM_MOVE消息因为WM_MOVE是发送给父窗口的
MFC代码就是这样实现的。
// 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);
调试时,拖动父窗口,系统调用pParent->OnMove,但却不调用pChild->OnMove,为什么?
--------------------------------------------------
因为父窗口是放在桌面上的(桌面是父窗口的父窗口),拖动父窗口时,其相对于桌面(父窗口的父窗口)发生了移动,故系统发送WM_MOVE消息,调用父窗口的OnMove消息处理函数;此时尽管子窗口相对于桌面(子窗口的祖父窗口?)发生了移动,但相对于父窗口并没有发生移动,因此系统不会发送WM_MOVE消息给子窗口,子窗口的OnMove函数当然不被调用。
因此,系统应当是按照下述方法判断窗口是否移动的:相对于其父窗口是否发生移动,而不是相对于桌面,除非桌面为窗口默认的父窗口。
不知我的理解是否正确?
如果是WS_CHILD的子窗口,不用处理也会随着父窗口移动
-----------------------------------------------
认真调试了,你是对的。多谢。
为什么当销毁一个父窗口时,程序会自动销毁其子窗口,而移动父窗口时却不会自动移动子窗口?
----------------------------------------
移动父窗口时也会自动移动子窗口。