1 回答

TA貢獻1712條經驗 獲得超3個贊
你的要求可能無法實現。
1、對于除listbox之外的其它所有控件類型,當控件處于活動狀態(Enable為on)時,任何點擊鼠標左鍵的動作(包括同時按下Ctrl或Shift鍵),窗口的SelectionType屬性都會設置為normal。
2、對于處于活動狀態的列表框,雙擊鼠標左鍵會把窗口的SelectionType設為open。換言之,列表框是唯一能響應雙擊鼠標左鍵的控件類型。
3、對于所有的鼠標右鍵動作,窗口的SelectionType屬性能夠正常體現(單擊為alt,雙擊為open)。
4、如果控件處于不活動或禁用狀態(Enable屬性為inactive或off),鼠標的按鍵動作能夠被窗口SelectionType屬性正常體現。
所以,如你所寫的代碼,對于按鈕類型的控件,是不可能捕捉到鼠標的左鍵雙擊動作的。要想實現你所說的變色,只有把按鈕設置為非活動狀態,例如:
a=uicontrol(gcf, 'style' , 'push' , 'BackgroundColor' ,[ 0 , 0.7 , 0 ], 'Enable' , 'inactive' ,... 'ButtonDownFcn' ,[ ... 'if strcmp(get(gcf,' 'SelectionType' '),' 'open' ')' ...%右鍵雙擊時變黃色 ' if strcmp(lastclick,' 'left' ')' ...%左鍵雙擊變藍色 ' set(gco,' 'backgroundcolor' ',[0,0,1]);' ... ' else,' ... ' set(gco,' 'backgroundcolor' ',[1,1,0]);' ... ' end,' ... 'elseif strcmp(get(gcf,' 'SelectionType' '),' 'alt' ')' ... ' lastclick=' 'right' ';' ... ' set(gco,' 'backgroundcolor' ',[1,0,0]);' ...%鼠標右鍵單擊變紅色 'else' ... ' lastclick=' 'left' ';' ... ' set(gco,' 'backgroundcolor' ',[0,0,0]);' ...%鼠標左鍵單擊變黑色 'end' ]); |
這里,有必要說明幾個細節問題:
1、對于鼠標雙擊按鍵的動作,其實會產生兩個消息:第一個是normal或alt(區分左右鍵);第二個為open(不區分左右鍵),但可以借助于前一個消息來區分。
2、當控件處于活動狀態時,按鼠標左鍵會執行控件的Callback回調函數,但不設置窗口的CurrentPoint屬性,也不執行控件的ButtonDownFcn以及窗口的WindowButtonDownFcn回調函數;而對于控件處于不活動狀態或者按鼠標右鍵的情況,在執行ButtonDownFcn之后,還會執行窗口的WindowButtonDownFcn回調函數。
3、從MFC類的繼承關系來說,控件也是一種窗口,當鼠標點擊按鍵時,鼠標消息是被按鍵捕獲的,所以,Figure的SelectionType屬性是由MATLAB在后臺進行設置的,而也正因如此,才會根據鼠標左右按鍵、控件類型以及是否活動而存在比較復雜的邏輯。
順便說一聲,這樣寫回調函數太費勁,我在2000年之前曾經寫過上百行這樣的回調函數,后來除非對于非常簡單的回調函數,一般都不用這種寫法了。
- 1 回答
- 0 關注
- 63 瀏覽
添加回答
舉報