首页 > 技术文章 > 矩形、区域和裁剪

xyyh 2014-02-07 12:38 原文

矩形

FillRect (hdc, &rect, hBrush);   填充矩形,到达但不包括右下坐标
FrameRect (hdc, &rect, hBrush);  绘制矩形框,不填充,画刷用来绘制边框,此函数允许绘制不是纯色的矩形框,矩形边框是1个逻辑单位宽,如果逻辑单位大于设备单位,边框的宽度将是2个或更多像素。
InvertRect (hdc, &rect);  翻转矩形内所有像素,1变0 , 0变1 即白变黑,黑变白等等

操纵rect的 9 个函数
  SetRect (&rect, xLeft, yTop, xRight, yBottom);   可以一次初始rect
  OffsetRect (&rect, x, y);   矩形沿x轴和y轴移动几个单位
  InflateRect (&rect, x, y);  增大或减小矩形尺寸
  SetRectEmpty (&rect);   将矩形结构的各字段设为0
  CopyRect (&DestRect, &SrcRect);  复制矩形结构
  IntersectRect (&DestRect, &SrcRect1, &SrcRect2); 取两个矩形的交集
  UnionRect (&DestRect, &SrcRect1, &SrcRect2); 取两个矩形的并集
  IsRectEmpty (&rect);  判断是否为空
  PtInRect (&rect, point);  判断点是否在矩形内部



区域

//创建
HRGN hRgn;
hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom);   //建立矩形区域
hRgn = CreateRectRgnIndirect (&rect);   //另一种方法建立矩形区域
hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom);  //建立椭圆区域
hRgn = CreateEllipticRgnIndirect (&rect);   //建立椭圆区域
hRgn = CreateRoundRectRgn (xLeft, yTop, xRight, yBottom, nWidthEllipse, nHeightEllipse);  //创建圆角矩形区域
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)
iRgnType 区域类型
NULLREGION 空区域
SIMPLEREGION 简单的矩形、椭圆或多边形
COMPLEXREGION 矩形、椭圆或多边形的组合
ERROR 有错误发生


区域的绘图函数 类似矩形
FillRgn (hdc, hRgn, hBrush);
FrameRgn (hdc, hRgn, hBrush, xFrame, yFrame);   //xFrame
InvertRgn (hdc, hRgn);
PaintRgn (hdc, hRgn); //使用当前选入的画刷填充区域


删除区域
DeleteObject (hRgn);


InvalidateRect (hwnd, &rect, TRUE);     使显示的矩形区域无效,并产生一个WM_PAINT 消息,第二个参数为NULL时擦除整个客户区
GetUpdateRect     获取无效矩形的坐标,即剪裁区域
ValidateRect  使客户区的矩形有效


InvalidateRgn (hwnd, hRgn, bErase);    //类似作用的对区域的函数
ValidateRgn (hwnd, hRgn);


SelectObject (hdc, hRgn); //将区域选入到设备环境创建自己的剪裁区域,设备坐标
SelectClipRgn (hdc, hRgn); //将区域选入到设备环境创建自己的剪裁区域方法二,设备坐标
GDI为剪裁区域做了一个副本,因此把区域对象选入设备环境后,可以删除它。
ExcludeClipRect      从剪裁区域中去除一个矩形
IntersectClipRect    建立一个新的剪裁区域,新的剪裁区域是先前的剪裁区域和某个矩形的交集
OffsetClipRgn     把一个剪裁区域移动到客户区的另一部分

推荐阅读