Windowsプログラミング リージョンについて
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
HRGN hRgn1, hRgn2;
RECT rect;
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hRgn1 = CreateEllipticRgn(10, 10, 100, 100);
hRgn2 = CreateEllipticRgn(50, 50, 200, 150);
CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR);
SelectClipRgn(hdc, hRgn1);
GetClipBox(hdc, &rect);
GetClipRgn(hdc, hRgn2);
SelectClipRgn(hdc, NULL);
DeleteObject(hRgn1);
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
FillRgn(hdc, hRgn2, GetStockObject(BLACK_BRUSH));
DeleteObject(hRgn2);
EndPaint(hwnd, &ps);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
リージョンというものがよく理解できません。
なぜCombineRgnの第一引数のリージョンが存在していないといけないのですか?
DeleteObject(hRgn1);でhRgn1をDeleteしてるのにhRgn2が使えるのは
なぜですか?
GetClipRgnで設定されたリージョンを取得しているようなんですか、このリージョンは領域の情報の共有ではなく、たんなる
領域の情報のコピーなのですか?
DeleteObjectでDeleteしているhRgn1, hRgn2はどのリージョン(どのリージョンといった方がいいのかわかりませんが)を削除しているのか分かりません。
あと上記のソースとは関係ないのですが
hRgn1 = CreateEllipticRgn(10, 10, 100, 100);
hRgn2 = CreateEllipticRgn(50, 50, 200, 150);
CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR);
DeleteObject(hRgn1);
DeleteObject(hRgn2); ←もしかしてこれは不要?
としたとき DeleteObject(hRgn2);は不要なのでしょうか?
超初心者な質問ですみません。質問の仕方へたですみません。
分かる人お願いします。
お礼
ご指摘のとおり、0,0を開始点にすることで、解決できました。 panel内の矩形領域指定が間違っていたんですね。 アドバイスありがとうございました。