ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:sizum 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);は不要なのでしょうか?

超初心者な質問ですみません。質問の仕方へたですみません。
分かる人お願いします。
質問投稿日時:08/04/21 08:24
質問番号:3964203
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:redfox63 『新たに』というより演算結果を格納するための受け皿です
新たにハンドルを作成する機能まで盛り込んでいないためあらかじめハンドルを作成しておかないといけない訳です

GetClipRgnは現在アプリケーションによって設定されているリージョン領域を取得する関数です
設定は SelectClipRgnで行います

このあたりの解説は VC++付属の MSDNなどで確認可能ですよ
種類:アドバイス
どんな人:専門家
自信:自信あり
回答日時:08/04/22 12:13
回答番号:No.2
この回答へのお礼ありがとうございました^^。

回答

 

回答者:redfox63 CombineRgnの第1引数ですが これは演算結果を受け取るためのハンドルだからです
2つのリージョンの演算結果を まったく別のリージョンに設定することも可能なのです

DeleteObjectは 引数に与えられたハンドルに関連付けされたオブジェクトを削除します
hRgn1とhRgn2は別空間に配置されていますので hRgn1にhRgn2の領域が含まれていても hRgn1でアクセスしているなら操作可能です

最後の別件ですが 必要です
CreateEllipticRgnで作成したハンドルと関連するオブジェクトは必ず削除するようにしましょう
繰り返し実行すると リソースを食いつぶしてしまい最悪の場合Windwosが不安定になり再起動をさせられる羽目になる可能性があります
種類:回答
どんな人:専門家
自信:自信あり
回答日時:08/04/21 17:14
回答番号:No.1
この回答への補足CombineRgnはあらたにオブジェクトを生成するのではなく、あらたに結合した演算結果を格納する(こうゆう表現でいいのか分かりませんが)関数みたいな感じで覚えればいいのでしょうか?
GetClipRgnも現在設定されているリージョンの演算結果を受け取るような考え方でいいのでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示