1. 程式人生 > >Dialog上的List Control獲得焦點時,視窗切換後不顯示

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

沒有看清楚問題,你整理下再提問吧

#2樓 得分:0回覆於:2007-07-20 12:51:33

那我把http://topic.csdn.net/t/20010509/15/115868.html裡的描述整理一點過來吧:
我的窗口裡有個CTabCtrl,通過這個控制顯示幾個CListCtrl,有時視窗切換時類表框沒有顯示,但單擊時顯示選中的一條.不知有沒有辦法解決?  
當視窗切換---從另一個程式視窗切換到這個程式的視窗或本程式的模式對話方塊關閉,本視窗成為活動視窗時,列表框 "有時 "不顯示.
然後就可以接上我的解釋了。

#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),沒有手動去重繪.

#5樓 得分:0回覆於:2007-07-23 12:43:26

說來我的情況還是不同。我用的是在VCKBase上找到的一個CCoolTabCtrl,類似於CPropertyPage一樣,直接往上AddPage就可以了,但它可以把任何CWnd作為其Page。我往它的例子程式里加了個CListCtrl,卻沒有這個問題。

  • husoso使用者頭像
  • (天使的貓也一樣)
  • 等 級:

#6樓 得分:0回覆於:2008-05-16 17:02:25

同樣遇到這個問題,父對話方塊重繪而子對話方塊的control沒有重繪

  • nietsche使用者頭像
  • (nietsche)
  • 等 級:

#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, 把解決辦法發出來別讓其他同學和咱們一樣浪費大把時間了.....