两个窗口是兄弟关系,能不能设置他们之间的ZOrder,使得一个窗口总是在另一个的上面?, 本帖最后由 u013058273 于 2013-12-26 09:04:12 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);hWndInsertAfter 设为HWND_TOPMOST 最好通过setower达到目的如果窗口类你可控制的话也可以响应void CVirtualKioskDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos){ if( lpwndpos->hwnd == this->m_hWnd ) { lpwndpos->hwndInsertAfter = hwndAwaysOntop; lpwndpos->flags |= SWP_NOACTIVATE; lpwndpos->flags &= ~SWP_NOZORDER; }//#endif CHtmlWidget::OnWindowPosChanging(lpwndpos);} 我用过这个函数了,效果不行。不是说设置ZOrder失败。而是:当我点击下面的窗口,操作系统首先把下面的窗口拖到最前来了,然后我再使用SetWindowPos来调整ZOrder,窗口又走下去了,这样造成了一个闪烁的效果缺陷。(就是说,他们的ZOrder曾经互换过)真正的拥有和被拥有的效果,无论你点击上面,或是下面的窗口,他们之间的ZOrder,是不会出现互换的过程的,一直保持上下关系的,不曾互换的。 我这里不能用SetOwner,因为,当其中owner窗口销毁,就销毁了owned窗口了。而这两个窗口,本身是兄弟关系,任何一个销毁,都不会导致另一个销毁的。至于你说的OnWindowPosChanging,我不是很懂你的过程做了什么。(而且这个是需要SetOwner吗?) 设置HWND_TOPMOST就更加不是我想要的效果了。这样会遮住别人的窗口。 所有popup类型的窗口 当它的zorder发生变化时 都会产生一个消息叫做WM_WINDOWPOSCHANGING我是假设你用的是MFC CDialog类那么你可以用IDE添加对于这个消息的响应函数 然后重写响应函数hwndAwaysOntop 指的是 你希望永远位于上边的窗口句柄这个操作 无需setowner 假设这两个窗口分别为A和B,B始终位于A的前面,那么A处理WM_ACTIVE消息时,判断A是否被激活,如果被激活的话,就调用SetAcitveWindow函数,参数为B窗口的句柄,将B窗口设置为激活状态 请教一个关于dll的问题 如何获取 Silverlight Slider 游标的位置 MFC高手请进 USB摄像头侦测的问题 GDI+库与其他引入的库定义冲突 请高手进来看看关于类模板和模板类的问题<高级,深入,特化> 怎样判断两个数据类型是否一样 关于如何采集考勤机数据的问题 CControlBar的一个问题 在主窗口中能显示文本吗? MFC重绘问题 关于Win32通用控件的TreeView节点图片的问题
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags
);
hWndInsertAfter 设为
HWND_TOPMOST
如果窗口类你可控制的话
也可以响应
void CVirtualKioskDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
if( lpwndpos->hwnd == this->m_hWnd )
{
lpwndpos->hwndInsertAfter = hwndAwaysOntop;
lpwndpos->flags |= SWP_NOACTIVATE;
lpwndpos->flags &= ~SWP_NOZORDER;
}//#endif
CHtmlWidget::OnWindowPosChanging(lpwndpos);
}
真正的拥有和被拥有的效果,无论你点击上面,或是下面的窗口,他们之间的ZOrder,是不会出现互换的过程的,一直保持上下关系的,不曾互换的。
我是假设你用的是MFC CDialog类
那么你可以用IDE添加对于这个消息的响应函数 然后重写响应函数
hwndAwaysOntop 指的是 你希望永远位于上边的窗口句柄
这个操作 无需setowner