如何依葫蘆畫瓢?
要知道不是每個控件類都有提供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,