だめですか(vv;)。
では、ペンをWM_PAINT内で、CratePen() DeleteObject()するのをやめて、
WM_CREATEでペンの作成をし、WM_DESTROYで、ペンをDeleteObject()
する様に変更してみてはどうでしょう。
ペンのハンドルは、各メッセージ処理の関数から参照できる場所に
なければなりません。
ん?
特定のPCでメモリーオーバー?
ならば、特定のPCと他のPCの違いを調べてみる必要があるのでは?
又は、表示する画像の容量が大きいということはないですか?
仲澤@失業者やITOさんありがとうございます
ペンハンドル関係の解放処理を再確認してみます。
windows7に変更したことによるAPIの違いでエラーになるかもしれません
途中から描画できないとあるが「途中」とはどのくらい?
また、仲澤さんの指摘された部分を修正後
その「途中」に変化はありましたか?
>WM_PAINTは透明ウインドウ描画時のみ使用し、
>ペンによる描画はWM_MOUSEMOVEメッセージにより行っています。
描画タイミングが2個ありますが
そのどちらも反映されなくなりますか?
>描画ウインドウは常に最前面に表示するようにしています
って他のウィンドウが新しく最前面で立ち上がればこのウィンドウより上に来ると思いま
すが・・・。
それでも大丈夫なのかな?
どのようなソフトかは詳しく分からないけどそれなりの描画ソフトっぽいし自分なら
WM_MOUSEMOVE内で hMemDCに書いてInvalidateRectとUpdateWindowで描画を促して
WM_PAINT内でhMemDCをhDCにコピーして描画する・・・かな。
>描画を行う度にCreatePenとDeleteObjectを繰り返すひつようはありますか?
仲澤@失業者 さんが言われているけど、
同じペンを使い続けるなら最初に作って最後に削除するだけでいいと思います。
普通のウィンドウにWM_MOUSEMOVE内で線を引くのを繰り返すという単純なプログラムでも
なるのでしょうか?
正直、ペンのくだりではなく全然違う部分が原因って事もありえるのかも・・・。
ryoさんありがとうございます
ウインドウに文字を200文字程度書くと固まります
ほかに修正後も効果はありませんでした
daigo さんありがとうございます
daigo さんのアドバイスを参考にさせていただきながら
他の原因も考えています
GDIリソースをリークするプログラムを作ってwinxp/vista/7上で動かして
途中から描画が出来なくなる症状を確認してみました。
描画が出来なくなる症状が発生すると、xpではウィンドウのキャプションも再描画
されなくなります。
また、ARさんが紹介している[タスクマネージャ]-[プロセスタブ]-[表示(V)]-
[列の選択(S)...]-[GDIオブジェクト]をチェックする方法で確認したところ、
vista/7ともにGDIオブジェクトが10,000になると描画停止が起こりました。
メモリの食いつぶしは見られないとのことですが、vivace98さんのプログラムでは
GDIオブジェクトの数値はいくつくらいになっていますか?
>ウインドウに文字を200文字程度書くと固まります
固まる・・というのはハングアップ状態?
最初は、プログラムは動き続けていて描画だけされないとの話でしたが・・・
しかし、200文字程度というのはよくわからないです
200文字を表示するのに、一回で表示してるのか
一文字ずつ200回表示作業が行われているのか?
その作業はどのような手順が行われいてるのか?
わかりません
WM_PAINTがどのくらい呼ばれているのか(たとえば秒間n回で、何分間以上とか)
マウスによる作業をどのくらいやったのか
そういう感じで情報お願いします
♯Penの使い方のところでバグがあったみたいだし
♯その他の部分も出せるならソースを出してみるのもいいかも
>>WM_PAINTは透明ウインドウ描画時のみ使用し、
>>ペンによる描画はWM_MOUSEMOVEメッセージにより行っています。
>描画タイミングが2個ありますが
>そのどちらも反映されなくなりますか?
この質問についてはどうでしょうか?
あと実験ですが、
描画が反映されなくなった状態で、
そのウィンドウを最小化し、その後サイズ復帰をしてみたらどうなりますか?
> ウインドウに文字を200文字程度書くと固まります
ん?200文字?
FONTのGDIオブジェクト使ってないですか?
他のPCでは動いているというのがかなり気になりますね。
環境依存があるのかもとか。
単純に考えてグラフィクドライバ周りは大丈夫なのかなぁとか
考えてしまいますけれど。
あと、他のPCで動いている事がプログラムに問題が無い証明には
ならないのでその点は頭に置いておいた方が良いかなと思います。
メモリを壊している系の不具合だとこっちのPCでは動くのに
あっちのPCでは動かないなんて事も普通にありえるので。
kinoko さん
ありがとうございます
GDIオブジェクトの参照方法を間違えていました
描画不可能時にはGDIオブジェクトは10000になっていました
ITO さん
ありがとうございます
背景に円周率を表示しており
200ケタ程度数字をなぞるとかたまります
PATIO さん
ありがとうございます
GDIオブジェクトを確認しながら
メモリエラーをつぶしていきます
となるとGDIリソースの復元・解放・削除もれの可能性が高いかもしれません。
線の描画以外に、文字列の描画もされているようなので、
・線の描画に関連する部分のみコメントアウト
・文字描画に関連する部分のみコメントアウト
をそれぞれ実行してみて、GDIオブジェクトの数値や描画の停止が起こるかを確認し、
GDIリソースのリーク箇所を探してみてください。
HFONTを生成・使用している場合は、その部分もGDIの処理になります。