C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: InvalidateRectの使い方について


(過去ログ 59 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■33598 / inTopicNo.1)  InvalidateRectの使い方について
  
□投稿者/ ロバート (1回)-(2009/03/05(Thu) 11:25:21)

分類:[C/C++] 

よろしくお願いします。

WindowsXP pro.
Visual C++ 2003 .net

今作っているアプリで、画面上のラジオボタンを押下する事でその画面上のラベル(複数)をすべて更新する処理があります。
ラベルはtextWで書いています。

その押下のイベントとしてはWndProcに下記の記述をしました。

case ID_RADIO:
  〜 画面上のラベル値を変更する処理 〜
  InvalidateRect(hWnd, Null, true);
UpdateWindow(hWnd);
break;


処理としては実現できているのですが、タスクマネージャを見る限りどうもメモリの開放が上手くいっていないようなので調べてみると、InvalidateRectが原因のようでした。

InvalidateRectを外すと、処理の実現はできませんがメモリは増えません。InvalidateRectを付けると増えます。

どなたか解決方法を教えていただければと思います。
よろしくお願いします。
引用返信 編集キー/
■33600 / inTopicNo.2)  Re[1]: InvalidateRectの使い方について
□投稿者/ .SHO (709回)-(2009/03/05(Thu) 11:46:24)
No33598 (ロバート さん) に返信

InvalidateRect 自体の問題ではなく、InvalidateRect によって
ひきおこされた WM_PAINT 内の処理に問題があるのではないでしょうか?
引用返信 編集キー/
■33601 / inTopicNo.3)  Re[2]: InvalidateRectの使い方について
□投稿者/ ロバート (2回)-(2009/03/05(Thu) 11:51:21)
No33600 (.SHO さん) に返信

ご回答ありがとうございます。

> InvalidateRect 自体の問題ではなく、InvalidateRect によって
> ひきおこされた WM_PAINT 内の処理に問題があるのではないでしょうか?

私もそう思ってWM_PAINTの中をすべてコメントアウトしてみたのですがやはりメモリは増える一方でした。
他に複雑な経路はないはずなのでInvalidateRectが原因なのかと思ったのです。
Invalidateの引数が問題の可能性もあるのかもしれませんが、上記の通り単純な引数なのでそれも考えにくいのかなぁと。
(hWndはWndProcが受ける引数のウィンドウハンドルです。)

引用返信 編集キー/
■33602 / inTopicNo.4)  Re[3]: InvalidateRectの使い方について
□投稿者/ .SHO (710回)-(2009/03/05(Thu) 12:07:40)
No33601 (ロバート さん) に返信

> 私もそう思ってWM_PAINTの中をすべてコメントアウトしてみたのですがやはりメモリは増える一方でした。

すべてコメントアウトするのではなく、最低限
BeginPaint( hWnd, &ps );
EndPaint( hWnd, &ps );
だけはやってあげないと、リージョンが消えないんじゃないかな?
引用返信 編集キー/
■33614 / inTopicNo.5)  Re[4]: InvalidateRectの使い方について
□投稿者/ ロバート (3回)-(2009/03/05(Thu) 14:11:53)
No33602 (.SHO さん) に返信

あ、すいません。言葉足らずでした。
BeginPaint( hWnd, &ps );とEndPaint( hWnd, &ps );だけを残したという意味でした^^;

色々試しているのですが、やはりInvalidateRectにたどり着いてしまいます。
引数として、第二引数がNULLなのがマズイのかなぁと勝手に思ったり。

ちなみにメモリ増加の割合は、5回押下毎に40KBほどです。
どうしようもないんでしょうかね・・・
引用返信 編集キー/
■33616 / inTopicNo.6)  Re[5]: InvalidateRectの使い方について
□投稿者/ .SHO (713回)-(2009/03/05(Thu) 14:20:04)
No33614 (ロバート さん) に返信

> 引数として、第二引数がNULLなのがマズイのかなぁと勝手に思ったり。

第二引数をNULLにするのは良くやりますから問題ないです。

