GetDCEx 這個API的用法,為什麼我的代碼不能正常工作? ( 积分: 200 )

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
GetDCEx 這個API的用法,為什麼我的代碼不能正常工作?

我的想法,我想對一個大的 Rect 填充,但這個大 Rect 中有一個小 Rect 我不想填充
我就建兩個 HRGN ,用大的減去小的,再用 GetDcEx 得到這個 HRGN 的 DC, 再在這個 DC 上作畫。理論上沒問題,但代碼就是不正常工作。
要麼就是亂畫,中間沒有洞,要麼就 GetDcEx 得到的 HDC 為 0還有就是要畫到最頂層的窗體上,到底是哪裡錯了。 GetDcEx 這個 API 到底要如何用??

代碼如下:

procedure TForm1.FormPaint(Sender: TObject);
var
R1: TRect;
R2: TRect;
HRGN1 : HRGN;
HRGN2 : HRGN;
HRGN3 : HRGN;

Dc : HDC;
bsh : HBRUSH;
begin
SetRect(r1, 10,10,300,300);
SetRect(r2, 20,20,290,290);

HRGN1 := CreateRectRgnIndirect(R1);
HRGN2 := CreateRectRgnIndirect(R2);
HRGN3 := CreateRectRgn(0,0,0,0);

if CombineRgn(HRGN3, HRGN1, HRGN2, RGN_DIFF) = ERROR then
begin
OutputDebugString('CombineRgn Error!!!');
end;

Dc := GetDCEx(Handle, HRGN3, 0);
if Dc = 0 then
begin
OutputDebugString(PChar(SysErrorMessage(GetLastError)));
end;

bsh := CreateSolidBrush(clYellow);
//FillRgn(Dc,HRGN3, bsh);

FillRect(Dc, R1, bsh);

ReleaseDC(Handle, Dc);
DeleteObject(HRGN1);
DeleteObject(HRGN2);
DeleteObject(HRGN3);
DeleteObject(bsh);

end;
 
后退
顶部