【Winform】窗体
一、适应高DPI
1、解决C# Winform高DPI字体模糊的两种方案
https://blog.csdn.net/ffx54611/article/details/103530282
2、在小屏幕电脑上界面显示不全的问题
https://bbs.csdn.net/topics/392317141?list=32660443
可以通过出现滑动条方式解决,至少可以保证界面可以正常操作。
(1)WinFrom自带控件
AutoScroll=True;
并设置AutoScrollMinSize宽高,当小于该值时出现滚动条。
(2)Dev控件
Dev控件可能没有AutoScroll属性,添加XtraScrollableControl控件并设置Dock=Fill,再在内部添加GroupControl或PanelControl存放其他控件。注意GroupControl或PanelControl组件必须调整自定义大小,不可设置Dock=Fill。
二、窗体调节
1、实现窗体最大化/最小化
MinimizeBox属性设置为trueMaximizeBox属性设置为true
2、实现窗体拖拽到顶部最大化及可调节窗体宽度
属性FormBorderStyle设为Sizable
3、窗体运行时尺寸与设计不一致
方法1:在.Designer.cs文件中找到 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;(将Font改为None或者Inherit)
方法2:选中窗口,在属性找到AutoSizeMode属性,改为GrowAndShrink即可
4、窗体最大化并且不覆盖系统任务栏
把窗体属性中的WindowState设置为Normal,在窗体的Load事件中加上以下代码:
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea; this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
这种方式最大化以后,拖拽顶端时会恢复窗体设置的大小。
如果想一直保持最大化,可以禁止拖拽窗体(参考下文第六节)
三、无边框点击任意位置拖动窗体
bool IsDragging = false; //当前拖拽状态 Point p = new Point(0, 0); //记录鼠标按下去的坐标 Point offset = new Point(0, 0); //记录动了多少距离 private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; //当前为拖曳状态 IsDragging = true; p.X = e.X; //记录坐标X,Y p.Y = e.Y; } private void Form1_MouseUp(object sender, MouseEventArgs e) { //当前为不拖曳状态 IsDragging = false; } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (IsDragging) { //距离计算:移动的坐标-鼠标按下记录的坐标 offset.X = e.X - p.X; offset.Y = e.Y - p.Y; //控件位置 Location = PointToScreen(offset); } } //无边框窗体双击放大 //添加一个panel赋予双击事件 private void panel_DoubleClick(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; } else { this.WindowState = FormWindowState.Maximized; } }
四、截当前整个窗体和某个区域
//截取整个窗体 private void button1_Click(object sender, EventArgs e) { Bitmap bit=new Bitmap(this.Width,this.Height);//实例化一个和窗体一样大的bitmap Graphics g=Graphics.FromImage(bit); g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高 g.CopyFromScreen(this.Left,this.Top,0,0,new Size(this.Width,this.Height));//保存整个窗体为图片 bit.Save("weiboTemp.png");//默认保存格式为PNG,保存成jpg格式质量不是很好 } //截取窗体的某个区域如 panel1这一个区域 private void button2_Click(object sender, EventArgs e) { Bitmap bit=new Bitmap(this.panel1.Width,this.panel1.Height);//实例化一个和窗体一样大的bitmap Graphics g=Graphics.FromImage(bit); g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高 g.CopyFromScreen(panel1 .PointToScreen(Point.Empty), Point.Empty, panel1.Size);//只保存某个控件(这里是panel1) bit.Save("weiboTemp.png");//默认保存格式为PNG,保存成jpg格式质量不是很好 }
http://www.luofenming.com/show.aspx?id=ART2017081400001
五、拉伸窗体时控件等比例缩放
public Form1() { InitializeComponent();//初始化组件 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; x = this.Width;//初始化时候的界面宽度 y = this.Height;//初始化时候的界面高度 setTag(this); } private float x;//定义当前窗体的宽度 private float y;//定义当前窗体的高度 //拖动页面操作 private void Form1_Resize(object sender, EventArgs e) { float newx = (this.Width) / x;//拖动界面之后的宽度与之前界面的宽度之比 float newy = (this.Height) / y;//拖动界面之后的高度与之前界面的高度之比 setControls(newx, newy, this);//进行控件大小的伸缩变换 } private void setTag(Control cons) { foreach (Control con in cons.Controls) { con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size; if (con.Controls.Count > 0) { setTag(con); } } } //用来拉伸界面中的组件 private void setControls(float newx, float newy, Control cons) { //遍历窗体中的控件,重新设置控件的值 foreach (Control con in cons.Controls) { //获取控件的Tag属性值,并分割后存储字符串数组 if (con.Tag != null) { string[] mytag = con.Tag.ToString().Split(new char[] { ';' }); //根据窗体缩放的比例确定控件的值 con.Width = Convert.ToInt32(System.Convert.ToSingle(mytag[0]) * newx);//宽度 con.Height = Convert.ToInt32(System.Convert.ToSingle(mytag[1]) * newy);//高度 con.Left = Convert.ToInt32(System.Convert.ToSingle(mytag[2]) * newx);//左边距 con.Top = Convert.ToInt32(System.Convert.ToSingle(mytag[3]) * newy);//顶边距 Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小 con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit); if (con.Controls.Count > 0) { setControls(newx, newy, con); } } } }
https://blog.csdn.net/qq_27524749/article/details/102501450
六、WinForm卡顿,加载慢、拖拽不灵活的问题
把下面这段代码放到需要解决问题的窗体中:
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 return cp; } }
七、 窗体禁止拖动
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
通过重载消息处理实现。重写窗口过程函数(WndProc),处理窗口消息 :
/// <summary> /// 禁止拖动窗体 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { if (m.Msg == 0X00A1 && m.WParam.ToInt32() == 2) { return; } if (m.Msg == 0xA3) { return; } base.WndProc(ref m); }
参考:https://blog.csdn.net/weixin_43923285/article/details/90777314
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 易语言 —— 开山篇
2020-09-09 【c#】如何用matlab绘制map图
2020-09-09 【WinForm】Dev 关于改变控件可见属性时发生异常的问题 System.ArgumentNullException:Value cannot be null.