我是乙個懶人,我不願意創造乙個又乙個的輪子......前面剛說過statusbar,裡面可以有文字,還可以有圖示(icon).本來我以為能解決我們的需求了,結果老大居然還要在上面放乙個......
找了好長時間,沒找到怎麼把bitmap(或者類似)的東西變成hicon,如果能變成hicon,那麼問題就解決.
沒找到就另外想辦法,管他三七二十一,往上畫.甭管你是sendmessage傳送乙個hicon上去,還是怎麼怎麼地,到了wndproc這裡,就只有wm_paint訊息了;或者就是生硬的給hdc上面畫.
先試了一下直接給hdc上面畫,也比較簡單,無非就是從控制項的hwnd獲取到控制項的hdc(通過getdc(hwnd)獲得),然後巴拉巴拉畫了上去.可是statusbar有自己的訊息處理(即視窗過程),一旦send乙個message,statusbar就會重繪,然後我畫上去的東西就沒了....杯具....
網上繼續找,找到一篇文章,比較有用,"如何在 cstatusbar 窗格顯示位圖",來自msdn的原文, .其實就是重寫cstatusbar的重繪函式.而我的工程不支援mfc(原諒我比較小白,不知道怎麼向atl工程裡面新增mfc支援),而且如果繼承那個cstatusbar,又會產生一大坨**,而且二進位制也會比較大......其實我只要截獲wm_paint,有必要這麼麻煩麼??
以前看到過文章,windows有api可以獲取到視窗的視窗過程,而且還能替換,如果能那麼做,不就完事了唄.查了一下,果真有api:
long getwindowlong( hwnd hwnd, int nindex);
long setwindowlong( hwnd hwnd, int nindex, long dwnewlong);
而對我來講,我無非就是先拿到statusbar的預設視窗過程,然後換上我自定義的即可:
static wndproc m_oldproc=null;
static wndproc m_newproc=null;
lresult mystatusbarproc(hwnd hwnd,
uint msg,
wparam wparam,
lparam lparam );
//初始化之後就不要管他了
m_oldproc=(wndproc)::getwindowlong(m_statusbar, gwl_wndproc);
m_newproc=mystatusbarproc;
::setwindowlong(m_statusbar, gwl_wndproc, (long)m_newproc);
ok,再來看mystatusbarproc函式:
lresult mystatusbarproc(hwnd hwnd,
uint msg,
wparam wparam,
lparam lparam )
return result;
}
簡單幾句**就完事,我只要處理wm_paint訊息,其他的statusbar自己處理好了.
效果如下:
ps:1. mfc看上去很好,實際上比較差,往往是費了功夫還不討好.
2. wm上面的windows程式,基本上就只能畫了........杯具
3. 好像有人也把這種東西叫做子類化,我沒仔細看.
其實說白了,就跟虛函式機制類似.windows機制本身含有很多oo,或者ob的東西.
4. 據同事說,mfc裡面用的也是這種東西,我不了解mfc,不曉得........
滑動視窗 單調佇列或者multiset
題目鏈結 題目 給定乙個大小為n 10 6的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 1 3 1 3...
WinForm視窗借助DLL顯示MFC控制項
注意示例 使用.def檔案定義匯出函式 class showpropwndhelper showpropwndhelper bool create hwnd parentwnd hditem hditem hditem.mask hdi width hditem.cxy 200 propctrl.s...
qt視窗或者控制項設定自定義樣式的方法
基本函式 void qwidget setstyle qstyle style 使用辦法 1 實現自定義介面類 class customtabstyle public qproxystyle return s void drawcontrol controlelement element,const...