C# WinForm 中在窗口标题栏上加按钮
2007-10-11 21:35
489 查看
实现主要是通过重写窗口过程(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(100, 6, 120, 20);
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真的太麻烦了).
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(100, 6, 120, 20);
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# WinForm 中在窗口标题栏上加按钮-.NET教程,C#语言
- C# WinForm 中在窗口标题栏上加按钮
- C# WinForm 中在窗口标题栏上加按钮
- C# WinForm 中在窗口标题栏上加按钮
- C# WinForm 中在窗口标题栏上加按钮
- C# WinForm 中在窗口标题栏上加按钮 [转贴]
- C# WinForm 中在窗口标题栏上加按钮
- C# WinForm 中在窗口标题栏上加按钮
- WinForm(C# )在窗口标题栏上加按钮
- C# WinForm 中在窗口标题栏上加按钮(转)
- C# WinForm 中在窗口标题栏上加按钮
- C#实现在WinForm窗口标题栏上添加按钮
- C# winform中窗口的关闭按钮的隐藏与禁用的几种方式说明
- [转]C#winform中如何通过点击按钮切换窗口
- C# winform 按钮弹出窗口的问题
- C# winform一个窗口按钮触发另一个窗口的load事件
- *****C# Winform 屏蔽窗口的关闭按钮
- WinForm怎么在窗口标题栏上添加按钮?[转]
- c#在窗口标题栏上加按钮转载自:http://tech.ddvip.com/2008-10/122483002782273.html
- [C#] WinForm中按钮响应回车事件的简单方法