MFC的最大化,最小化,關閉

2021-06-18 08:28:08 字數 2333 閱讀 5655

最大化、最小化和關閉按鈕是視窗中最主要的元素。首先要說明,說他們是按鈕其實是不準確的,按鈕是一種視窗,而這三個元件根本就不是視窗,而是乙個視窗常見的組成部分。出於習慣的原因,這裡還是稱呼他們為按鈕。

這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,沒有標題條和系統選單的視窗是不能顯示這三個按鈕的,也就是說,要想有這三個按鈕,建立視窗時必須有ws_caption和ws_sysmenu風格。當視窗建立時有風格ws_maximizebox時,視窗顯示最大化按鈕,當有風格ws_minimizebox時,視窗顯示最小化按鈕,而只要有標題條並且有系統選單,關閉按鈕就必然會顯示出來。

對這三個按鈕的操作往往都是系統選單來進行的,這也解釋了為什麼要顯示這三個按鈕必須有系統選單。一般而言,當乙個視窗有最大化按鈕時,在系統選單裡也會有對應的選單項,對這個選單項的操作一般都能反饋到這各按鈕中。其中,最大化按鈕在系統選單中的id為sc_maximize,最小化按鈕為sc_minimize,而關閉按鈕為sc_close。當視窗處於最大化狀態時,系統選單sc_maximize則變會並被禁止,而此時最大化按鈕變為恢復按鈕,id對應為系統選單中的sc_restore。

變灰和使能

一般從功能上來講,介面元素有使能(enabled)和禁止(disabled)兩種狀態,當介面元素處於使能狀態時,使用者可以使用它,否則使用者不能使用它。而從外觀的顏色角度講,介面元素有灰色狀態(grayed)和普通狀態兩種狀態,一般對於使能的介面元素,不應該是灰色的,而對於禁止的介面元素,則應該是灰色的。

這三個按鈕也是如此。讓人奇怪的是,雖然這三個按鈕通過系統選單操作,它的行為似乎並不和普通選單項不完全一致。使能、禁止、變灰乙個選單項的操作都是通過enablemenuitem,一般常見的使能乙個選單項id_my_menu的**為:

enablemenuitem(hmenu,id_my_menu,mf_bycommand|mf_enabled);

或者用cmenu的成員函式

pmenu->enablemenuitem(id_my_menu,mf_bycommand|mf_enabled);

而禁止並同時使它變灰的**則為:

enablemenuitem(hmenu,id_my_menu,mf_bycommand|mf_grayed|mf_disabled);

或者用cmenu的成員函式

pmenu->enablemenuitem(id_my_menu,mf_bycommand|mf_grayed|mf_disabled);

注意:雖然從一般的視覺效果上變灰和禁止是一起起作用的,實際上在內部實現上,這兩者並沒有**在一起,只有同時設定mf_grayed|mf_disabled,兩個功能才同時作用。否則如果只使用mf_grayed,則只變灰不禁止,如果只使用mf_disabled,則只禁止不變灰。

這段**對於選單項總是很有效的,對關閉按鈕也有作用,但是對於最大化和最小化按鈕,則完全沒有作用。對系統選單應用上述**後,系統選單內的對應項的狀態已經正確轉變,但是視窗這兩個按鈕的功能和外觀都未變化。

為了禁止並變灰兩個按鈕中的乙個,唯一的方法是從系統選單中刪除這個選單項,**如下:

cmenu* psysmenu = getsystemmenu(false);

assert_valid(psysmenu);

if(null == psysmenu)

psysmenu->deletemenu(sc_minimize,mf_bycommand);

為了使能乙個按鈕,則需要向系統選單中新增這個按鈕對應的項,**為:

cmenu* psysmenu = getsystemmenu(false);

assert_valid(psysmenu);

if(null == psysmenu) 

訊息處理

對於這三個訊息的響應,也一樣通過系統選單的途徑來處理的。系統選單中的所有項都是通過訊息wm_syscommand來處理的,這個訊息的wparam包含了需要處理的訊息型別,其含義如下表:值含義

sc_close 關閉按鈕

sc_maximize 最大化按鈕

sc_minimize 最小化按鈕

sc_restore 恢復按鈕

這裡只列出了和三個按鈕的相關說明,其他值的說明請讀者閱讀msdn。

為了自己截獲這三個按鈕的處理,需要處理wm_syscommand訊息。下面的**示例就是處理sc_minimize訊息並隱藏對話方塊到工作列的常見操作。

void ctddlg::onsyscommand(uint nid, lparam lparam)

else if(nid == sc_minimize)

else

} 對於對話方塊的sc_close按鈕,預設呼叫oncancel,使用者也可以仿照上面**截獲並不呼叫oncancel

窗體 最大化 最小化 關閉按鈕

qt 設定透明按鈕 沒試驗 qpushbutton bt new qpushbutton this bt settext ok bt move 200,100 bt setflat true 就是這句能夠實現透明,視窗置頂 this setwindowflags qt windowstaysonto...

最大化 最小化和關閉按鈕

最大化 最小化和關閉按鈕是視窗中最主要的元素。首先要說明,說他們是按鈕其實是不準確的,按鈕是一種視窗,而這三個元件根本就不是視窗,而是乙個視窗常見的組成部分。出於習慣的原因,這裡還是稱呼他們為按鈕。這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,沒有標...

最大化 最小化和關閉按鈕

最大化 最小化和關閉按鈕是視窗中最主要的元素。首先要說明,說他們是按鈕其實是不準確的,按鈕是一種視窗,而這三個元件根本就不是視窗,而是乙個視窗常見的組成部分。出於習慣的原因,這裡還是稱呼他們為按鈕。這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,沒有標...