程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何避免多控件窗體重新布局時閃爍(2)

如何避免多控件窗體重新布局時閃爍(2)

編輯:關於C語言

如何依葫蘆畫瓢?

要知道不是每個控件類都有提供BeginUpdate和EndUpdate方法,所以需要自己親自打造一個

1. SendMessage如何來? 從Windows api interop而來,很簡單,有個工具可以提供所有api函數到c#方法的轉換: P/Invoke Interop Assistant

2.11這個定義以及類似的東東怎麼找? 強大的google或者bing可以幫忙 :D

至於代碼怎麼寫,就不需要偶來操刀啦 :D

後記:

這樣處理之後,是不是發現閃爍從此就不再出現了?但是……還有問題

拿一個無邊框窗體舉例,當它從Normal狀態變為Maxmized(順便設置TopMost為true),你會很高興看到該窗體包含的子控件真的不閃了,從Maxmized回到Normal時,也不閃了,但是很詭異的問題發生了: 任務欄不見了?取而代之的是當前窗體的背景色??? 難道任務欄沒有重繪回來???

發生什麼事情了? 不是只讓窗體的重繪停止了嗎,怎麼會影響到任務欄窗口?

ok,解決辦法是有的,發個消息給任務欄窗口讓它強制重繪,怎麼寫?

同樣,對於.Net中的任何控件,都自帶Invalidate方法,通過調用該方法,可以強制重繪控件的整體或某矩形部分, 又要畫瓢啦

在Invalidate中可以看到這麼一行

SafeNativeMethods.RedrawWindow(new HandleRef(this.window, this.Handle), (NativeMethods.COMRECT) null, NativeMethods.NullHandleRef, 0x85);

現在的問題是,如何獲取任務欄窗口句柄?  bing一把就會發現,很簡單: FindWindow(“Shell_TrayWnd”, “”);

ok, 後面的事情就簡單啦

再後記

不難發現,Control對象其實是自帶BeginUpdateInternal方法的,但m$很惡毒的把它弄成internal的了… 而且只被少數幾個控件享用: ListVIEw,

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved