zoukankan      html  css  js  c++  java
  • C# WinForm 中在窗口标题栏上加按钮

    实现主要是通过重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx);

     1[DllImport("User32.dll")]
     2        private static extern IntPtr GetWindowDC(IntPtr hwnd);
     3        [DllImport("User32.dll")]
     4        private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
     5        [DllImport("Kernel32.dll")]
     6        private static extern int GetLastError();
     7        //标题栏按钮的矩形区域。 
     8        Rectangle m_rect = new Rectangle(100612020);
     9        protected override void WndProc(ref Message m)
    10        {
    11            base.WndProc(ref m);
    12            switch (m.Msg)
    13            {
    14                case 0x86://WM_NCACTIVATE 
    15                    goto case 0x85;
    16                case 0x85://WM_NCPAINT 
    17                    {
    18                        IntPtr hDC = GetWindowDC(m.HWnd);
    19                        //把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了 
    20                        Graphics gs = Graphics.FromHdc(hDC);
    21                        gs.FillRectangle(new LinearGradientBrush(m_rect, Color.Pink, Color.Purple, LinearGradientMode.BackwardDiagonal), m_rect);
    22                        StringFormat strFmt = new StringFormat();
    23                        strFmt.Alignment = StringAlignment.Center;
    24                        strFmt.LineAlignment = StringAlignment.Center;
    25                        gs.DrawString(""this.Font, Brushes.BlanchedAlmond, m_rect, strFmt);
    26                        gs.Dispose();
    27                        //释放GDI资源
    28                        ReleaseDC(m.HWnd, hDC);
    29                        break;
    30                    }

    31                case 0xA1://WM_NCLBUTTONDOWN 
    32                    {
    33                        Point mousePoint = new Point((int)m.LParam);
    34                        mousePoint.Offset(-this.Left, -this.Top);
    35                        if (m_rect.Contains(mousePoint))
    36                        {
    37                            MessageBox.Show("hello");
    38                        }

    39                        break;
    40                    }

    41            }

    42        }

    1)、C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个WndProc就可以了。
    2)、Windows API中的HDC可以通过Graphics.FromHdc()转换为(创建出)System.Drawing.Graphics,然后就可以用.NET Framework (GID+??)提供的绘图功能方便地进行画图了。终于可以抛开讨厌的GDI API了(说实在话,在C#中调用Windows API真的太麻烦了).
  • 相关阅读:
    [原]实例-简单设计&精简代码&复用代码
    [原创]实例-少用单例及降低耦合
    c#实现数据集合转换为csv文本
    [转]SqlServer索引的原理与应用
    [转]AngularJS:何时应该使用Directive、Controller、Service?
    [转]AngularJS移动开发中的坑汇总
    [转]Hibernate对象的三种状态
    [转]AngularJS Cookies Example
    [转]LESS CSS 框架简介
    [转]为ReportViewer导出的PDF文档加上水印
  • 原文地址:https://www.cnblogs.com/winnxm/p/921543.html
Copyright © 2011-2022 走看看