c#winform自定义窗体,重绘标题栏,自定义控件学习
c#winform自定义窗体,重绘标题栏
虽然现在都在说winform窗体太丑了,但是我也能尽量让桌面应用程序漂亮那么一点点
话不多说,先上图

重绘标题栏
先将原生窗体设置成无边框,FormBoderStyle设置成None
然后添加一个panpel控件设置成窗体的的标题栏

然后添加四个Label控件充当标题和最小化最大化关闭按钮。
此时界面的原型就出来了。
完善窗体
当然原型出来了,肯定会让其它窗体继承这个窗体,难点就在于怎么让子窗体标题实时更新标题,我是这样做的
重写(override)j基类窗体的Text
public override string Text
{
get => base.Text;
set
{
base.Text = value;
if (Title != null)
{
Title.Text = value;
}
}
}
这样继承的时候就可以动态更新标题了
然后将最大化最小化关闭事件写一下就好了
自己添加了 关闭最小化和最大化按钮的属性
代码如下:
private bool mvalueMin = true;
[Description("是否关闭最小化窗体"), Category("控制")]
public bool CloseMinButton
{
get { return mvalueMin; }
set
{
mvalueMin = value;
MinClose.Visible = mvalueMin;
}
}
private bool mvalueMax = true;
[Description("是否关闭最大化窗体"), Category("控制")]
public bool CloseMaxButton
{
get { return mvalueMax; }
set
{
mvalueMax = value;
MaxClose.Visible = mvalueMax;
}
}
但是无边框的窗体有一个界面无法拖动的老大难问题
这里借鉴的是网友的 就没有自己写了 ,具体是看的那篇博客忘记了,如有冒犯,请联系我删除
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int VM_NCLBUTTONDOWN = 0XA1;//定义鼠标左键按下
private const int HTCAPTION = 2;
private void BaseForm_MouseDown(object sender, MouseEventArgs e)
{
//为当前应用程序释放鼠标捕获
ReleaseCapture();
//发送消息 让系统误以为在标题栏上按下鼠标
SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
//为当前应用程序释放鼠标捕获
ReleaseCapture();
//发送消息 让系统误以为在标题栏上按下鼠标
SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
}
#endregion
测试效果如下
下一篇博客将讲自定义控件的制作。
希望winform死的慢一点,才喜欢上。
c#winform自定义窗体,重绘标题栏,自定义控件学习的更多相关文章
- 窗体背景的绘制(Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景)
核心思想:由于Windows窗体每次都会重绘其窗体背景,所以我们可以通过拦截窗体重绘背景的消息(WM_ERASEBKGND),并自定义方法来实现重绘窗体背景.通过TImage组件也可以实现,但是重写W ...
- Winform自定义窗体样式,实现标题栏可灵活自定义
最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小.颜色.字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到合适的解决方案,发现许多人也在寻求这个问题, ...
- 重写OnPaint事件对窗体重绘(显示gif动画) 实例2
/// <summary> /// 可显示Gif 的窗体 /// </summary> public class WinGif : Form { private Image _ ...
- WinForm TreeView节点重绘,失去焦点的高亮显示
当用户焦点离开TreeView时,TreeView选中节点仍然高亮,但是颜色符合主题. 设置TreeView.HideSelection = False;可让选中节点保持高亮. 添加重绘事件 Tree ...
- WinForm中的重绘 - 按钮等控件的背景渐变色重绘
注:brush通过起止坐标来控制重绘范围及方向.比如从上到下渐变时,brush第二个Point参数是左下角坐标. private void PaintGradientBackground(Button ...
- Winform 自定义窗体皮肤组件
分享一个很久之前写的一个Winform换肤组件. 主要利用CBT钩子,NativeWindow来实现.可实现动态换皮肤插件修改窗体显示外观. 我们先定义一个自定义组件 using Skin; usin ...
- 重写OnPaint事件对窗体重绘 实例1
public class WindowOne:Form { public WindowOne() { InitializeCompnent(); } public void InitializeCom ...
- Winform解决界面重绘闪烁的问题
在窗体或用户控件中重写CreateParams protected override CreateParams CreateParams { get { CreateParams cp = base. ...
- WinForm中的重绘 - 文本的重绘
两种方式 TextRenderer.DrawText 注意:默认在每次绘制的文本左右有padding,即使参数中设置了TextFormatFlags.NoPadding也是一样,因此在分段绘制文本时( ...
随机推荐
- HTTP访问控制模块(HTTP Access)
·摘要这个模块提供简单的基于主机的访问控制.ngx_http_access_module这个模块可以详细的检查客户端IP,并且按顺序执行第一条匹配的规则.如下例: location / { deny ...
- 单点登陆(SSO)
一.背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便.但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要 ...
- Leetcode 题目整理-8 Count and Say
38. Count and Say The count-and-say sequence is the sequence of integers beginning as follows: 1, 11 ...
- 量子搜索算法 Grover search
问题定义: Problem: \(f: \{ 0,1,2,3,--,N-1 \} \rightarrow \{0,1\}\) 找到 \(f(x)=1\) 的x 解法 经典解法: 经典解法很简单,就是把 ...
- 并发队列之ConcurrentLinkedQueue
本来想着直接说线程池的,不过在说线程池之前,我们必须要知道并发安全队列:因为一般情况下线程池中的线程数量是一定的,肯定不会超过某个阈值,那么当任务太多了的时候,我们必须把多余的任务保存到并发安全队列中 ...
- python学习Day04--列表
[主要内容] 1.列表的索引: lst=[1,2,3,4,5,6] print(lst[0]) #获取第一个元素 lst[1]='你好' #改变列表中的值 2.列表的切片: lst=[ ...
- 编写一个函数,输入n为偶数时,调用方法求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
需求:编写一个函数,输入n为偶数时,调用方法求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n package com.Summer_0511.cn; impo ...
- 命令行开启WIFI
netsh wlan set hostednetwork allow //netsh wlan set hostednetwork mode=disallow netsh wlan set hos ...
- xgboost load model from demp text file
python package : https://github.com/mwburke/xgboost-python-deploy import xgboost as xgb import numpy ...
- lua学习之基础概念篇
基础概念 程序块 (chunk) 定义 lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块 一个程序块就是一连串语句或者命令 lua 中连续的语句不需要分隔符,但为了可读 ...