GetRgionData得到区域的数据

WINGDIAPI DWORD WINAPI GetRegionData( __in HRGN hrgn,
__in DWORD nCount,
__out_bcount_part_opt(nCount, return) LPRGNDATA lpRgnData);

 

typedef struct _RGNDATAHEADER {
DWORD dwSize;
DWORD iType;
DWORD nCount;  //表示区域中含有矩形的个数
DWORD nRgnSize;
RECT rcBound;
} RGNDATAHEADER, *PRGNDATAHEADER;

typedef struct _RGNDATA {
RGNDATAHEADER rdh;
char Buffer[1];  //存放矩形的内存。
} RGNDATA, *PRGNDATA, NEAR *NPRGNDATA, FAR *LPRGNDATA;

//For Example:

RECT rcClient;
::GetClientRect(m_hWnd, &rcClient);
CRgn rgn;
rgn.CreateRoundRectRgn(rcClient.left + 10, rcClient.top + 10, 200, 200, 6, 6);

CBrush brush;
brush.CreateSolidBrush(RGB(125, 0, 125));

HDC hdc = ::GetDC(m_hWnd);
//::FillRgn(hdc, rgn, brush);

int iDataSize = rgn.GetRegionData(NULL, 0); //得到区域数据的大小

LPRGNDATA lprgndata = new RGNDATA[iDataSize];  //申请区域数据的内存

rgn.GetRegionData(lprgndata, iDataSize);       //得到区域数据 

rgn.CreateFromData()
srand(255);
LPRECT lpRect = LPRECT(lprgndata->Buffer);     //存放的矩形的内存
for (int i = 0; i < lprgndata->rdh.nCount; i++)
{
CBrush brushTemp;
brushTemp.CreateSolidBrush(RGB(rand()%255, rand()%255, rand() % 255));
::FillRect(hdc, lpRect, brushTemp);
lpRect++;
}

delete[] lprgndata;
//::SetWindowRgn(m_hWnd, rgn, TRUE);
::ReleaseDC(m_hWnd, hdc);

WinAPI: ExtCreateRegion - 区域变换

以下转载自:http://www.cnblogs.com/del/archive/2008/06/03/1212534.html

procedure TForm1.RadioGroup1Click(Sender: TObject);
var
  RgnDataSize: Integer; {区域数据缓冲区的大小}
  RgnData: PRgnData;    {区域数据指针}
  TXF: TXForm;          {坐标转换的矩阵结构}
begin
  cvs.Font.Size := 120;
  cvs.Font.Style := [fsBold];
  SetBkMode(cvs.Handle, TRANSPARENT);

  {建立路径}
  BeginPath(cvs.Handle);
  cvs.TextOut(100, 0, 'F');
  EndPath(cvs.Handle);

  {将路径转换为区域}
  Rgn := PathToRegion(cvs.Handle);

  {获取区域数据}
  RgnDataSize := GetRegionData(Rgn, 0, nil);
  GetMem(RgnData, RgnDataSize);
  GetRegionData(Rgn, RgnDataSize, RgnData);

  case RadioGroup1.ItemIndex of
    0: begin {原始效果, 无变换}
      TXF.eM11 := 1;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    1: begin {右移 100}
      TXF.eM11 := 1;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1;
      TXF.eDx := 100;
      TXF.eDy := 0;
    end;
    2: begin {上移 40}
      TXF.eM11 := 1;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1;
      TXF.eDx := 0;
      TXF.eDy := -40;
    end;
    3: begin {横向放大 1.5}
      TXF.eM11 := 1.5;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    4: begin {纵向放大 1.5}
      TXF.eM11 := 1;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1.5;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    5: begin {整体放大 1.5 倍}
      TXF.eM11 := 1.5;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1.5;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    6: begin {整体缩小一半}
      TXF.eM11 := 0.5;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 0.5;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    7: begin {水平镜像}
      TXF.eM11 := -1;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := 1;
      TXF.eDx := 200; {需要右移一些才能看到}
      TXF.eDy := 0;
    end;
    8: begin {垂直镜像}
      TXF.eM11 := 1;
      TXF.eM12 := 0;
      TXF.eM21 := 0;
      TXF.eM22 := -1;
      TXF.eDx := 0;
      TXF.eDy := 200; {需要下移一些才能看到}
    end;
    9: begin {横向斜切}
      TXF.eM11 := 1;
      TXF.eM12 := 0.75;
      TXF.eM21 := 0;
      TXF.eM22 := 1;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    10: begin {纵向斜切}
      TXF.eM11 := 1;
      TXF.eM12 := 0;
      TXF.eM21 := 0.75;
      TXF.eM22 := 1;
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
    11: begin {旋转 30 度}
      TXF.eM11 := Cos(30*PI/180);
      TXF.eM12 := Sin(30*PI/180);
      TXF.eM21 := -Sin(30*PI/180);
      TXF.eM22 := Cos(30*PI/180);
      TXF.eDx := 0;
      TXF.eDy := 0;
    end;
  end;

  {执行变换并重绘}
  Rgn := ExtCreateRegion(@TXF, RgnDataSize, RgnData^);
  Repaint;

  FreeMem(RgnData);
end;
posted on 2014-11-10 16:29  归海一刀  阅读(1833)  评论(0)    收藏  举报