2011-06-23 19 views
7

¿Es posible crear un objeto en una GUI cuya posición pueda definir con la posición del cursor (arrastrar al hacer clic) configurando su propiedad 'Posición' en la posición del cursor? ¿Qué función debo usar?Arrastrar y soltar en la GUI

Respuesta

4

Puede usar la función SELECTMOVERESIZE para activar el movimiento y el cambio de tamaño para su objeto GUI. Luego puede hacer clic y arrastrar el objeto con el mouse. Es tan simple como esto:

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

Lo que no es tan simple es si el objeto GUI es una uicontrol object, en cuyo caso tendrá que desactivar el objeto estableciendo el 'Enable' property a 'off' o 'inactive' con el fin de tener la 'ButtonDownFcn' función ejecutar en lugar de la función 'Callback'. Esto es cierto incluso si no ha definido una devolución de llamada para el objeto.

Probablemente también necesite agregar un medio a su GUI para activar y desactivar el movimiento y el cambio de tamaño del objeto, tal vez un botón adicional o un elemento de menú que puede seleccionar. Para mostrar cómo puede hacer esto con un botón, aquí hay un ejemplo simple que crea una figura con un cuadro de texto editable y un botón que activa y desactiva la capacidad de mover y cambiar el tamaño del cuadro de texto editable:

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 

Nota: aunque la documentación enumera el 'Selected' property como de solo lectura, pude modificarlo sin problemas. Debe ser un error tipográfico en la documentación.

+0

¡Gracias por la respuesta rápida! ¿Podría decirme de dónde proviene la función para obtener sus argumentos de entrada? – straits

+0

@ Adam: ¿Qué función? SELECTMOVERESIZE no toma ningún argumento como entrada. – gnovice

+0

La función button_callback toma en hSource y eventData. – straits

2

Puede crear un eje invisible en su GUI y trazar los objetos que desee allí. Luego, puede usar DRAGGABLE desde File Exchange para permitir el arrastre de objetos por todos lados.