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;
浙公网安备 33010602011771号