【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

 

posted @ 2022-09-09 13:34  不溯流光  阅读(245)  评论(0编辑  收藏  举报