個人事業主の方必見!確定申告のお悩み解決

case WM_TIMER:

hdc = GetDC(hwnd);

SelectObject(hdc, font);
SetBkMode(hdc, TRANSPARENT);

BeginPath(hdc);
TextOut(hdc, 0, 0, mt->ShowNowTime(mt), lstrlen(mt->ShowNowTime(mt)));
EndPath(hdc);

hRgn = PathToRegion(hdc); ←ここです。

SelectObject(hdc , GetStockObject(SYSTEM_FONT));

ReleaseDC(hwnd, hdc);

SetWindowRgn(hwnd, hRgn, TRUE);
InvalidateRect(hwnd, NULL, FALSE);

return 0;

時計(文字のみ)のデスクトップアクセサリーをつくろうと思ってますが、
hRgn = hRgn = PathToRegion(hdc);で繰り返し同じhRgnで生成したら、
hRgnのオブジェクト自体はまた生成されるのでしょうか?それともリージョンの演算結果が変わるだけでしょうか?
このソースはメモリリークをおこしているでしょうか?
PathToRegionはどのような動作をしているのでしょうか?

分かる方教えてください。
(いい文章の表現方法がわからなかったため直接疑問点を書いてみました。文章へたですみません。)

A 回答 (2件)

勿論PathToRegionを呼び出すたびに新たにリージョンが生成されます。

その場合、以前のリージョンを破棄する必要があるかどうかですね。
一般的にはregionはGDIオブジェクトですので、使用した後はDeleteObjectで破棄する必要があります(*1)。ただし、SetWindowRgnでウィンドウに関連付けた場合、SDKによると"(Y)ou should not make any further function calls with this region handle. In particular, do not close this region handle."とあるので、ウィンドウを破棄した場合やSetWindowRgnで別なリージョンを設定したときに勝手にシステムの側で破棄してくれるようですね。
それともうひとつ。上のコードでは時刻が変わっても即座に再描画されません。そこでInvalidateRectの後でUpdateWindowかRedrawWindowを呼び出して強制的に再描画したほうがよいでしょう。

*1.上のコードで使っているfontも同じくGDIオブジェクトですので、どこかで破棄する必要があります。
    • good
    • 0
この回答へのお礼

ほんとうにありがとうございます。いろいろネットでリージョンに関して探してもこの関数だけは全然情報が少なく、もしあっても基本的な使い方しかのってなく困ってました。心の靄が晴れた気分です^^(やっぱり英語は読めるようにならないと・・・)

お礼日時:2008/05/07 08:05

hRgn = hRgn = PathToRegion(hdc);



このコードは全く問題なく実行されるはずですが。つまり上のコードは
hRgn = PathToRegion(hdc);
hRgn = hRgn;
と同じことです。hRgnにそのまま自身の値をコピーしているだけで、同じパスからリージョンを二回以上生成しているわけではありません。

もしリージョンを二回以上生成したらどうなるかというご質問なら、Win32SDKのヘルプに
"After PathToRegion converts a path into a region, Windows discards the closed path from the specified device context. "
とありますので、二回目の関数コールでエラーになると予想できます。実際に二回呼び出してみれば確認できると思います。

この回答への補足

すみません^^;
hRgn = hRgn = PathToRegion(hdc)は記入ミスです。
コピペしたときの消し忘れです。すいませんでした。
質問内容は
タイマー関数で一定時間毎に (hRgnは静的) hRgn = PathToRegion(hdc);を呼び出した場合、毎回オブジェクト自体を生成しているのか、
それとも演算結果が変更されるのかどうかということを知りたかったという
質問です。すみませんでした。

補足日時:2008/05/06 06:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング