mfc窗口层次如何控制(类似的提问很多)

gl615 2011-09-07 05:35:24
用mfc创建一个窗口程序,主窗口为m_pMainDlg;

然后创建一个子窗口m_pChildDlg,其父为pMainDlg;

我想在窗口初始化后程序执行的任何时候,保持m_pMainDlg在m_pChildDlg的下面(层次关系上),当然m_pChildDlg不是模态框(要不然m_pChildDlg跟About对话框就没啥区别了),任何时候包括鼠标 左右中 键点击都不会破坏这个层次关系。
TopMost可以使m_pChildDlg永远在所有窗口上面,但这明显不是我期望的。
...全文
487 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-10-08
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
gl615 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jacky_qiu 的回复:]
把你的email给我,我把例子发给你看看。我的email:qiujiejia@gmail.com
[/Quote]

我的邮箱:gl_615@163.com

跟你发过一封信件了。
jacky_qiu 2011-09-11
  • 打赏
  • 举报
回复
把你的email给我,我把例子发给你看看。我的email:qiujiejia@gmail.com
yanganglove 2011-09-09
  • 打赏
  • 举报
回复
设置 WS_CHILD |WS_CLIPSIBLINGS|WS_CLIPCHILDREN

另外:层次关系类似于 千千静听的 主窗口和 子窗口(歌词窗口 或者 播放列表窗口 或者 均衡器窗口);

一般的具有体系的软件都很少用DLG,直接从CWND派生一个,然后在这上面CREATE 控件,虽然很麻烦。但如果每一个窗口如歌词窗口 或者 播放列表窗口 或者 均衡器窗口等其他很多的窗口都是一个DLG,那你的工程里不是会有一大片的DLG在VC的资源里,这种看到就恶心。
gl615 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jacky_qiu 的回复:]
照理,你的子对话框窗口应该永远在它的父窗口上面的。

1.你创建的子对话框应该是非模式对话框
2.创建时create你应该指定父窗口。

这里面其实涉及一个很容易被大家忽略但有挺关键的问题。
就是父窗口和拥有者窗口。

1.如果创建子窗口时,指定了WS_CHILD 且指定父窗口句柄,
那创建的子窗口会出现在父窗口里面,不能超出父窗口。

HWND hWnd=CreateWin……
[/Quote]

对于父窗口和子窗口来说 WS_POPUP属性和SetOwner 没起作用啊,不知道你有尝试过吗。?
gl615 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jacky_qiu 的回复:]
我不知道你的情况是怎样的,但我的例子是可以的。你试一下吧!

http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/OwnWnd.zip (请不要使用下载工具)
[/Quote]

压缩包损坏了。。。
jacky_qiu 2011-09-09
  • 打赏
  • 举报
回复
我不知道你的情况是怎样的,但我的例子是可以的。你试一下吧!

http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/OwnWnd.zip (请不要使用下载工具)
gl615 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jacky_qiu 的回复:]
你是不是对话框程序。如果是对话框程序,不需要那么复杂。
我测试的代码:


void CDemoDlg::OnButton1()
{
CDemoDlg* p=new CDemoDlg();
p->Create(IDD_DEMO_DIALOG,NULL);
p->ShowWindow(SW_SHOW);


}

弹出的对话框永远在父窗口上面。

这里有个问题就是我设……
[/Quote]


你把 “子窗口”的父设置为Null的话,在点击OK后,弹出确实在 “父窗口”的上面,但仅限于 执行完ShowWindow后呀。。。。
用鼠标 左键、右键、中键 都可以破坏这个 羸弱的层次关系,我的期望是 保持这个层次关系在 初始化程序后的所有时间啊。


层次关系类似于 千千静听的 主窗口和 子窗口(歌词窗口 或者 播放列表窗口 或者 均衡器窗口);
jacky_qiu 2011-09-09
  • 打赏
  • 举报
回复
你是不是对话框程序。如果是对话框程序,不需要那么复杂。
我测试的代码:


void CDemoDlg::OnButton1()
{
CDemoDlg* p=new CDemoDlg();
p->Create(IDD_DEMO_DIALOG,NULL);
p->ShowWindow(SW_SHOW);


}

弹出的对话框永远在父窗口上面。

这里有个问题就是我设置父窗口为NULL,为什么还有父子关系呢?
请看mfc的代码:
BOOL CDialog::CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd,
void* lpDialogInit, HINSTANCE hInst)
{
ASSERT(lpDialogTemplate != NULL);

if (pParentWnd == NULL)
pParentWnd = AfxGetMainWnd();
m_lpDialogInit = lpDialogInit;

return CreateDlgIndirect(lpDialogTemplate, pParentWnd, hInst);
}


if (pParentWnd == NULL)
pParentWnd = AfxGetMainWnd();
也就是说如果父窗口为空,程序会把父窗口设置为整个程序的主窗口 AfxGetMainWnd();

由于是创建对话框,所以没有涉及CreateWindow,而是 CreateDlgIndirect 。我上面说错了,抱歉。
jacky_qiu 2011-09-08
  • 打赏
  • 举报
回复
照理,你的子对话框窗口应该永远在它的父窗口上面的。

1.你创建的子对话框应该是非模式对话框
2.创建时create你应该指定父窗口。

这里面其实涉及一个很容易被大家忽略但有挺关键的问题。
就是父窗口和拥有者窗口。

1.如果创建子窗口时,指定了WS_CHILD 且指定父窗口句柄,
那创建的子窗口会出现在父窗口里面,不能超出父窗口。

HWND hWnd=CreateWindowEx(WS_EX_TOPMOST|WS_EX_TOOLWINDOW,TEXT("Edit"),text ,
WS_CHILD|WS_VSCROLL|WS_HSCROLL|
ES_AUTOHSCROLL|ES_WANTRETURN|ES_MULTILINE ,
100,100,400,400,
ParentWnd,NULL,NULL,NULL);

2.如果创建子窗口时,指定WS_POPUP,且指定了父窗口的句柄。
那这时的子窗口会永远在“父窗口”上面,且可以在父窗口的外面。
此时准确点说,“父窗口”是子窗口的拥有者。
可以用spy++查看。里面就有这个窗口拥有者的选项。

HWND hWnd=CreateWindowEx(WS_EX_TOPMOST|WS_EX_TOOLWINDOW,TEXT("Edit"),text ,
WS_POPUP|WS_VSCROLL|WS_HSCROLL|
ES_AUTOHSCROLL|ES_WANTRETURN|ES_MULTILINE ,
100,100,400,400,
ParentWnd,NULL,NULL,NULL);

建议看这篇文章,你会学到很多关于窗口的知识。
http://blog.csdn.net/guogangj/article/details/3460267

如果搞不掂可以email我,qiujiejia@gmail.com

gl615 2011-09-08
  • 打赏
  • 举报
回复
别沉啊。。。
gl615 2011-09-08
  • 打赏
  • 举报
回复
顶下。
  • 打赏
  • 举报
回复
设置窗口的类型为Child
gl615 2011-09-07
  • 打赏
  • 举报
回复
层次关系类似于 千千静听的 主窗口和 子窗口(歌词窗口 或者 播放列表窗口 或者 均衡器窗口);
康斯坦汀 2011-09-07
  • 打赏
  • 举报
回复
子窗体父窗体跟谁在上面谁在下面没有关系吧?
gl615 2011-09-07
  • 打赏
  • 举报
回复
自己顶下。。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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