windows画图,矩形,剪裁区

本文深入解析Windows GDI设备内容的概念及获取方法,详细阐述了设备内容内的剪裁区及其作用,同时提供了多种绘图函数的使用说明,并介绍了如何创建和操作画笔、画刷等GDI对象。此外,文章还对比了矩形函数的使用场景与技巧,最终解释了剪裁区的创建、应用以及与设备内容的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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: PolylinePolylineTo 画一系列相连的直线。 

   

3: PolyPolyline 画多组相连的线。 

   

4: Arc 画椭圆线。 

   

5: PolyBezierPolyBezierTo 画贝塞尔曲线。 

   

画线函数: 

1:ArcToAngleArc 画椭圆线。 

   

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是个结构体,三个元素,lopnStylelopnWidthlopnColor

 

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传回FALSE0)。

剪裁区:

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

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

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

hRgn CreateEllipticRgnIndirec(&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) ; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值