当前位置: 首页 > java >正文

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

项目场景:

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

问题描述

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

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

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;elsepanel1.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"></parampublic 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);}}}
}
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);}}
}
http://www.xdnf.cn/news/14050.html

相关文章:

  • 短视频矩阵系统开发实战:PHP实现SaaS独立部署
  • deepimagej-plugin开源程序是用于运行深度学习模型的 ImageJ 插件
  • 【解决方案】Kali 2022.3修复仓库密钥一键安装docker,docker compose
  • 开发环境与生产环境的 yml 文件与配置
  • 1分钟理解FreeRtos中的信号量知识
  • LeetCode - 387. 字符串中的第一个唯一字符
  • 一个简单的torch-cuda demo
  • Acrobat 首选项配置:从注册表到锁定机制
  • 【MPC】模型预测控制笔记 (2):约束MPC
  • C语言预处理命令详解
  • 第9章 表达式和运算符 笔记 待完善
  • 如何运营一个专业的体育比分网站
  • 2025年06月13日Github流行趋势
  • 【Photoshop】使用路径和形状制作印章
  • 基于51单片机的电机控制角度proteus仿真
  • 【IEEE/EI/Scopus检索】2025年第五届机器学习与大数据管理国际会议 (MLBDM 2025)
  • Streamlit 笔记
  • Google Drive·实现共享文件本地访问与编辑
  • sdk添加包,更新文件系统--万象奥科RK3506
  • 基于数字孪生的风光储一体化园区智能化管理解决方案
  • C++进阶—C++中的继承
  • 在云算力上使用Nginx对Gradio外链进行加速的方法
  • 趣解TensorFlow之入门篇
  • 家政维修平台实战25:工人接单
  • Could not initialize Logback logging from classpath:logback-spring.xml
  • PostgreSQL作为向量数据库
  • 论索引影响性能的一面④ 索引失踪之谜【上】
  • docker部署DNS服务并带有图形界面管理——筑梦之路
  • 【碎碎念】60秒! 卡牌游戏 60 Seconds! [特殊字符] 桌游版《求生60秒》
  • 人工智能100问☞第47问:为啥AI需要“反向传播”?