窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) 
WM_PAINT消息、OnPaint()方法、GetDC()API函数都是处理窗体客户区绘制的 
  
而标题栏处于非客户区中,所以WM_PAINT消息、OnPaint()方法、GetDC()API函数都用不上 
  
GetWindowDC()是获得整个窗体的画布句柄(Device Context翻译为:设备清单,我习惯称为画布句柄),包括非客户区 
  
GDI的绘制都离不开DC,因为操作系统必须知道你要在什么地方绘制图形 
  
当其他窗体遮挡或者移开,系统都会重新绘制窗体。这时就会发出WM_PAINT和WM_NCPAINT消息通知窗体重绘界面。 
  
收到WM_NCPAINT消息(非客户区绘制消息)说明非客户区正需要重新绘制 
  
重载WndProc()方法(窗体消息处理过程),处理WM_NCPAINT等消息即可.... 
  
“基本的步骤” 就是:截获WM_NCPAINT消息、得到窗体完整画布句柄、在完整画布上绘制图形。 
    WM_NCPAINT WM_NCCALCSIZE WM_NCACTIVATE WM_NCHITTEST
建议楼主搜索关键词:“C# WM_NCPAINT WndProc Graphics”得到更多的参考资料 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[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); 

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,   System.EventArgs   e) 

{ 

m_rect.X   =   this.Bounds.Width   -   95; 

m_rect.Y   =   6; 

m_rect.Width   =   m_rect.Height   =   20; 

} 

} 

}

  

C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT的更多相关文章

  1. 调用API函数,在窗口非客户区绘图(通过GetWindowDC获得整个窗口的DC,就可以随意作画了)

    http://hi.baidu.com/3582077/item/77d3c1ff60f9fa5ec9f33754 调用API函数,在窗口非客户区绘图 GDI+的Graphics类里有个FromHdc ...

  2. VC----SDK下对窗口非客户区的操作

    窗口分成两大部分:客户区和非客户区.非客户区再次细分:标题栏,如图片中顶部深蓝色:左边框,如图片中红色部分:上边框,如图片中绿色部分:右边框,如图片中右侧天蓝色部分:底边框,如图片中下面棕色部分. 之 ...

  3. 安全概念:DMZ(非军事化区,隔离区)

    DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间 ...

  4. 浅谈C#中的模式窗体和非模式窗体

    ShowDialog(); // 模式窗体 Show(); // 非模式窗体 区别: 返回值不同,DialogResult/void 模式窗体会使程序中断,直到关闭模式窗口 打开模式窗体后不能切换到应 ...

  5. Windows Mobile X图标如何销毁窗体而非隐藏

    在Windows Mobile窗体上,有“OK”和“X”两种形式按钮.1.在Form的属性里,设置“MinimizeBox=false”,则窗体显示”OK”,点击该按钮窗体销毁并退出.2.设置“Min ...

  6. Qt paintEvent绘制窗体 注意Qt::WA_PaintOutsidePaintEvent 只是适用于X11,其他系统均无效

    QPainter默认只能在paintEvent里面调用,但是: 在其他事件中绘制窗体,提示信息如下:QPainter::begin: Paint device returned engine == 0 ...

  7. 绘制窗体渐变背景的函数[delphi]

    绘制窗体渐变背景的函数,三个参数分别代表起始颜色,终止颜色,绘制方向procedure TForm1.Draw(StartColor:TColor;EndColor:TColor;Direction: ...

  8. TWinControl.WMNCPaint对非客户的绘制

    混个脸熟: procedure TWinControl.WMNCPaint(var Message: TMessage); const InnerStyles: , BDR_SUNKENINNER, ...

  9. Silverlight浮动窗体 floatablewindow 非模态对话框

    1.http://www.cnblogs.com/yinxiangpei/articles/2613913.html 说明:Silverlight的ChildWindow组件给我们的开发带来了便利,比 ...

随机推荐

  1. Android开发必知--使用View.setId的正确姿势

    这两天在写一个柱状图的自定义控件,用的直接继承ViewGroup的方式实现的,我们都知道,这是自定义控件里面最简单的一种了,有时间写个总结分享一下.这里我想说的重点是,在写这个自定义控件的时候遇到了个 ...

  2. Android学习笔记(十四)方便实用的首选项-PreferenceActivity

    突然发现已经好多天没更新博客了,最近公司项目正在进行一个大跨度的重构,又碰上有新需求,一连好多天都是很晚才到家.其实这篇博文在草稿箱里面也存了很久了,本来想着不发了,不过感觉PreferenceAct ...

  3. 线程中Join的使用例子

    1.实现Runnbale接口, package 网易若干java;//这个例子共有2个线程,一个是主线程,一个是线程t public class MyThread1 implements Runnab ...

  4. Guava库

    Guava是一个非常棒的库,它就是Java标准库"所缺失的那部分",是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, ...

  5. JDBC——Sql Server

    sun公司设计一套java语言操作不同的数据库提供的是接口,二具体的实现类是由各大数据库厂商实现的. private static final String driver= "com.mic ...

  6. JMeter入门(1):JMeter总体介绍及组件介绍

    一.JMeter概述 JMeter就是一个测试工具,相比于LoadRunner等测试工具,此工具免费,且比较好用,但是前提当然是安装Java环境: JMeter可以做 (1)压力测试及性能测试: (2 ...

  7. Cocos2d-x3.0TestCpp文件夹笔记(二)

    3.Actions-Basic:此demo中体现ccp由Point取代 ①ActionManual:直接设置精灵的属性demo. const Color3B Color3B::RED    (255, ...

  8. 使用solrj操作solr索引库,solr是lucene服务器

    客户端开发 Solrj 客户端开发 Solrj Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了 Solrj是Sol ...

  9. 数据结构与算法/leetcode/lintcode题解

    http://algorithm.yuanbin.me/zh-hans/index.html

  10. android之tween动画详解

    android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可 ...