> ちなみにメモリ増加の割合は、5回押下毎に40KBほどです。
> どうしようもないんでしょうかね・・・

それぐらいならシステムが使うかも知れないですね。
気にしなくていいような気もするけど。

ちなみに、InvalidateRect の次の UpdateWindow は
いらないんじゃないですか?

引用返信 編集キー/
■33618 / inTopicNo.7)  Re[6]: InvalidateRectの使い方について
□投稿者/ ロバート (4回)-(2009/03/05(Thu) 14:35:33)
No33616 (.SHO さん) に返信

> それぐらいならシステムが使うかも知れないですね。
> 気にしなくていいような気もするけど。

私もそう思うんですがユーザの指摘で対応して欲しいとの事なのです。

> ちなみに、InvalidateRect の次の UpdateWindow は
> いらないんじゃないですか?

そうですね。
とりあえずコメントアウトしておいてみます。

システムが使う分じゃどうしようもないですよね。
ただ、InvalidateRectの時だけ残るっていうのが気持ち悪いですが。
しかも頻繁に使う機能で、通常の使い方をしても一回のアプリ使用で数十回は押下されます。
そして数百回の押下があると、画面がめちゃくちゃに崩れて、フォームの外までラベルが飛び出す始末。
メモリが増えるのは仕方ないにしても、せめてこの現象だけでも何とかしたいです。

もしお心当たりがある現象でしたら対応策のご教授をお願いしたいです。
引用返信 編集キー/
■33619 / inTopicNo.8)  Re[7]: InvalidateRectの使い方について
□投稿者/ .SHO (714回)-(2009/03/05(Thu) 14:41:52)
No33618 (ロバート さん) に返信

確認ですけど
case ID_RADIO:
は、WndProcの中のWM_COMMANDの中ですよね?

引用返信 編集キー/
■33620 / inTopicNo.9)  Re[8]: InvalidateRectの使い方について
□投稿者/ ロバート (5回)-(2009/03/05(Thu) 14:53:59)
No33619 (.SHO さん) に返信

> case ID_RADIO:
> は、WndProcの中のWM_COMMANDの中ですよね?

はい。
そしてWM_PAINTで描画を記述しています。textoutWで。
引用返信 編集キー/
■33622 / inTopicNo.10)  Re[9]: InvalidateRectの使い方について
□投稿者/ .SHO (715回)-(2009/03/05(Thu) 15:05:13)
No33620 (ロバート さん) に返信

う〜ん、問題なさそうですね。

処理の実現にはなりませんが、非常に小さな領域を第2引数に指定して
InvalidateRectしても変わらないですかね?

引用返信 編集キー/
■33754 / inTopicNo.11)  Re[10]: InvalidateRectの使い方について
□投稿者/ とっちゃん (380回)-(2009/03/09(Mon) 13:58:06)
とっちゃん さんの Web サイト
No33622 (.SHO さん) に返信

WM_PAINT を BeginPaint/EndPaint だけにしても発生するのだとすると...
WM_ERASEBKGND あるいは、WM_CLIENTPRINT や WM_PAINT などで何かしているということはありませんか?


一応確認。「WM_PAINT をハンドリングしない場合」でも、発生するんですよね?
WM_PAINT 自身は DefWindowProc で適切に処理してます。

と、書いて思った。。。不必要にDefWindowProcしてるということもあり得るかもしれませんね。
自分でメッセージを受け取っているものでなおかつ、DefWindowProcを呼び出しているメッセージが何かを
羅列してみるとなにか見いだせるかもしれませんよ。

引用返信 編集キー/
■33755 / inTopicNo.12)  Re[11]: InvalidateRectの使い方について
□投稿者/ .SHO (730回)-(2009/03/09(Mon) 14:25:06)
No33754 (とっちゃん さん) に返信

> と、書いて思った。。。不必要にDefWindowProcしてるということもあり得るかもしれませんね。

それだと、BeginPaint/EndPaint 以外何もしてない。というのが嘘になりますね。
まぁ、そうなのかも知れないけど・・・
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -