MFC中的視窗

2021-06-26 05:33:33 字數 3103 閱讀 8519

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建立實際的視窗結構,並返...