最大化、最小化和關閉按鈕是視窗中最主要的元素。首先要說明,說他們是按鈕其實是不準確的,按鈕是一種視窗,而這三個元件根本就不是視窗,而是乙個視窗常見的組成部分。出於習慣的原因,這裡還是稱呼他們為按鈕。
這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,沒有標題條和系統選單的視窗是不能顯示這三個按鈕的,也就是說,要想有這三個按鈕,建立視窗時必須有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訊息並隱藏對話方塊到工作列的常見操作。
對於對話方塊的sc_close按鈕,預設呼叫oncancel,使用者也可以仿照上面**截獲並不呼叫oncancel
同樣可以採用攔截cmainframe中的precreatewindows的方法,設定視窗stye實現相同的功能,比如如下**不是能最大化按鈕bool cmainframe::precreatewindow(createstruct& cs)
最大化 最小化和關閉按鈕
最大化 最小化和關閉按鈕是視窗中最主要的元素。首先要說明,說他們是按鈕其實是不準確的,按鈕是一種視窗,而這三個元件根本就不是視窗,而是乙個視窗常見的組成部分。出於習慣的原因,這裡還是稱呼他們為按鈕。這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,沒有標...
最大化 最小化和關閉按鈕
概述 最大化 最小化和關閉按鈕是視窗中最主要的元素。首先要說明,說他們是按鈕其實是不準確的,按鈕是一種視窗,而這三個元件根本就不是視窗,而是乙個視窗常見的組成部分。出於習慣的原因,這裡還是稱呼他們為按鈕。這三個按鈕是否顯示似乎只能在視窗建立是決定。首先,要顯示這三個按鈕,視窗必須有標題條和系統選單,...
窗體 最大化 最小化 關閉按鈕
qt 設定透明按鈕 沒試驗 qpushbutton bt new qpushbutton this bt settext ok bt move 200,100 bt setflat true 就是這句能夠實現透明,視窗置頂 this setwindowflags qt windowstaysonto...