1 回答

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