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

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

回复次数:8

#1楼 得分:0回复于:2007-07-20 12:19:06

没有看清楚问题,你整理下再提问吧

精华推荐:来讨论UTF-8编码问题,来者都送分

#2楼 得分:0回复于:2007-07-20 12:51:33

那我把http://topic.csdn.net/t/20010509/15/115868.html里的描述整理一点过来吧:
我的窗口里有个CTabCtrl,通过这个控制显示几个CListCtrl,有时窗口切换时类表框没有显示,但单击时显示选中的一条.不知有没有办法解决?  
当窗口切换---从另一个程序窗口切换到这个程序的窗口或本程序的模式对话框关闭,本窗口成为活动窗口时,列表框 "有时 "不显示.
然后就可以接上我的解释了。

精华推荐:关于FFT变换程序

#3楼 得分:0回复于:2007-07-20 18:22:31

我的窗口里有个CTabCtrl,通过这个控制显示几个CListCtrl,有时窗口切换时类表框没有显示,但单击时显示选中的一条.不知有没有办法解决?  
        这个问题应该是背景色和你文本色一致造成的.因为你点中时它会显示和文本色不一样来表示选中和获得焦点.建议你重新设置背景色和文本色.SetBkColor()和SetTextColor()方法

精华推荐:请问牛人:如何测量某个端口或者某个运行中的进程的网络流量?

#4楼 得分:0回复于:2007-07-20 20:46:01

我的方法是在ctabctrl中选中一个clistctrl时,就对它ShowWindow(SW_SHOW),其余的clistctrl()全部ShowWindow(SW_HIDE),没有手动去重绘.

精华推荐:iocp的问题,这次100分只给一个人

#5楼 得分:0回复于:2007-07-23 12:43:26

说来我的情况还是不同。我用的是在VCKBase上找到的一个CCoolTabCtrl,类似于CPropertyPage一样,直接往上AddPage就可以了,但它可以把任何CWnd作为其Page。我往它的例子程序里加了个CListCtrl,却没有这个问题。

精华推荐:将bmp图像绘制到多个picture上出现问题,为什么呢?

  • husoso用户头像
  • husoso
  • (天使的猫也一样)
  • 等 级:

#6楼 得分:0回复于:2008-05-16 17:02:25

同样遇到这个问题,父对话框重绘而子对话框的control没有重绘

#7楼 得分:0回复于:2009-09-25 14:51:52

遇到一模一样的情况,不知楼主有解决了吗?还有,如果把主Dlg的ClipChildren属性选择,就不会出现这种情况,可是dlg获得焦点时,第一页却不能显示了;并且背景也变了,不知不知呀!

#8楼 得分:0回复于:2010-03-16 12:28:18

两年了, 看来这问题真是老大难, MS也是杂就不修正一下!
我这两天写播放器同样遇到此问题, 网上搜无果只有自己动手了.
第1个办法有点笨, 就是在父窗口的onpaint里计算无效rect和clistctrl的窗口rect是否存在
交集, 如果有则计算交集rect, 然后invalidaterect之.
第2个办法是经过反复观察的结果, 我发现只有当父窗口重新得到焦点时clistctrl才出毛病.
所以在父窗口的wm_activate中强制刷新就好拉, 这个超简单哦, clistctrl::invalidaterect(NULL);
版本4.7, 把解决办法发出来别让其他同学和咱们一样浪费大把时间了.....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值