7

是否可以在 GUI 中创建一个对象,我可以通过将其“Position”属性设置为光标位置来定义其位置(单击时拖动)?我应该使用什么功能?

4

2 回答 2

4

您可以使用SELECTMOVERESIZE函数为您的 GUI 对象打开移动和调整大小。然后,您只需用鼠标单击并拖动对象即可。就这么简单:

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

不那么简单的是,如果您的 GUI 对象是uicontrol 对象,在这种情况下,您必须通过将'Enable'属性设置为'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'属性列为只读,但我可以毫无问题地对其进行修改。它必须是文档中的错字。

于 2011-06-23T16:21:07.067 回答
2

您可以在 GUI 中创建一个不可见的轴,并在其中绘制您想要的任何对象。然后,您可以使用File Exchange 中的DRAGGABLE来允许将对象拖到各处。

于 2011-06-23T11:17:08.917 回答