簡體   English   中英

Matlab縮放模式和按鈕按下

[英]Matlab zoom mode and buttondownfcn

我正在MATLAB創建GUI。 此gui有幾個不同的axes對象。 在其中一個軸中,我使用zoom工具(由圖形的工具欄激活)。 在不同的軸對象中,我禁用了縮放:

setAllowAxesZoom(zoom_handle,axes_handle,false)

...並繪制了一些可點擊的對象:

text(x,y,string,'buttondownfcn',{@func_handle, value});

所有這些都很好用...當鼠標位於不可縮放的繪圖中時,會出現一個普通的箭頭光標,如果單擊或單擊並拖動,則不會發生縮放。

然而! 我希望解決一個不便的問題。 我發現激活縮放工具后,單擊文本對象不會觸發buttondownfcn回調。 現在,我需要返回工具欄以切換縮放模式。 我寧願只是在不同軸之間移動鼠標,並以編程方式激活適當的行為。

解決此問題的最佳方法是什么? 鼠標進入我的一個軸時是否可以使用回調? 如果是這樣,我可以在該回調中打開縮放工具,然后在相應的“離開事件”回調中再次將其關閉。 還是有一種方法可以在不可縮放的繪圖上傳播鼠標單擊事件,以便它找到要觸發的適當回調? 還是我沒有考慮的其他可能性?


編輯:我有這個工作。 我已經發布了一個解決方案,但也會對其他解決方案感興趣,這些解決方案在其他情況下可能會更好,更健壯,等等。

我意識到這是一個老問題,但你可以控制的State縮放工具。 因此,您可以通過編程方式打開和關閉它,而無需將鼠標返回到工具欄。 您可以使用overobj來測試是否在axes

我一起砍了一些適合自己情況的東西; 如果你希望它成為更通用的和強大的,你可以同樣啟動,但得到有關它的各種測試票友axes被點擊的對象是,例如,是否有實際上安裝了一個回調的孩子,是否有額外的參數,等等

無論如何,對於我的特定情況,我關心的對象是text對象,並且每個文本對象都安裝了一個回調函數,該回調函數只需要一個額外的參數

這是啟用縮放工具后允許我與這些文本對象進行交互的代碼:

function result = zoomtest(handle,eventdata)
    result=false;
    if strcmp(get(handle,'type'),'text')
        callback=get(handle,'buttondownfcn');
        callback{1}(handle,eventdata,callback{2})
    end
end

set(zoom_handle,'buttondownfilter',@zoomtest)

令人高興的是,這不會干擾縮放工具照常工作,如果縮放工具未處於活動狀態,它也不會改變任何行為。

我已經發布了一個相關問題的解決方案,使旋轉工具與buttondownfcn一起使用...縮放工具是相同的理念:

旋轉3D和buttondownfcn不兼容的問題/答案

更新

好吧,我將擴展並充分說明此特定情況的答案:

Matlab的幫助中描述了使用ButtonDownFilter方法是在縮放模式下保持交互性的一種好方法:

function demo
% Allow a line to have its own 'ButtonDownFcn' callback.
hLine = plot(rand(1,10));
hLine.ButtonDownFcn = 'disp(''This executes'')';
hLine.Tag = 'DoNotIgnore';
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
% mouse click on the line
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
   flag = true;
else
   flag = false;
end

在您的情況下,代碼應類似於:

function demo2
%
% Allow a text element to have its own 'ButtonDownFcn' callback.
% And taging it for interaction
text(x,y,string,'buttondownfcn',{@func_handle, value}, 'tag', 'DoNotIgnore');
%
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
%
% mouse click on the text element
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
   flag = true;
else
   flag = false;
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM