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也是一样,因此在分段绘制文本时( ...
随机推荐
- codeforces 1278F - Cards(第二类斯特林数+二项式)
传送门 解题过程: \(答案=\sum^n_{i=0}*C^i_n*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i}*i^k\) 根据第二类斯特林数的性质\(n^k=\sum ...
- Word Embeddings: Encoding Lexical Semantics(译文)
词向量:编码词汇级别的信息 url:http://pytorch.org/tutorials/beginner/nlp/word_embeddings_tutorial.html?highlight= ...
- http://i.youku.com/u/UMzQ3NjQ0MDAw C语言教学 觅风
http://i.youku.com/u/UMzQ3NjQ0MDAw C语言教学 觅风
- Django报错Watching for file changes with StatReloader
Django项目运行时出现:Watching for file changes with StatReloader错误 原因:环境里的django或者python的版本有问题 解决方案:升级或者降级D ...
- React报错Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`
引言 最近在忙毕业设计,博客也很久没更新了,毕业设计使用vue做了一个校园寻物网站,现在开始学Raect,记录一下自己遇到问题,react-redux的connect方法使得组件与Redux建立了联系 ...
- 1、通过CP数据文件的方式恢复MySQL 从库 启动后报错:Last_IO_Errno: 1236:A slave with the same server_uuid/server_id as this slave has connected to the master;
1.问题: MySQL从库中查看主从状态: show slave status\G,发现出现IO的报错: Last_IO_Errno: Last_IO_Error: Got fatal error f ...
- 死磕mysql(2)
想测试自己的查询语句,导入批量的数据,一开始很慢以为是自己的语句有问题,后来是这个autocommit,效率相差好多好多............ delimiter // create procedu ...
- 命令行开启WIFI
netsh wlan set hostednetwork allow //netsh wlan set hostednetwork mode=disallow netsh wlan set hos ...
- 关于centos7下networkManager关闭操作
由于network和NetworkManager服务会出现冲突,而且NetworkManager通常会比较先启动,所以为了防止NetworkManager的启动导致我们直接配置的网络环境失效,我们需要 ...
- Java中正确终止线程的方法
Thread类中有一个已经废弃的 stop() 方法,它可以终止线程,但由于它不管三七二十一,直接终止线程,所以被废弃了.比如,当线程被停止后还需要进行一些善后操作(如,关闭外部资源),使用这个方法就 ...