您的位置:首页 > 编程语言 > C#

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真的太麻烦了).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: