Dialog上的List Control获得焦点时,窗口切换后不显示

merlinran 2007-07-20 11:45:38
使用环境和现象都跟http://topic.csdn.net/t/20010509/15/115868.html描述的一样。那里只是说“有时”会出现这种情况,我这里试验的结果是:如果List Control没有获得焦点,一切正常。只要获得了焦点,无论有没有记录被选中,当用其它窗口覆盖后,或者最小化再恢复,都不会显示了。

我试过很多办法,发现响应List Control的NM_SETFOCUS通知消息,在里面调用该Control的Invalidate(),可以将它显示出来。

ON_NOTIFY(NM_SETFOCUS, IDC_LIST_DEV_SERV, OnSetfocusListDevServ)

void DevServiceDlg::OnSetfocusListDevServ(NMHDR* pNMHDR, LRESULT* pResult)
{
m_devSvc.Invalidate();
*pResult = 0;
}

但这样的结果是边框没有了,就跟没选WS_BORDER风格一样,看起来很不舒服。我Spy++了一下,感觉应该是没有收到WM_NCPAINT,没有重绘非客户区域所致。

于是我找了一下哪些操作会发WM_NCPAINT,试了一下RedrawWindow()和ShowWindow(SW_SHOWNOACTIVATE),发现非但没有解决问题,反而回到最初的情况,整个List Control都不显示了。

但如果切换Tab再换回来,是可以显示的。这里的流程是:
ShowWindow(SW_SHOW);
UpdateWindow();
Invalidate();

我如法炮制,没有效果,因为窗口原来就是Visible的,ShowWindow()似乎不起作用。而我如果在前面加上ShowWindow(SW_HIDE),焦点又失去了。

对窗口和消息还是不熟悉,现在都在Program by Coincidence了,希望大牛们给予一定的提示。
...全文
613 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiams2000 2012-01-04
  • 打赏
  • 举报
回复
根据前人的总结:
这主要是系统重新绘制造成的
建立此类窗口时,大多会将tab和tree都作为对话框或框架窗口的子窗口
这就会有这样的问题,由于他们的地位是平等的,系统在绘制时,不知道他们的前后关系。
会产生绘制上的瑕疵
既然系统不知道它们的前后关系,我们是不是可以强制它们的关系呢?
所以就有我下面的解决办法:
void CCarPeccancyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect); //该函数获得窗体的大小。
if (m_TabCtrl.GetSafeHwnd())
{
// m_TabCtrl.MoveWindow(rect);
m_TabCtrl.SetWindowPos(&wndBottom,rect.left,rect.top,rect.right,rect.bottom,NULL);
}
}
wudi_baozi_tou 2010-03-16
  • 打赏
  • 举报
回复
两年了, 看来这问题真是老大难, MS也是杂就不修正一下!
我这两天写播放器同样遇到此问题, 网上搜无果只有自己动手了.
第1个办法有点笨, 就是在父窗口的onpaint里计算无效rect和clistctrl的窗口rect是否存在
交集, 如果有则计算交集rect, 然后invalidaterect之.
第2个办法是经过反复观察的结果, 我发现只有当父窗口重新得到焦点时clistctrl才出毛病.
所以在父窗口的wm_activate中强制刷新就好拉, 这个超简单哦, clistctrl::invalidaterect(NULL);
版本4.7, 把解决办法发出来别让其他同学和咱们一样浪费大把时间了.....
nietsche 2009-09-25
  • 打赏
  • 举报
回复
遇到一模一样的情况,不知楼主有解决了吗?还有,如果把主Dlg的ClipChildren属性选择,就不会出现这种情况,可是dlg获得焦点时,第一页却不能显示了;并且背景也变了,不知不知呀!
husoso 2008-05-16
  • 打赏
  • 举报
回复
同样遇到这个问题,父对话框重绘而子对话框的control没有重绘
merlinran 2007-07-23
  • 打赏
  • 举报
回复
说来我的情况还是不同。我用的是在VCKBase上找到的一个CCoolTabCtrl,类似于CPropertyPage一样,直接往上AddPage就可以了,但它可以把任何CWnd作为其Page。我往它的例子程序里加了个CListCtrl,却没有这个问题。
merlinran 2007-07-20
  • 打赏
  • 举报
回复
那我把http://topic.csdn.net/t/20010509/15/115868.html里的描述整理一点过来吧:

我的窗口里有个CTabCtrl,通过这个控制显示几个CListCtrl,有时窗口切换时类表框没有显示,但单击时显示选中的一条.不知有没有办法解决?
当窗口切换---从另一个程序窗口切换到这个程序的窗口或本程序的模式对话框关闭,本窗口成为活动窗口时,列表框"有时"不显示.

然后就可以接上我的解释了。
Big_Stone 2007-07-20
  • 打赏
  • 举报
回复
没有看清楚问题,你整理下再提问吧
xfinal2006 2007-07-20
  • 打赏
  • 举报
回复
我的方法是在ctabctrl中选中一个clistctrl时,就对它ShowWindow(SW_SHOW),其余的clistctrl()全部ShowWindow(SW_HIDE),没有手动去重绘.
WindAndSnow 2007-07-20
  • 打赏
  • 举报
回复
我的窗口里有个CTabCtrl,通过这个控制显示几个CListCtrl,有时窗口切换时类表框没有显示,但单击时显示选中的一条.不知有没有办法解决?
这个问题应该是背景色和你文本色一致造成的.因为你点中时它会显示和文本色不一样来表示选中和获得焦点.建议你重新设置背景色和文本色.SetBkColor()和SetTextColor()方法

15,980

社区成员

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

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