mfc
視窗:mfc視窗不對視窗進行直接的控制,而在api環境中卻是可以的。如果不能在api環境中實現某項功能,那麼
肯定也不能在mfc環境中實現。舉例來說,mfc庫的cwnd可以建立乙個視窗,但它只是過去在api環境中使用
api呼叫的封裝。
建立mfc視窗是複雜的,首先,建立類cwnd的乙個例項,然後呼叫類cwnd的乙個成員函式,該成員函式呼叫
api中的createwindow()函式。返回的視窗控制代碼儲存在類cwnd的成員變數m_hwnd中
注:因為視窗在記憶體中建立,而記憶體經常發生變化,視窗位址可能是經常變化的。因此,視窗控制代碼並非直接
指向視窗物件,而是指向跟蹤視窗物件位址的另乙個指標。
銷毀視窗同樣複雜,必須確保銷毀了該視窗物件,以及封裝該視窗對像的cwnd例項。
怎樣應用mfc建立乙個視窗:
cwnd wnd
bool b=wnd.createex(exstyle,classname,windowname,style,x,y,width,height,parent,menu,param);
第一行**建立了乙個cwnd類的物件,第二行通過呼叫windows api函式createwindowex建立了真正的
視窗。hwnd hwnd=::createwindowex(exstyle,classname,windowname,style,x,y,width,height,parent,
meun,instance,param);
因為cwnd類只是封裝了用於建立視窗的window api函式(createwindowex()),因此,從本質上講,
建立視窗所必須的引數在api環境和mfc環境中是相同的;
引數style和exstyle決定視窗的"外觀"和型別(重疊,彈出,子視窗).
引數classname決定在建立視窗時使用的視窗類
引數windowname決定視窗標題內容
引數x,y,width,height決定視窗的位置的大小.
引數parent指向擁有該視窗的視窗指標
引數menu指向記憶體中的乙個物件,作為它的選單使用----除非建立乙個子視窗,如果是這樣的話
,那麼該引數是幫助父視窗識別子視窗的idnumber
引數instance識別該視窗屬於哪個應用程式,以便傳送到該視窗的訊息能被傳送到正確的應用程式
的訊息佇列中。cwnd類填入instance引數
引數param是在建立視窗時由視窗類使用的指標,該指標是指向附加資訊的非強制性結構指標
返回的hwnd引數是指向建立的視窗物件的指標,但在未建立任何視窗時,該視窗數返回值為null
視窗控制代碼自動地儲存在cwnd類的m_hwnd成員變數中.
引數規則:
a.視窗名稱引數
該引數是乙個零結尾的文字串,用該串指明在視窗標題欄中顯示的內容。如果視窗沒有標題
欄,該引數可以為0
然而,某些通過控制項也使用該引數。例如,按鈕控制項把該引數的內容放在按鈕的表面。在
建立視窗標題欄後,可以用類cwnd的成員函式setwindowtext(),來改變視窗標題欄的名
稱. b.風格和擴充套件風格引數
這兩個是32位的引數,用來指定建立什麼型別的視窗。可以選擇多種型別,如下面的例子所示:
.ws_child|ws_visible
視窗風格引數的作用包括:
用於建立三種基本視窗類的風格,用wm_child建立乙個子視窗;用 wm_popup建立乙個彈出
用以增添視窗的非客戶區特色的風格。例如可用ws_vscrooll視窗新增乙個垂直滾動條.
由每個通用控制項定義的風格。例如,bs_flat按鈕風格告訴按鈕控制項繪製乙個二維按鈕
用來標識控制項組起始控制項的風格,或者當使用者敲擊tab鍵控制焦點在視窗中變化時,用
來指示哪個控制項有資格獲得輸入焦點的風格.
在建立視窗以後,可以用cwnd的成員函式modifystyle()和modifystyleex()改變視窗
風格。某些風格可能要求重畫視窗,這時,可以給modifysytle()函式新增三第三個參
數,自動激發類cwnd成員函式setwindowpos()做重畫工作。
cwnd wnd;
wnd.modifystyle(0,ws_border,swp_nozorder);
事實上,給modifystyle()或給modifystyleex()新增任何第三個引數,都要新增下面
的setwindowpos()選項:swp_nozorder,swp_nomove,swp_noactivate,swp_show.
c.x和y位置引數
這是兩個32位的引數,用於以象素為單位指定視窗的位置。建立重疊視窗和彈出視窗時,
x和y是相對於桌面視窗左上角的位置。而建立子視窗時,x和y是相對于父視窗客戶區的左
上角位置。如果把x和y引數都設定為cw_usedefault,那麼系統將自動為視窗選定乙個位置。
然而,如果x和y引數都設定為cw_usedeffault,那麼子視窗在建立的時候,總被建立在
(0,0)的位置
建立視窗以後,可以用類cwnd的成員函式movewindow()移動視窗
d.寬度和高度引數
這是兩個32位的引數,用於以畫素為單位指定視窗的大小。如果將引數width和heihght都
設定為cw_usedefault,則系統將根據桌面視窗的大小,自動選定視窗的大小。然而,對於
乙個子視窗來說,系統系統將建立乙個長和寬為0的視窗。如果視窗的風格是ws_minimize
或ws_maximize,那麼系統將忽視使用者為width和height設定的任何值。
建立視窗以後,可以用類cwnd的成員函式movewindow()重新設定視窗的大小。
e.z_order
當幾個視窗佔據螢幕上同一區域時,z_order決定哪個視窗顯示在哪個視窗之上。
建立視窗後,可以用cwnd的成員函式setwindowpos()改變視窗z的順序
f.父視窗或物主視窗引數
該引數是指向類cwnd物件的指標,根據建立的視窗型別標識是父視窗還是物主視窗。
如果建立的是乙個子視窗,那麼用該引數來標識它的父視窗,該值不能為null。子
視窗只能出現在它的父視窗裡面,當父視窗被銷毀時它他們也被銷毀;物主視窗最
小化時,則從屬視窗被隱藏;但當物主視窗被隱藏時,從屬視窗並不被隱藏
MFC中更改視窗樣式
使用mfc生成多文件應用程式時,會自動生成cmainframe類和cchildframe類,要修改視窗的樣式,可以在cchildframe的precreatewindow方法中進行修改,如下 bool cchildframe precreatewindow createstruct cs 是通過指定...
MFC中靜態拆分視窗
一 範例執行結果 二 具體實現步驟步驟 1 建立2個視窗類cselectview和cdisplayview,到時候負責往上圖1和2的位置顯示東西。2 主視窗中定義乙個切分視窗類的物件,通過物件進行拆分 csplitterwnd m spliter 切分視窗類物件 3 重寫主視窗oncreatecli...
VC 中MFC視窗物件的清除
對於vc 初學者來說,總覺得視窗物件的清除過程有些莫名其妙.在程式中看不到對delete的顯式呼叫,這似乎違反了c 中有關初始化和清除的規則.那麼,程式是怎樣取消乙個視窗物件?要消除視窗物件,必須清楚視窗物件的構成.在乙個通常的程式中,先建立c 視窗物件,然後由windows建立實際的視窗結構,並返...