首页 > 编程知识 正文

要选择一个矩形区域,idea方法之间的分割线

时间:2023-05-05 18:16:03 阅读:110212 作者:4521

一、矩形的一些特殊操作API函数矩形是我们绘制时常用的图形,使用更方便,掌握详细的矩形操作API函数

特别重要。 这里介绍几个常见的矩形操作函数。

1.SetRect函数-------(赋值)指定矩形的坐标

boolsetrect(LPrectlprc,//指针,要设置的矩形int xLeft,//指定矩形左上角的x坐标。 int yTop,//指定矩形左上角的y坐标。 int xRight,//指定矩形右下角的x坐标。 int yBottom; //指定矩形右下角的y坐标。2.FillRect函数-------绘制填充矩形

用指定的画笔填充矩形。 此函数包含矩形的左上角边界,但不包含矩形的右下角边界。

intfillrect(HDCHDC,CONST RECT *lprc,//填充矩形的指针HBRUSH hbr ); //画笔手柄3.FrameRect函数-------绘制矩形边框、无填充

用刷子而不是刷子的好处是可以使用抖动色。

intFramerect(HDCHDC、CONST RECT *lprc、HBRUSH hbr ); 示例: Framerect(HDC,rect,hBrush );4.InvertRect函数-------将矩形区域中所有像素点反转

二进制位01反转时,颜色相反。 黑色变白,白色变黑,绿色变成品红色。

OOLinvertrect(HDCHDC,CONST RECT *lprc ); 示例: invertrect(HDC,rect );5.OffsetRect函数-------移动矩形,将改变坐标数据

booloffsetrect(LPrectlprc,//矩形指针int dx,//横向偏移,左负右正int dy ); //纵向偏移,上负下正6.InflateRect函数-------增大或减小指定矩形的宽和高

boolinflaterect(LPrectlprc,//矩形指针int dx,//X轴,负减少,正增加int dy ); //轴,负减少,正为7.SetRectEmpty函数-------将矩形设为空矩形

BOLsetrectempty(LPrectlprc;8.CopyRect函数-------复制矩形

BOOLcopyrect(LPrectlprcdst,//目标矩形CONST RECT* lprcSrc ); //来源矩形9.IntersectRect函数-------求两个源矩形的相交矩形

boolintersectrect (lpcrectlprcdst,//交叉矩形LPCRECT lpRect1,//源矩形1 LPCRECT lpRect2); //来源矩形2 10.UnionRect函数-------求两个源矩形的相并矩形

示例: unionrect(destrect,SrcRect1,SrcRect2); //结果,可包含两个Src的最小面积矩形11.IsRectEmpty函数-------判断是否为空矩形

示例: isrectempty(rect;12.PtInRect函数-------判断点是否在矩形内

OOLptinrect(constrect*lprc,//矩形指针POINTpt ); //指向指针应用:随机矩形本例将展示一个在程序等待消息输入的空闲阶段显示随机矩形的案例;

PeekMessage介绍:

不能在WM_PAINT消息响应中使用while(true )循环生成随机矩形。 否则,程序将停止响应其他消息,但在此处不使用计时器修改程序。

程序空闲时间意味着程序接收消息并响应操作,因为用户不与程序交互。

这段时间即为空闲时间,空闲时间的特征就是消息队列为空!

利用PeekMessage查看消息队列是否为空:

BOOL PeekMessage( LPMSG lpMsg, HWND hWnd , UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );

该函数和GetMessage的参数一样,只不过还多了一个操作选项,GetMessage函数时直接从队头取走一个消息(注意!是取走,就相当于将队头消息从队列中删除了),而PeekMessage只是偷看,即看一下队列中是否有消息(也是查看队头消息,并将该消息复制到第一个参数msg中),如果有消息则返回非0,无消息(即队列为空)则返回0,当然,查看完之后也可以和GetMessage一样将消息从队头取走(即删掉),这就是wRemoveMsg选项的作用,PM_REMOVE选项就和GetMessage函数的作用一样了(只不过返回值意义不一样而已),而PM_NOREMOVE则表示只偷看但不删除;
和GetMessage的共性:都不能删除队列中的WM_PAINT消息,WM_PAINT消息的删除只能通过Validate函数或者BeginPaint函数将无效区域有效化才能删除!即WM_PAINT的响应!使用PeekMessage函数的场合:在程序空闲时还要做一些其它任务的场合使用,

使用模板为:

while ( TRUE ){if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){ // 队列中有消息if ( WM_QUIT == msg.message ) break; // 要判断是否退出 TranslateMessage( &msg );DispatchMessage( &msg );}else{ // 程序空闲执行的功能代码。} 二、区域的创建、裁剪

区域介绍:

一个区域是对显示器一块空间的描述,这个空间可以是矩形、多边形和椭圆的组合等。我们可以在区域内 绘图或裁剪,将区域选入设备环境,就可以使用这个区域来裁剪(也就是将绘制限制在这区域内,只在裁剪区域里绘制)。区域也是GDI对象六大GDI对象之一,DeleteObject函数进行释放。也需要通过调用这个区域有程序员来创建、想要的大小、想要的形状、你可以在这个区域里面随心所欲填充图形,同时他也可以缩小、以及放大等等、还可以将多个区域进行组合、进行逻辑运算。

1.区域的创建

区域类型为 HRGN

矩形区域创建:CreateRectRgn函数和 CreateRectRgnIndirect函数和CreateRoundRectRgn函数

// 矩形区域HRGN hRgn = CreateRectRgn( xLeft, yTop, xRight, yBottom );HRGN hRgn = CreateRectRgnIndirect( &rect );//圆角矩形区域HRGN hRgn = CreateRoundRectRgn( xLeft, yTop, xRight, yBottom ,nWidthEllipse,nHeightEllipse);

椭圆区域创建:CreateEllipticRgn函数和 CreateRectRgnIndirect函数

// 椭圆区域HRGN hRgn = CreateEllipticRgn( xLeft, yTop, xRight, yBottom );HRGN hRgn = CreateRectRgnIndirect( &rect );

多边形区域创建:CreatePolygonRgn函数和 CreatePolyPolygonRgn函数

// 创建一个多边形区域BOOL CreatePolygonRgn(LPPOINT lpPoints, // 点数组的指针 int nCount, // 多边形的点数 int nMode); // 多边形填充模式,ALTERNATE或者WINDING//创建由多个多边形构成的区域HRGN hRgn = CreatePolyPolygonRgn( LPPOINT lpPoints, // 点数组的指针 lpPolyCounts // 每个封闭多边形的点数 int nCount, // 多边形的点数 int nMode); // 多边形填充模式,ALTERNATE或者WINDING

填充区域:FillRgn函数

FillRgn(hdc, // 设备DC hRgn, // 区域句柄 hbrush); // 画刷句柄

绘制区域边框:

FrameRgn(hdc, // 设备DC hRgn, // 区域句柄 hbrush); // 画刷句柄 2.区域的合并: CombineRgn函数

将两个区域组合为一个新区域。
在使用CombineRgn函数合并之前需要创建一个空区域,也就是初始化,用来接收两个区域合并后的新区域。

// 创建空区域HRGN hRgn=CreateRectRgn(0,0,1,1); // 所创建的刚好为一个像素大小,节省空间 int CombineRgn( hDestRgn, // 组合结果的区域句柄 hSrcRgn1, // 源区域1 hSrcRgn2, // 源区域2 fnCombineMode ); // 组合两区域的方式,有以下几种值: 值含义RGN_ANDhDestRgn被设置为两个源区域的交集(集合中的交集)RGN_COPYhDestRgn被设置为hSrcRgn1的拷贝RGN_DIFFhDestRgn被设置为hSrcRgn1与hSrcRgn2相减后的区域(集合中的差集)RGN_ORhDestRgn被设置为两个区域的并集(集合中的并集)RGN_XORhDestRgn被设置为两个区域的异或操作后的区域(集合中的异或操作)

[返回值]下列常数之一:
COMPLEXREGION:区域有互相交叠的边界
SIMPLEREGION:
区域边界没有互相交叠
NULLREGION:区域为空
ERRORAPI:不能创建组合区域

3.区域的裁剪

区域裁剪就是将绘图范围限制在此区域内,超出部分不能绘制。

可以使用InvalidateRgn( hWnd, hRgn, bErase )和ValidateRgn( hWnd, hRgn )来将WM_PAINT的作用范围限制在指定的区域内部;

也可以通过SelectObject( hdc, hRgn )或者SelectClipRgn( hdc, hRgn )将绘制范围限制在剪裁区域;

可以对被选入环境中的剪裁区域进行修改,如:

// 从现有的被选入环境中的剪裁区域中除去指定的矩形部分ExcludeClipRect( hdc, xLeft, yTop, xRight, yBottom );// 将现有的被选入环境中的剪裁区域和指定的矩形合并IntersectClipRect( hdc, xLeft, yTop, xRight, yBottom );// 将现有的剪裁区域朝x方向或y方向位移OffsetClipRgn( hdc, x, y );

好困啊!!!!!不行了,赶快躺床睡,眼睛瞎了~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。