在 WinForms 中制作无边框窗体通过鼠标拖动移动和调整大小,难点是我窗体上被标题栏和状态栏dock之后很难选中

项目场景:

在 WinForms 中制作 无边框窗体(FormBorderStyle = None)时,默认失去了窗口的标题栏与边框,因此也失去了通过鼠标拖动移动和调整大小的能力。本例子通过一个标题栏来拖动窗体,通过状态栏右下角的地方来拖动来改变窗体大小。本例子创建了两个窗体。一个baseform用来放标题栏和状态栏。

问题描述

提示:这里描述项目中遇到的问题:

难点是我窗体上被标题栏和状态栏dock之后很难选中

c 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace WindowsFormsApp1
{
 
    public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
            panel1.MouseMove += panel1_MouseMove;
            panel1.MouseDown += panel1_MouseDown;
            panel1.MouseUp += Panel1_MouseUp;
            panel2.MouseDown += PanelTitle_MouseDown;
            this.DoubleBuffered = true;
        }
        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        public const int WM_NCLBUTTONDOWN = 0xA1;
        public const int HTCAPTION = 0x2;
        private void PanelTitle_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ReleaseCapture();
                SendMessage(this.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
            }
        }
        private void Panel1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Size = previousRect.Size;
                isResizing = false;
            }
        }

        private bool isResizing = false;
        private Point lastMousePos;
        private Size lastMouseSize;
        private Size NewMouseSize;
        private const int resizeArea = 15;
        private Rectangle previousRect;
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            bool inBottomRight = e.X >= panel1.Width - resizeArea && e.Y >= panel1.Height - resizeArea;
            if (inBottomRight || isResizing)
                panel1.Cursor = Cursors.SizeNWSE;
            else
                panel1.Cursor = Cursors.Default;

            if (isResizing && e.Button == MouseButtons.Left)
            {
                int dx = e.X - lastMousePos.X;
                int dy = e.Y - lastMousePos.Y;
                Size newSize = new Size(lastMouseSize.Width + dx,lastMouseSize.Height + dy);
             
                Rectangle newRect = new Rectangle(this.Location, newSize);
                previousRect = newRect;
                OnUpdateRichTextBox?.Invoke($" lastMousePos.X:{lastMousePos.X} lastMousePos.Y:{lastMousePos.Y} e.Y:{e.Y} e.X:{e.X}  dx:{dx}  dy:{dy}", Color.Black);
            }
        }
        
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left &&
            e.X >= panel1.Width - resizeArea &&
            e.Y >= panel1.Height - resizeArea)
            {
                lastMouseSize = this.Size;
                isResizing = true;
                lastMousePos = e.Location;
            }
        }
        public event Action<string , Color> OnUpdateRichTextBox;

      

        /// <summary>
        /// 改变richtextbox 当前插入行颜色
        /// </summary>
        /// <param name="rtBox"></param>
        /// <param name="addtext"></param>
        /// <param name="color"></param>
        /// <param name="IsaddNewLine"></param
        public void AppendTextColorful(RichTextBox rtBox, string addtext, Color color, bool IsaddNewLine = false)
        {
            if (IsaddNewLine)
            {
                addtext += Environment.NewLine;
            }
            try
            {
                if (rtBox.InvokeRequired)
                {
                    rtBox.Invoke(new Action(() =>
                    {
                        rtBox.ScrollToCaret();
                        rtBox.SelectionStart = rtBox.TextLength;
                        rtBox.SelectionLength = 0;
                        rtBox.SelectionColor = color;
                        rtBox.AppendText(DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss:fff") + "  " + addtext + "\r\n");
                        rtBox.SelectionColor = rtBox.ForeColor;
                        if (rtBox.Lines.Length > 1000)
                            rtBox.Clear();
                    }));
                }
                else
                {
                    rtBox.ScrollToCaret();
                    rtBox.SelectionStart = rtBox.TextLength;
                    rtBox.SelectionLength = 0;
                    rtBox.SelectionColor = color;
                    rtBox.AppendText(DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss:fff") + addtext + "\r\n");
                    rtBox.SelectionColor = rtBox.ForeColor;
                    if (rtBox.Lines.Length > 1000)
                        rtBox.Clear();
                }
                if (!Directory.Exists($"Log\\"))
                {
                    Directory.CreateDirectory($"Log\\");
                }
                //LoggerUtility.Instance.WriteLog(addtext, "normal");

            }
            catch (Exception ex)
            {
                //LoggerUtility.Instance.WriteException(ex);
            }
        }
    }
}
c 复制代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    class Class1:Form1
    {
        private RichTextBox richTextBox1;

        public Class1()
        {
            InitializeComponent();
            OnUpdateRichTextBox += UpdateTextBox1;
        }
        //RichTextBox richTextBox1;
        private void UpdateTextBox1(string str, Color clr)
        {
            AppendTextColorful(richTextBox1, str, clr);
        }

        private void InitializeComponent()
        {
            this.richTextBox1 = new System.Windows.Forms.RichTextBox();
            this.SuspendLayout();
            // 
            // richTextBox1
            // 
            this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.richTextBox1.Location = new System.Drawing.Point(0, 57);
            this.richTextBox1.Name = "richTextBox1";
            this.richTextBox1.Size = new System.Drawing.Size(1232, 503);
            this.richTextBox1.TabIndex = 2;
            this.richTextBox1.Text = "";
            // 
            // Class1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
            this.ClientSize = new System.Drawing.Size(1232, 606);
            this.Controls.Add(this.richTextBox1);
            this.Name = "Class1";
            this.Controls.SetChildIndex(this.richTextBox1, 0);
            this.ResumeLayout(false);

        }
    }
}
相关推荐
雪碧透心凉_14 小时前
PythonWin32API窗口与鼠标操作
开发语言·python·计算机外设
遇见小修修15 小时前
电脑无法正常启动原因分析 零基础排查教程
计算机外设·电脑
硅基手札19 小时前
【I2C 技术系列 11】I2C Linux 驱动框架
linux·驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
开开心心就好2 天前
把手机变成电脑麦克风,WiFi连接就能用
智能手机·ffmpeg·计算机外设·电脑·word·音视频
硅基手札2 天前
【I2C 技术系列 08】I2C 控制器寄存器与 IP 架构
驱动开发·stm32·单片机·嵌入式硬件·mcu·架构·计算机外设
硅基手札2 天前
【I2C 技术系列 09】I2C 传输模式:轮询 / 中断 / DMA
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
打工仔折腾 AI2 天前
鸿蒙平板远控电脑实测:ToDesk蓝牙键鼠、双模式鼠标与跨端剪贴板落地记录
人工智能·后端·python·性能优化·计算机外设·电脑·harmonyos
打工仔折腾 AI2 天前
鸿蒙端ToDesk远控电脑实测:蓝牙键鼠、双模式鼠标与跨端剪贴板实践
后端·python·性能优化·计算机外设·电脑·harmonyos·ai agent 实战
硅基手札3 天前
【I2C 技术系列 05】I2C 多主仲裁与时钟同步
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札3 天前
【I2C 技术系列 01】I2C 电气特性与物理层
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设