Перетаскивание в GUI - PullRequest
       50

Перетаскивание в GUI

7 голосов
/ 23 июня 2011

Можно ли создать объект в графическом интерфейсе, положение которого я могу определить по позиции курсора (перетаскивать при нажатии), установив для его свойства «Position» значение позиции курсора? Какую функцию я должен использовать?

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Вы можете использовать функцию SELECTMOVERESIZE , чтобы включить перемещение и изменение размера объекта GUI. Затем вы можете просто нажать и перетащить объект с помощью мыши. Это так просто:

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

Что не так просто, если ваш объект GUI является объектом uicontrol , и в этом случае вам придется отключить объект, установив для свойства 'Enable' значение 'off' или 'inactive' для выполнения функции 'ButtonDownFcn' вместо функции 'Callback'. Это верно, даже если вы не определили обратный вызов для объекта.

Возможно, вам также понадобится добавить средства в ваш графический интерфейс для включения и выключения перемещения и изменения размера объекта, возможно, дополнительную кнопку или пункт меню, который вы можете выбрать. Чтобы показать, как вы можете сделать это с помощью кнопки, вот простой пример, который создает фигуру с редактируемым текстовым полем и кнопкой, которая включает и отключает возможность перемещения и изменения размера редактируемого текстового поля:

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' только для чтения, я смог изменить его без проблем. Это должно быть опечатка в документации.

2 голосов
/ 23 июня 2011

Вы можете создавать невидимые оси в вашем графическом интерфейсе и наносить на них любые объекты, которые вам нужны. Затем вы можете использовать DRAGGABLE с файловой биржи, чтобы можно было перетаскивать объекты повсюду.

...