windows画图,矩形,剪裁区

DC:设备内容,设备内容与特定的显示设备(如视讯显示器或打印机)相关。对于视讯显示
器,设备内容总是与显示器上的特定窗口相关。 
获取DC的方法:
1:hdc=BeginPaint(hwnd,&ps);
GDI function;
    EndPaint(hwnd,&ps);
ps:类型是PAINTSTRUCT,windows为每个窗口保存一个绘图信息结构。
2:hdc=GetDC(hwnd);
GDI function;
  ReleaseDC(hwnd,hdc);

设备内容的剪裁区:
通过GetDC获取的hdc,内定的剪裁区为整个显示区域。通过BeginPaint获取的hdc,内定剪裁区为无效区。

1: LineTo 画直线。 

   

2: Polyline和PolylineTo 画一系列相连的直线。 

   

3: PolyPolyline 画多组相连的线。 

   

4: Arc 画椭圆线。 

   

5: PolyBezier和PolyBezierTo 画贝塞尔曲线。 

   

画线函数: 

1:ArcTo和AngleArc 画椭圆线。 

   

2:PolyDraw 画一系列相连的线以及贝塞尔曲线。 

   

 

1: Rectangle 画矩形。 

   

2: Ellipse 画椭圆。 

   

3: RoundRect 画带圆角的矩形。 

   

4: Pie 画椭圆的一部分,使其看起来像一个扇形。 

   

5: Chord 画椭圆的一部分,以呈弓形。 

 

画笔:

hPen = SelectObject (hdc, GetStockobject (WHITE_PEN)) ; 

则设备内容中的目前画笔将为WHITE_PEN,变量hPen将会是BLACK_PEN的句柄。以后通过呼叫 

SelectObject (hdc, hPen) ; 

将会使设备重新成为BLACK_PEN

分析:使用固有的画笔操作简单,但是类型很少,只有实心的黑画笔、实心的白画笔或者没有画笔这三种情况。

GDI对象:是画刷、位图、区域、字体和调色盘,画笔

GDI规则:

1:最后要删除自己建立的所有GDI对象。 

   

2:当GDI对象正在一个有效的设备内容中使用时,不要删除它。 

   

3:不要删除现有对象。

创建画笔:

hPen = CreatePen (iPenStyle, iWidth, crColor) ; 

或者:

LOGPEN logpen ; 

hPen = CreatePenIndirect (&logpen) ; 

LOGPEN是个结构体,三个元素,lopnStyle,lopnWidth,lopnColor。

 

SetBkColor (hdc, crColor) ;    //背景颜色

SetBkMode (hdc, TRANSPARENT) ; //背景模式

画刷:

hBrush = CreateSolidBrush (crColor) ;

hBrush = CreateHatchBrush (iHatchStyle, crColor) ;

SelectObject(hdc,hBrush);

绘图方式:

当Windows使用画笔来画线时,它实际上执行画笔图素与目标位置处原来图素之间的某种位布尔运算。

 

矩形函数:

FillRect (hdc, &rect, hBrush) ;     //填充矩形

FrameRect (hdc, &rect, hBrush) ;  //用画刷画矩形

InvertRect (hdc, &rect) ;         //矩形像素翻转

SetRect (&rect, xLeft, yTop, xRight, yBottom) ;//对矩形结构体赋值

OffsetRect (&rect, x, y) ;      //将矩形沿着xy轴移动

InflateRect (&rect, x, y) ;      //增减矩形

SetRectEmpty (&rect) ;       //将矩形各字段设置为0

CopyRect (&DestRect, &SrcRect) ;//矩形复制

IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;//矩形的交集

UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;  //矩形的并集

bEmpty = IsRectEmpty (&rect) ;    //确定矩形是否为空

bInRect = PtInRect (&rect, point) ;  //确定点是否存在矩形内部

 

GetMessage()和PeekMessage()的区别:

GetMessage不将控制传回给程序,直到从程序的消息队列中取得消息,但是PeekMessage总是立刻传回,而不论一个消息是否出现。当消息队列中有一个消息时,PeekMessage的传回值为TRUE(非0),并且将按通常方式处理消息。当队列中没有消息时,PeekMessage传回FALSE(0)。

剪裁区:

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;//建立矩形剪裁区

hRgn = CreateRectRgnIndirect (&rect) ;        //建立矩形剪裁区

hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;//建立椭圆剪裁区

hRgn = CreateEllipticRgnIndirect (&rect) ;      //建立椭圆剪裁区

hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;//建立多边形的剪裁区

 

iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ;//不同剪裁区间进行运算

iCombine:合并方式,如下所示:

RGN_AND 两个剪裁区域的公共部分 

RGN_OR 两个剪裁区域的全部 

RGN_XOR 两个剪裁区域的全部除去公共部分

RGN_DIFF hSrcRgn1不在hSrcRgn2中的部分 

RGN_COPY hSrcRgn1的全部(忽略hSrcRgn2)

 

剪裁区的句柄hRgn可以用的函数

FillRgn (hdc, hRgn, hBrush) ; 

FrameRgn (hdc, hRgn, hBrush, xFrame, yFrame) ; 

InvertRgn (hdc, hRgn) ; 

PaintRgn (hdc, hRgn) ;

DeleteObject (hRgn) ;    //使用完毕,释放资源

 

矩形区域函数:

InvalidateRect (hwnd, NULL, TRUE) ;    //矩形区域无效

GetUpdateRect(hwnd,lprect, bErase);   //获取无效矩形

ValidateRect(hwnd,lprect);            //矩形区域有效

 

剪裁区域函数,非矩形,类似矩形区域函数

InvalidateRgn (hwnd, hRgn, bErase) ;

ValidateRgn(hwnd,hRgn);

以上两种区域函数都会使windows发送WM_PAINT消息。

 

剪裁区域选入设备

SelectObject(hdc,hRgn );

SelectClipRgn (hdc, hRgn) ; 

你可能感兴趣的:(windows画图,矩形,剪裁区)