寫這篇文章記錄下對win32程式設計視窗的理解。寫這篇文章的時候我正在使用mfc編寫乙個適合我自己使用的任務清單軟體。是的你沒聽錯,就是十幾年前你就已經聽到的mfc,現在都老掉牙的mfc,新開發的程式已經沒人用的mfc,還有一大堆基於其開發並且現在還需要維護的mfc。
以前一直不太理解視窗的概念,直白地認為是桌面上可見的視窗,包括程式的視窗,各種輸入控制項等。反正只要能用spy++捕捉到的東西,都叫視窗。直到後來有一次,想要用cwnd的派生類建立乙個彈出視窗的時候,才有機會深入理解視窗建立的過程。
在這裡還要扯乙個mfc中視窗和視窗物件的概念。視窗是指向作業系統申請建立好的視窗物件(windows api 中的createwindow),而cwnd物件是c++物件。而例項化乙個c++物件並不意味著建立了乙個視窗,而是在這個物件呼叫建立視窗的方法成功後windows生成了乙個視窗附加到這個cwnd物件(通過給m_hwnd賦值),讓cwnd方便管理視窗。
我的需求是這樣的:
在乙個對話方塊程式的基礎上,彈出若干具有popup屬性的新視窗,要求視窗可以和主視窗之間切換,不能覆蓋。(查資料發現,只要視窗具有owner或者parent,那麼在顯示的時候,永遠都是子視窗覆蓋父視窗、所有者視窗)。
然後我天真地這樣做:
class cderivedclass : public cwnd
cderivedclass wnd;
wnd.create(null,null,ws_popup|
ws_visible,crect(),this,101010);
這麼做得出乙個錯誤:cwnd::create不能建立具有popup屬性的視窗,並提示使用createex
那麼就wnd.
createex(0, 0, null, ws_visible, 0,0
, 200, 200, 0, 0);
這樣一來,上面那個提示沒有了,但是視窗卻沒有註冊成功,成員變數m_hwnd一直為null。查詢輸出發現有個getlasterror()為 0x578 (錯誤的視窗控制代碼)
原地抓狂一分鐘。。。
afxregisterwndclass)。
好嘛,那就這樣來咯:
wnd. createex(afxregisterwndclass(null), 0, null, ws_visible, 0,0, 200, 200, 0, 0);
竟然成功了!!
然而就在我以為可以繼續往下編寫的時候發現建立出來的視窗在竟然會在工作列下有按鈕。。。
然而這已經不是主要問題了,隱藏視窗的工作列按鈕,只需要增加乙個
ws_ex
_toolw
indow。
好啦,總結一下:
其實mfc根本沒有另外實現一套視窗的建立過程,只是巧妙地封裝了windows api建立視窗的過程。
一般正常情況下,視窗的視窗的建立過程包括:
1.註冊視窗類
2.根據所註冊的視窗類生成乙個視窗物件。
只有在建立視窗過程返回成功,才意味著乙個視窗的真正建立
目前執行的效果如下:
工作列上只有1個視窗,並且所有的視窗都可以相互重疊。完美。
win32視窗樣式
private const gwl style 16 視窗樣式 private sub command1 click orstyle end sub private sub orstyle dim lstyle as long lstyle getwindowlong me.hwnd,gwl sty...
WIN32視窗建立
win32視窗建立過程 1 定義視窗類 在msdn中找到函式原型 winmain 2 定義視窗處理函式 在msdn中找到原型 windowproc 3 設計視窗類 4 註冊視窗類 registerclass registerclas 5 建立視窗 createwindow createwindowe...
win32繪製視窗
static int cxclient,cyclient 宣告兩個變數存放滑鼠 x,y 座標.在下面,我們為這兩項賦值時,loword lparam 代表取 lparam 的低 16 位,hiword lparam 代表取lparam 的高 16 位,在 lparam 中存放的實際就是滑鼠的位置,低...