Matlab, GUI, прокрутка контента в панели. Как скрыть переполнение? - PullRequest
1 голос
/ 03 февраля 2012

Я пытаюсь создать графический интерфейс Matlab, у которого есть панель с прокруткой содержимого внутри большей фигуры.У меня возникла проблема с сокрытием содержимого переполнения, когда оно прокручивается из подпанели.

Я получил код полосы прокрутки из этого сообщения SO: Добавление полосы прокрутки в субплоты в GUI

Попробуйте код ниже.У меня есть фигура, внешняя панель (меньше фигуры, дочерняя по отношению к фигуре), панель прокрутки (с высотой больше фигуры, дочерней по отношению к внешней панели), полоса прокрутки и текстовое поле для отображения впанель прокрутки (дочерняя по отношению к панели прокрутки).

Когда вы попробуете код, вы увидите текстовую строку, которая является просто повторением алфавита, прокручивает вверх и вниз по всей длине фигуры, но панель прокруткиостанавливается на краю границ внешней панели.

Как я могу исправить эту проблему.Спасибо.

function guitest
    scrsz = get(0,'ScreenSize');

    height = scrsz(4)*7/8;
    width = scrsz(3)*2/3;
    leftmargin = 10;
    rightmargin = 10;

    % figure 
    handles.hFig = figure('Visible','on',...
                    'Position', [scrsz(3)/8 scrsz(4)/10 width height],...
                'Name', 'Tap Toolbar Report',...
                'NumberTitle', 'off',...
                'Color', [0.75 0.75 0.75],...
                'ToolBar','none',...
                'MenuBar','none',...
                'Resize','off');

    % subpanel in the figure for scrolling
    handles.hOut = uipanel('Parent',handles.hFig,...
                  'BackgroundColor', [0.85 0.85 0.85],...
                  'BorderWidth', 0,...
                  'Units', 'pixels',...
                  'Position',[leftmargin 100 width-2*leftmargin height-200]);

    hPanheight = 2000;

    handles.hPan = uipanel('Parent',handles.hOut,...
              'BackgroundColor', [0.85 0.85 0.85],...
              'BorderWidth', 0,...
              'Units', 'pixels',...
              'Position',[0 0 width-2*leftmargin-19 hPanheight]);

    str = sprintf('a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz\na\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\nv\nx\ny\nz');
    uicontrol('Parent', handles.hPan,'Style','text','String',str,'FontSize', 10,'FontWeight','bold', 'HorizontalAlignment', 'left',...
            'Position',[10 20 20 1960],'BackgroundColor', [0.85 0.85 0.85]);          

    handles.hSld = uicontrol('Style', 'slider',...
                'BackgroundColor', [0.8 0.8 0.8], ...
                'Position', [width-leftmargin-20 101 19 height-202],...
                'Callback', {@onSlide,handles.hPan,handles.hOut});
    set(handles.hSld,'Value',1);
    onSlide(handles.hSld,'',handles.hPan,handles.hOut)
end 

function onSlide(hSld,~,hPan,hOut)
    %# slider value
    offset = get(hSld,'Value');

    %# update panel position
    p = get(hPan, 'Position');  %# panel current position
    ph = get(hOut, 'Position');
    set(hPan, 'Position',[p(1) -offset*(p(4)-ph(4)) p(3) p(4)])
end

1 Ответ

1 голос
/ 03 февраля 2012

Я бы использовал контейнерный объект со встроенной возможностью прокрутки.Взгляните на:

help uitable
help uitree
...