关于控件窗口重叠时的显示问题(三个问题,一个20分)

hityct1 2008-01-14 07:57:51
关于控件窗口重叠时的显示问题(三个问题,一个20分)
1)动态创建的控件如何设置谁显示在前,谁显示在后?
静态创建的控件可以按ctrl+d调整显示先后(也就是调整谁覆盖谁问题),那么我用动态创建(即使用Create创建的)的控件如何调整呢?以及静态创建的控件和动态创建的控件之间的显示先后又该怎么调整呢?

2)我们使用ctrl+d调整后,深层变化是什么吗?
我试了一下,使用ctrl+d调整显示先后以后,控件在.rc文件(对话框资源)中的顺序发生变化。造成了显示先后的改变深层原因是什么呢?是消息队列的次序改变?请高手回答。最好有代码解释。推荐一下这个方面问题材料也行。

3)我的实际问题:
我创建的MFC单文档程序,并用CSplitterWnd在CMainFrame::OnCreateClient创建了分割窗口,左右两个,其中右面的窗口是CFormView。在这个view中有三类控件:静态创建的tab控件,静态创建listctrl控件,动态创建的listctrl控件。三个控件重叠。问题是:
我在用鼠标调整分割窗口(注意:是调整“分割窗口”,也就是拖动两个窗口间的分割线。不是调整整个程序的大小)时,动态创建的listctrl控件显示不正确。现象如下:
如果动态创建的listctrl控件没有item被选中(或不是焦点)时,拖动时显示没有问题;但当动态创建的listctrl控件有item被选中(或是焦点)时,显示出现问题(此时似乎被tab控件覆盖了,但点击动态创建的listctrl控件的item,还是能选中的)。
这是什么原因?请解释。
其实静态创建的listctrl控件控件也有类似问题,但是通过ctrl+d调整后可以解决。

三个问题其实本质是同一个问题。

另外:谁能推荐一下外国的能回答编程类问题的英文网站?如果没人能回答上面三个问题,这个也能给分,免得浪费分数。要人气旺的好网站。
...全文
1060 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hityct1 2008-01-25
  • 打赏
  • 举报
回复
需要通知父窗口,他的子控件的z-order改变了。需要父窗口重画。

void CDanDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

if(bIs == true)
{
m_b4.SetWindowPos(&wndBottom,0,0,0,0,SWP_NOMOVE ¦SWP_NOSIZE);
m_b1.SetWindowPos(&wndTop ,0,0,0,0,SWP_NOMOVE ¦SWP_NOSIZE);
m_b2.SetWindowPos(&wndTop ,0,0,0,0,SWP_NOMOVE ¦SWP_NOSIZE);
m_b3.SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE ¦SWP_NOSIZE);

m_b2.MoveWindow(0,0,200,100);
m_b4.MoveWindow(0,0,400,50);
m_b1.MoveWindow(0,0,100,200);
m_b3.MoveWindow(0,0,50,400);
RedrawWindow();//通知重画

}
}
hityct1 2008-01-16
  • 打赏
  • 举报
回复
还没有解决,哪位回答一下?
flyingwow99 2008-01-14
  • 打赏
  • 举报
回复
1。同2楼
2。CTRL-D改变的是在rc文件中控件的排列顺序,也是根据窗口模板创建窗口后控件的tab顺序,也是它们的z-order顺序,也是WINDOWS绘制它们的顺序,也是WINDOWS检查点击是哪个控件的顺序
3。此时似乎被tab控件覆盖了-------- 显示不正确,那是因为TAB控件默认没有WS_CLIPSIBLING风格,这是微软为了省事搞的,没有这种风格而控件重叠时绘制会不正确的。。。。
但点击动态创建的listctrl控件的item,还是能选中的-----------动态创建的控件在Z-ORDER最顶,根据ME的第2点回答,WINDOWS能够正确判断当前点击的控件
junheng 2008-01-14
  • 打赏
  • 举报
回复
第一个问题:使用 SetWindowPos函数进行调整;
第二个问题:资源读取顺序问题;
第三个问题:解决办法有两个,一个是静态创建一个框架静态控件,让你动态创建的listctrl控件时刻在那个位置显示;并且如2楼大哥所说,重载WM_SIZE响应。另外,使用SetWindowPos将这个控件永远设置在主窗口最前方(或者是ModifyStyle函数)。
iyranly 2008-01-14
  • 打赏
  • 举报
回复
http://www.codeproject.com/script/Forums/View.aspx?fid=1647
你进去看,mfc是最火的!其次是c#,再就是asp.net
Yofoo 2008-01-14
  • 打赏
  • 举报
回复
1. SetWindowPos调整

2. 只是rc资源文件内容中数据的顺序, ... Windows按顺序处理而已

3. 从现象看,不怎么好判断, 自己调试吧
jameshooo 2008-01-14
  • 打赏
  • 举报
回复
1、SetWindowPos
2、控件在对话框模板中的顺序就是TAB顺序,用ctrl-D重新设置顺序将引起模板中的顺序重排,没有别的影响,对话框创建之后也是按照模板中的顺序来的
3、在CFormView::OnSize中重新计算并调整各个子窗口的位置,最好不要重叠,因为用户点击会导致子窗口的Z-order发生改变,随时会发生窗口被覆盖的现象,除非你经常调用SetWindowPos重设Z-order

www.codeproject.com
www.codeguru.com
msdn.microsoft.com
Torch009 2008-01-14
  • 打赏
  • 举报
回复
算了不回答问题了,免得浪费你的分。
queshangxintou 2008-01-14
  • 打赏
  • 举报
回复
这个问题我确实没遇到过
不过说英文网站 我觉得www.codeproject.com
这个网站确实不错
楼主可以认真的去看看
jameshooo 2008-01-14
  • 打赏
  • 举报
回复
SWP_NOACTIVATE
hityct1 2008-01-14
  • 打赏
  • 举报
回复
做了个试验:
创建基于对话框程序,可改变大小的:
对话框有4个CButton.
button1,button2静态创建,button3,button4动态创建
在OnSize添加:

void CDanDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

if(bIs == true)
{
m_b4.SetWindowPos(&wndBottom,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
m_b1.SetWindowPos(&wndTop ,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
m_b2.SetWindowPos(&wndTop ,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
m_b3.SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

m_b2.MoveWindow(0,0,200,100);
m_b4.MoveWindow(0,0,400,50);
m_b1.MoveWindow(0,0,100,200);
m_b3.MoveWindow(0,0,50,400);

}
}

结果button4在最上。晕!!!!!!
焦点在button2
hityct1 2008-01-14
  • 打赏
  • 举报
回复
二楼对三个问题的答案,很有提示性。
“因为用户点击会导致子窗口的Z-order发生改变,随时会发生窗口被覆盖的现象,除非你经常调用SetWindowPos重设Z-order ”这句话提醒了我。
在OnSize加这句:
m_Tab.SetWindowPos(&wndBottom,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
问题解决。
我以前是加在OnInitialUpdate中的,不好使。


对于六楼的:
添加WS_CLIPSIBLING风格不好使。


第一个,第二个问题不甚满意。

15,980

社区成员

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

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