merlinran 2007年07月20日
Dialog上的List Control获得焦点时,窗口切换后不显示
使用环境和现象都跟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了,希望大牛们给予一定的提示。
...全文
550 点赞 收藏 9
写回复
9 条回复

还没有回复,快来抢沙发~

发动态
发帖子
界面
创建于2007-09-28

7970

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告