最大化 最小化和關閉按鈕

2021-04-07 00:16:54 字數 2299 閱讀 1011

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

這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,沒有標題條和系統選單的視窗是不能顯示這三個按鈕的,也就是說,要想有這三個按鈕,建立視窗時必須有ws_caption和ws_sy**enu風格。當視窗建立時有風格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* psy**enu = getsystemmenu(false);

assert_valid(psy**enu);

if(null == psy**enu)

psy**enu->deletemenu(sc_minimize,mf_bycommand);

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

cmenu* psy**enu = getsystemmenu(false);

assert_valid(psy**enu);

if(null == psy**enu)

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

sc_close

關閉按鈕

sc_maximize

最大化按鈕

sc_minimize

最小化按鈕

sc_restore

恢復按鈕

為了自己截獲這三個按鈕的處理,需要處理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...