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

merlinran merlinran 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
使用环境和现象都跟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了,希望大牛们给予一定的提示。
...全文

相关推荐

评论 9
收藏 已收藏
分享
返回顶部
merlinran
界面 15,976 成员 115,866 内容