2011-06-23 44 views
7

是否可以在GUI中創建一個對象,該對象的位置由光標位置定義(點擊時拖動),方法是將其'Position'屬性設置爲光標位置。我應該使用什麼功能?在GUI中的拖放操作

回答

4

您可以使用SELECTMOVERESIZE函數爲GUI對象啓用移動和調整大小。然後,您可以用鼠標單擊並拖動該對象。它是如此簡單:

set(hObject,'ButtonDownFcn','selectmoveresize'); 

什麼不是那麼簡單的是,如果你的GUI對象是uicontrol object,在這種情況下,您必須通過設置'Enable' property'off''inactive'爲了有'ButtonDownFcn'禁用對象函數執行而不是'Callback'函數。即使您沒有爲該對象定義回調,情況也是如此。

您可能還需要在GUI中添加一種方法來打開和關閉對象的移動和調整大小,也許可以選擇一個額外的按鈕或菜單項。爲了展示如何使用按鈕來實現此功能,下面是一個簡單的示例,它創建一個帶有可編輯文本框和按鈕的圖形,該按鈕用於打開和關閉移動和調整可編輯文本框大小的功能:

function GUI_example 

    hFigure = figure('Position',[100 100 200 200],... %# Create a figure 
        'MenuBar','none',... 
        'ToolBar','none'); 
    hEdit = uicontrol('Style','edit',...    %# Create a multi-line 
        'Parent',hFigure,...    %# editable text box 
        'Position',[10 30 180 160],... 
        'Max',2,... 
        'String',{'(type here)'}); 
    hButton = uicontrol('Style','pushbutton',...  %# Create a push button 
         'Parent',hFigure,... 
         'Position',[50 5 100 20],... 
         'String','Turn moving on',... 
         'Callback',@button_callback); 

    function button_callback(hSource,eventData)  %# Nested button callback 

    if strcmp(get(hSource,'String'),'Turn moving on') 
     set(hSource,'String','Turn moving off');   %# Change button text 
     set(hEdit,'Enable','inactive',...     %# Disable the callback 
       'ButtonDownFcn','selectmoveresize',... %# Turn on moving, etc. 
       'Selected','on');      %# Display as selected 
    else 
     set(hSource,'String','Turn moving on');   %# Change button text 
     set(hEdit,'Enable','on',...      %# Re-enable the callback 
       'ButtonDownFcn','',...     %# Turn off moving, etc. 
       'Selected','off');      %# Display as unselected 
    end 

    end 

end 

注意:雖然文檔列出'Selected' property爲只讀,我可以修改它,沒有問題。它必須是文檔中的錯字。

+0

感謝您的快速響應!你能告訴我函數從哪裏獲取輸入參數嗎? – straits

+0

@Adam:哪個函數? SELECTMOVERESIZE不會將任何參數作爲輸入。 – gnovice

+0

採用hSource和eventData的button_callback函數。 – straits

2

您可以在您的GUI中創建一個不可見的軸,並繪製您想要的任何對象。然後,您可以使用文件交換中的DRAGGABLE來允許在整個位置拖動對象。