在 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);

        }
    }
}
相关推荐
Geehy极海半导体1 天前
APM32芯得 EP.29 | 基于APM32F103的USB键盘与虚拟串口复合设备配置详解
计算机外设·usb·usb配置
人工干智能2 天前
pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?
python·游戏·计算机外设·pygame
R-G-B2 天前
【P18 3-10】OpenCV Python—— 鼠标控制,鼠标回调函数(鼠标移动、按下、。。。),鼠标绘制基本图形(直线、圆、矩形)
python·opencv·计算机外设·鼠标回调函数·鼠标控制·鼠标移动·鼠标绘制图形
寻道模式3 天前
【运维心得】三步10分钟拆装笔记本键盘
运维·计算机外设·笔记本
OBOO鸥柏商用液晶显示厂家4 天前
OBOO鸥柏丨75寸/86平板企业办公会议触控一体机核心国产化品牌招投标参数
计算机外设·电脑·大屏端·信息发布系统·会议一体机
python-行者4 天前
akamai鼠标轨迹
爬虫·python·计算机外设·akamai
大Mod_abfun6 天前
多显示器窗口分布规律探索(包括WorkerW的区域)
计算机外设·显示器布局·桌面背景层·workerw
猎板PCB 邹亮10 天前
猎板PCB:专业键盘PCB板解决方案供应商
计算机外设·键盘·pcb工艺
点灯小铭11 天前
基于STM32单片机的无线鼠标设计
stm32·单片机·计算机外设·毕业设计·课程设计
Jwest202111 天前
佳维视高亮度工业显示器,强光环境清晰可见
计算机外设