user interface - Matlab: algo así como la posición "relativa" con uicontrol/eje; mantener márgenes fijos al redimensionar
user-interface resize (3)
Bien, finalmente encontré una solución de trabajo que quería que fuera :-) Espero que sea útil para alguien interesado en ella:
Archivo de script principal:
p = [300 300 1000 600];
fixedMargins = [250 0 0 0]; % [left, top, right, bottom]
f = figure(''Position'', p, ''Color'', [0.9 0.9 0.9]);
plot(-10:10, (-10:10).^3, ''*-r'');
set(f, ''ResizeFcn'', {@resizeCallback, gca, fixedMargins, {@myuiFunc, f, 40, 50}});
title(''bla'')
xlabel(''foooooooooo'')
ylabel(''barrrrrrr'')
Cambiar el tamaño de la función de devolución de llamada:
% Need to pass the handle of the axis to modify (hAx) AND to pass the
% desired margins as second extra callback argument:
% [left, top, right, bottom]!
function resizeCallback(hFig, ~, hAx, fixedMargins, func)
% Disable automatic rezising
set(hAx, ''Units'', ''pixels'');
% Figure-Size
fp = get(hFig, ''Position'');
% Calculate Position of the axis
margin = get(hAx, ''TightInset'') * [-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1];
% Position to fill the figure minus the TightInset-Margin
newPos = [0 0 fp(3:4)] - margin;
% Change position based on margins
newPos(1) = newPos(1) + fixedMargins(1);
newPos(3) = newPos(3) - fixedMargins(1) - fixedMargins(3);
newPos(2) = newPos(2) + fixedMargins(4);
newPos(4) = newPos(4) - fixedMargins(2) - fixedMargins(4);
% Set new position
set(hAx, ''Position'', newPos);
% Call UI-Func
if(nargin == 5)
f = func{1};
args = func(2:end);
f(args{:});
end
end
Puede pasar cualquier función que desee llamar al cambiar el tamaño de la ventana de figura, por ejemplo, para actualizar algo en la figura. En mi ejemplo, es el myuiFunc (), que es el siguiente:
function myuiFunc(hFig, left, top)
persistent handles;
if(~isempty(handles))
delete(handles);
handles = [];
end
fp = get(hFig, ''Position'');
h1 = uicontrol(''Style'', ''pushbutton'', ''String'', ''Foo'',''Position'', [left fp(4)-top 100 35]);
h2 = uicontrol(''Style'', ''pushbutton'', ''String'', ''Bar'',''Position'', [left fp(4)-top-50 100 35]);
handles = [h1 h2];
end
Me gusta :) ¡Ojalá tú también!
Editar : ¡No es necesario editar la función resizeCallback! Debería funcionar si le pasas los márgenes deseados y, si lo deseas, también un control de función con argumentos que se utilizarán para cada cambio de tamaño.
Actualmente tengo un gran dolor de cabeza por tener una pequeña GUI que funciona muy bien y que no se está creando con el editor de GUI, ¡sino mediante programación! Lo que tengo hasta ahora es algo como lo siguiente:
hFig = figure();
set(hFig, ''Position'', [300 200 500 400]);
plot((1:10).^2, ''*-r'');
% Größe des Plots so anpassen, dass links Platz für Buttons
ap = get(gca, ''TightInset'');
fp = get(gcf, ''Position'');
set(gca, ''Position'', [160/fp(3), 30/fp(4), (fp(3)-180)/fp(3), (fp(4)-60)/fp(4)]);
uicontrol(''Style'', ''pushbutton'', ''String'', ''foo'', ''Position'', [15 fp(4)-60 110 30]);
uicontrol(''Style'', ''pushbutton'', ''String'', ''bar'', ''Position'', [15 fp(4)-100 110 30]);
Intente redimensionarlo: no se ve igual, lo que significa que las cajas de control no permanecen en la misma posición relativa y los márgenes desde el eje hasta la ventana de la figura se agrandan. Lo que quiero lograr es:
Tener una ventana de figura con una posición determinada (x / y, ancho y alto) con un gráfico dentro. La trama tendrá un título y etiquetas para xey. Haga la gráfica como alto y ancho para tener el TightInset más un margen en cada dirección de un cierto tamaño de px (por ejemplo, TightInset + 10px) tan grande como la ventana de la figura; excepto dejar 150px de espacio libre a la izquierda para colocar algunos botones uicontrol, y mantenerlos en la misma posición: Esto sería lo mismo que poder dar la posición desde arriba / izquierda (arriba = 20, izquierda = 10) de abajo / izquierda.
¡Muchas gracias!
También puedes usar unidades "Normalizadas".
uicontrol(''Style'', ''pushbutton'', ''String'', ''foo'', ''Units'',''normalized'',''Position'', [0.90 0.05 0.08 0.08] );