質問 |
||
| 質問者: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も現在設定されているリージョンの演算結果を受け取るような考え方でいいのでしょうか? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |