如何使matlab中的控件和界面一起大小变化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使matlab中的控件和界面一起大小变化相关的知识,希望对你有一定的参考价值。
用GUI啊,很方便添加控件的,对各控件编写相应的代码以实现对应的功能。
Ctrl+C 中断正在执行的操作
如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断。MATLAB这时可能正疲于应付,响应会有些滞后。
figure命令新建一个绘图窗口
figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口。当有多个figure窗口时,在命令窗口中执行如Plot等命令将覆盖当前figure窗口中的对象。所谓的当前figure窗口,也就是最后一次查看的窗口(可以用命令gcf得到)。
figure(N),将编号为N的窗口置为当前figure,出现在所有窗口的最前面,如果该窗口不存在,则新建一个编号为N的空白figure。
注释掉一段程序:%、%。
经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 %和 的组合。输入%后,后面的代码都会变绿,在注释结束的地方再加上 % 。
也可以选中要注释内容,在右键菜单中选择Comment (Uncomment去掉注释标记),或使用快捷键Ctrl+R。
将光标放在需要注释的行中,按Ctrl+R,将该行变为注释。取消注释也是一样的,快捷键为Ctrl+T。
doc 命令名,打开命令的帮助文档
与help命令不同,帮助文档MATLAB Help中对命令的描述更详细,往往还有一些例子,更便于理解。
clc 清屏
清除命令窗口中的所有输入和输出信息,不影响命令的历史记录。
clear 和clear all
clear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵,不用时及时清理,可以减少内存占用。
clear all 清除所有的变量,使workspace一无所有,当重新开始一次算法验证时,最好执行一次,让workspace中的变量一目了然。
close all
如果开了多个绘图窗口,用这个命令将它们一起关掉。
上下光标键↑↓
在命令窗口中,上下光标键可以将历史记录中的命令复制到输入位置,便于快速重新执行。如果输入命令的前几个字母如 [row, col] =,再使用光标键,则只会选择以这些字母开始的命令。
Tab补全
对名称记得不太清楚的命令,可以输入开头的几个字母,然后按Tab键,当只有一个以这些字母开头的命令时,将自动补全命令名,否则显示一个命令名列表,方便从中选择。当然,只在命令窗口中有效。
cell模式
在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时,背景将变为浅黄色,Ctrl+Enter执行cell中的代码。
执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。
cell模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。
获取文件列表,批处理
MATLAB内置了一些文件操作命令,例如cd(切换工作目录),dir(同ls,显示目录内文件列表)等。dir命令可以返回目录中的文件和文件夹列表,存在一个结构体数组中。如果需要对一些数据文件进行批处理,而文件名又没有一定的规律,你可能需要借助于这个命令。
1. Ctrl+D打开子程序
在MATLAB的Editor中,将输入光标放到一个子程序名称中间,然后按Ctrl+D可以打开该子函数的m文件。当然这个子程序要在路径列表中(或在当前工作路径中)。实际上该快捷键对应右键菜单中“Open Selection”命令。
2. 列出依赖函数
在Editor菜单中,选择Tools->Show Dependency Report,可以列出当前m文件调用的子程序。如果需要将程序移动到别的电脑上,使用这个工具可以确保不会漏掉一些东西。这个工具也适用于文件夹。
3. 显示鼠标数据内容
调试程序过程中,程序运行到断点后,将鼠标移到一个变量名上,将会弹出一个方框,显示该变量的内容。不在调试状态下,怎么使用这个功能呢?在File菜单中打开设置选项(Preferences),选择 Editor/Debugger -> Display,在 "General Display Options" 中选择 "Enable datatips in Edit Mode "。
4. 单元数组的基本操作
清除cell中的元素
合并如下的两个cell数组
c = 'str1' 'str2' [1x3 double] 'str3'
而 c = a(1:2), b, a(3)
得到:
c = 1x2 cell [1x3 double] 1x1 cell
则得到
cell array本质上是数组,前一种操作方式与普通数组的操作方式相同,而后一种方式则是将逗号分隔的各个元素分别一个cell,整体作为一个cell数组。
cell的两种引用方式
a(1) 得到 'str1', 因为a是一个cell数组,所以其中的每一个元素都是一个cell,
而a1 得到 'str1'。
5. MATLAB 中的字体平滑
在File菜单中打开设置选项(Preferences),在 Fonts 中,选择底部的“Using antialiasing to smooth desktop fonts”,MATLAB 中默认字号比较小,可以调大一些(可以在下拉菜单中输入数字,更精细地控制文字大小)。有衬线字体打开反锯齿后可能会看起来“发虚”。
6. 同步缩放坐标轴linkaxes
linkaxes命令,可以将一个figure中的各个axes指定相同的坐标范围,实现各个绘图同步放大、缩小。在缩放一个绘图时,其它也会同步缩放。可以同时关联x、y轴,也可以只关联一个坐标轴。
7. 鼠标绘图
MATLAB Help中的Interactive Plotting一文提供了一种在figure中用鼠标绘图的方法,主要使用ginput函数。
8. GUI程序关闭按钮的callback
为GUI窗口右上角的关闭按钮添加回调函数:在GUIDE中打开GUI,在没有控件的地方单击,选中整个figure,右键菜单中选择 View Callbacks -> CloseRequestFcn,m文件中将自动添加该回调函数,输入代码就可以了。
a = 'str1', 'str2', 'str3';
b = [1:3];
c = [a(1:2), b, a(3)];
cellname(n1:n2) = [];
参考技术A 将 figure和控件的'Units'属性设置成'Normalized'本回答被提问者采纳如何随着分辨率的变化自动调整大小和调整表单控件
【中文标题】如何随着分辨率的变化自动调整大小和调整表单控件【英文标题】:How to auto resize and adjust Form controls with change in resolution 【发布时间】:2011-05-14 00:20:57 【问题描述】:我注意到一些应用程序会更改它们的控件位置以尽可能地调整它们的分辨率,如果窗口最大化,它们会以这样一种方式设置自己,以使所有 GUI 看起来平衡。 我的问题是是否可以在 Visual Studio 2010 C# 中制作或实现此功能?
【问题讨论】:
【参考方案1】:使用Dock 和Anchor 属性。 Here 是一篇好文章。请注意,这些将在最大化/最小化时处理更改。如果屏幕分辨率发生变化,这有点不同,但它会遵循相同的想法。
【讨论】:
我必须提到 AutoScaleMode,它让我在使用 Anchor&Dock 的游戏中花费了 很多 时间(这实际上不是问题......)【参考方案2】:使用这些组合来获得所需的结果:
将Anchor
属性设置为无,控件不会调整大小,它们只会移动位置。
将Anchor
属性设置为Top+Bottom+Left+Right,控件会调整大小但位置不会改变。
将表单的Minimum Size
设置为合适的值。
设置Dock
属性。
使用Form Resize
事件来改变你想要的任何东西
我不知道字体大小(标签、文本框、组合框等)在(1)-(4)中会受到怎样的影响,但可以在(5)中进行控制。
【讨论】:
【参考方案3】:float widthRatio = Screen.PrimaryScreen.Bounds.Width / 1280;
float heightRatio = Screen.PrimaryScreen.Bounds.Height / 800f;
SizeF scale = new SizeF(widthRatio, heightRatio);
this.Scale(scale);
foreach (Control control in this.Controls)
control.Font = new Font("Verdana", control.Font.SizeInPoints * heightRatio * widthRatio);
【讨论】:
@AfnanBashir 也许,但是如果您已经拥有一个带有大量控件的 Windows 窗体,那么这个可以为您节省大量时间。 +1 这是一种有趣的方法(即使可以改进比率计算)。从表面上看,它依赖于AutoScaleMode
,其形式为Font
。【参考方案4】:
..并检测分辨率的变化来处理它(一旦你像 SwDevMan81 建议的那样使用对接和锚定)使用SystemEvents.DisplaySettingsChanged event in Microsoft.Win32。
【讨论】:
【参考方案5】:这里我喜欢使用https://www.netresize.net/index.php?c=3a&id=11#buyopt。但它是付费版本。
如果您购买 1 个站点许可证(无限开发者),您也可以获得他们的源代码。
我是如何找到 nuget 包解决方案的。
【讨论】:
【参考方案6】:抱歉,我看到问题晚了, 这是一个简单的编程解决方案,对我很有效,
创建那些全局变量:
float firstWidth;
float firstHeight;
加载后,填写这些变量;
firstWidth = this.Size.Width;
firstHeight = this.Size.Height;
然后选择您的表单并将这些代码放入表单的 SizeChange 事件中;
private void AnaMenu_SizeChanged(object sender, EventArgs e)
float size1 = this.Size.Width / firstWidth;
float size2 = this.Size.Height / firstHeight;
SizeF scale = new SizeF(size1, size2);
firstWidth = this.Size.Width;
firstHeight = this.Size.Height;
foreach (Control control in this.Controls)
control.Font = new Font(control.Font.FontFamily, control.Font.Size* ((size1+ size2)/2));
control.Scale(scale);
我希望这会有所帮助,它适用于我的项目。
【讨论】:
使用您的代码后,control.Font = new Font(control.Font.FontFamily, control.Font.Size* ((size1+ size2)/2));
行中出现错误 Value of '∞' is not valid for 'emSize'. 'emSize' should be greater than 0 and less than or equal to System.Single.MaxValue. Parameter name: emSize
。【参考方案7】:
在页面加载时为所有控件添加此代码或在容器中添加所有控件
int x;
Point pt = new Point();
x = Screen.PrimaryScreen.WorkingArea.Width - 1024;
x = x / 2;
pt.Y = groupBox1.Location.Y + 50;
pt.X = groupBox1.Location.X + x;
groupBox1.Location = pt;
【讨论】:
【参考方案8】:在表单加载事件中添加这一行
this.WindowState = FormWindowState.Maximized;
【讨论】:
【参考方案9】:private void MainForm_Load( object sender, EventArgs e )
this.Size = Screen.PrimaryScreen.WorkingArea.Size
【讨论】:
【参考方案10】:this.WindowState = FormWindowState.Maximized;
【讨论】:
欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 这段代码只会让你的窗口最大化,但窗口内所有控件的大小不会动态改变。以上是关于如何使matlab中的控件和界面一起大小变化的主要内容,如果未能解决你的问题,请参考以下文章