C# WinForm 中在窗口标题栏上加按钮

转载 2006年06月01日 00:07:00

原文引言:

作者:袁晓辉
主页:http://www.farproc.com
 BLOG:http://blog.csdn.net/uoyevoli/

    在窗口标题栏上加按钮本来不是什么新鲜事了,我在VC++下早也实现过了(相信很多人也都实现过了)。今天一个朋友问我C# WinForm下可否实现,我就顺便拿C#写了一个。
    原理是一样的,都是重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),可以说本来没有什么新意,可是从写这个程序的过程中,我也学到了两个技巧:
    1)、C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个WndProc就可以了。
    2)、Windows API中的HDC可以通过Graphics.FromHdc()转换为(创建出)System.Drawing.Graphics,然后就可以用.NET Framework (GID+??)提供的绘图功能方便地进行画图了。终于可以抛开讨厌的GDI API了(说实在话,在C#中调用Windows API真的太麻烦了:)).

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

添加

using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;

 

     [DllImport("user32.dll")]
        private static extern IntPtr GetWindowDC(IntPtr hwnd);
        [DllImport("user32.dll")]
        private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
        [DllImport("Kernel32.dll")]
        private static extern int GetLastError();


        //标题栏按钮的矩形区域。
        Rectangle m_rect = new Rectangle(205, 6, 20, 20);   
       // System.Windows.Forms.Message
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case 0x86://WM_NCACTIVATE

                    goto case 0x85;

                case 0x85://WM_NCPAINT
                    {

                        IntPtr hDC = GetWindowDC(m.HWnd);

                        //把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了

                        Graphics gs = Graphics.FromHdc(hDC);

                        gs.FillRectangle(new LinearGradientBrush(m_rect, Color.Pink, Color.Purple, LinearGradientMode.BackwardDiagonal), m_rect);

                        StringFormat strFmt = new StringFormat();

                        strFmt.Alignment = StringAlignment.Center;

                        strFmt.LineAlignment = StringAlignment.Center;

                        gs.DrawString("√", this.Font, Brushes.BlanchedAlmond, m_rect, strFmt);

                        gs.Dispose();

                        //释放GDI资源

                        ReleaseDC(m.HWnd, hDC);

                        break;

                    }
                case 0xA1://WM_NCLBUTTONDOWN
                    {

                        Point mousePoint = new Point((int)m.LParam);

                        mousePoint.Offset(-this.Left, -this.Top);

                        if (m_rect.Contains(mousePoint))
                        {

                            MessageBox.Show("hello");

                        }

                        break;

                    }
            }
        }


        //在窗口大小改变时及时更新按钮的区域。
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            m_rect.X = this.Bounds.Width - 95;

            m_rect.Y = 6;

            m_rect.Width = m_rect.Height = 20;

        }

C# WinForm中在窗口标题栏上加按钮

【摘   要】Windows   API中的HDC可以通过Graphics.FromHdc()转换为(创建出)System.Drawing.Graphics,然后就可以用.NET   Framew...
  • SunCherryDream
  • SunCherryDream
  • 2013年06月19日 08:03
  • 862

C#之WinForm基础 点击button关闭当前窗体,用this.close()

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 form1的布局, 解决方案资源管理器, form1...
  • yushaopu
  • yushaopu
  • 2016年09月17日 09:20
  • 15155

C# 窗体的最大化、最小化、关闭按钮的自定义

1 创建一个窗体项目(本项目是在VS2015中进行创建) 2 将窗体的FormBorderStyle属性设置为None,设置后窗体的标题栏将消失不显示 3 添加2个panel空间,...
  • ALONE_WORK
  • ALONE_WORK
  • 2017年03月05日 20:19
  • 2095

C# winform 方法实现 微软窗口的帮助文档按钮和版本说明按钮

在使用Windows操作系统的时候,微软的软件一般都会有帮助按钮和版本按钮这一个功能,功能如下图。 通过这两张图不难发现这两个按钮操作的特点。 帮助按钮操作点击后,可操作主界面,再次点...
  • langwangak
  • langwangak
  • 2017年12月27日 11:14
  • 108

Android在顶部标题栏添加按钮

1.在标题栏添加按钮     首先标题栏也有自己单独的xml 比如这里叫title.xml: ...
  • zhanqixuan22
  • zhanqixuan22
  • 2015年11月26日 15:32
  • 3223

C#窗体皮肤制作(二):创建窗体库项目以及最小化、最大化、关闭按钮的实现

很高兴有朋友关注这篇博客,同时也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是由于3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江。目前新工作也是熟悉当中,希望大家能体谅...
  • bbirdsky
  • bbirdsky
  • 2014年05月18日 20:13
  • 6753

C#中如何去除窗体默认的关闭按钮

很多时候,在winform的设计下,会遇到新建窗体时不需要用到默认的关闭按钮的情况,而是用另外设置关闭 button或其他控件来控制窗体的关闭。   之前我遇到这个问题时,问了很多朋友,都没找到方...
  • wu_pan123
  • wu_pan123
  • 2017年05月26日 08:40
  • 1289

C# wndproc 重绘windows窗体标题栏和边框

C#重绘windows窗体标题栏和边框 摘要 windows桌面应用程序都有标准的标题栏和边框,大部分程序也默认使用这些样式,一些对视觉效果要求较高的程序,如QQ,  MSN,迅雷等聊天工具的样式...
  • truelove12358
  • truelove12358
  • 2013年12月24日 22:19
  • 2001

listview 使用技巧放置按钮,winform 折叠菜单

在做项目时遇到了listview分页,但是呢这listview根本就没有自动分页什么的,当时实在是想不到什么办法,后面在网上乱逛这个发现了这一句好代码,突然灵感来了,代码:listview1.Brin...
  • u012725119
  • u012725119
  • 2013年12月19日 11:51
  • 1692

winform tabpage 绘制关闭按钮点击关闭事件和双击tab关闭页面

winform tabpage绘制关闭按钮 1.button1用于添加tab页面 2.button2用户删除当前tab页面 3.tabcontrol 命名MainTabControl 关键部分:...
  • mofijeck
  • mofijeck
  • 2015年07月09日 14:03
  • 3535
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# WinForm 中在窗口标题栏上加按钮
举报原因:
原因补充:

(最多只允许输入30个字)