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了,希望大牛们给予一定的提示。