Если вы посмотрите на код для msgbox.m
, вы увидите, что стандартным поведением для окна сообщения является разделение любой текстовой строки длиной более 75 символов.Поскольку спецификации вашего формата встроены в вашу первую строку текста, они добавляют довольно много символов и запутывают количество отображаемых символов.
Есть несколько способов обойти это ограничение,Я подробно опишу 2 из них и просто быстро упомяну другие.
Обходное решение 1 (быстрое и грязное):
Пока вы сами пробовали, сохраняйте первую строку вашего сообщения только в форматеспецификации (пустые для отображения реального символа), а затем все ваши фактические строки сообщений.Так как он создает пустую строку вверху и портит центрирование, мы можем просто добавить пустую строку внизу, чтобы перецентрировать текст.
msgformat = ['\fontsize{',num2str(FontSize),'}\fontname{',FontName,'}\rm'] ;
msg = {'Splines were not created to perform group speed analysis';...
'return to SWs propagation tab and select wall''s boundaries'};
msgformated = [ msgformat ; msg ; {''} ] ;
msgbox( msgformated , '', 'none', CreateStruct )
Обходной путь 2 (установить свойства вручную):
Этот метод состоит в отправке чистого сообщения (без форматирования) в окно сообщения.Затем мы получаем дескриптор окна сообщения, ищем дескриптор объекта text
, содержащего сообщение, затем изменяем его свойства FontName
и FontSize
напрямую (не через интерпретатор tex
).
Это выглядит так:
% Define your message without format specifier
msg = {'Splines were not created to perform group speed analysis';...
'return to SWs propagation tab and select wall''s boundaries'};
% create the message box, taking care of saving its handle "h"
h = msgbox( msg , '','none',CreateStruct ) ;
% Get the handle of the text object
hax = findobj(h,'Type','Axes') ; % handle of the [axes] conataining the [text] object
htxt = hax.Children ; % handle of the [text] object
% measure width of text message at this fontsize
textExtentBefore = get(htxt, 'Extent') ;
% set the Font properties
set( htxt , 'FontName',FontName , 'FontSize',FontSize , 'Interpreter' , 'tex' )
% adjust msgbox width if new font smaller/larger
textExtentAfter = get(htxt, 'Extent') ;
stretch = textExtentAfter(3) / textExtentBefore(3) ;
pos = h.Position ;
pos(3) = pos(3) * stretch ;
set( h , 'Position',pos )
Конечно, будет больно носить весь этот код, если у вас многоmsgbox
для изменения, чтобы вы могли упаковать его в вспомогательную функцию.Код для pimp_msgbox.m
:
function pimp_msgbox(hmsgbox, FontName, FontSize)
% Get the handle of the text object
hax = findobj(hmsgbox,'Type','Axes') ;
htxt = hax.Children ;
% measure width of text message at this fontsize
textExtentBefore = get(htxt, 'Extent') ;
% set the Font properties
set( htxt , 'FontName',FontName , 'FontSize',FontSize , 'Interpreter' , 'tex' )
% adjust msgbox width if new font smaller/larger
textExtentAfter = get(htxt, 'Extent') ;
stretch = textExtentAfter(3) / textExtentBefore(3) ;
pos = hmsgbox.Position ;
pos(3) = pos(3) * stretch ;
set( hmsgbox , 'Position',pos )
Тогда это становится так же просто, как:
msg = {'Splines were not created to perform group speed analysis';...
'return to SWs propagation tab and select wall''s boundaries'};
hmsg = msgbox( msg , '','none',CreateStruct ) ;
pimp_msgbox( hmsg , FontName , FontSize ) ;
Другие способы:
- Пользовательское окно сообщения: создание копии
msgbox.m
и переименуйте его mymsgbox.m
.Внутри измените соответствующую часть кода.Используйте эту пользовательскую функцию вместо стандартной. - innner title В решении, где вы сохраняете спецификатор формата текста в первой строке, вы можете добавить короткий текст, такой как «Предупреждение»,или «Ошибка», или что-либо, имеющее отношение к сообщению, поэтому первая строка на самом деле не пуста.
- еще DIY-решения ...