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

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

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

Re[5]: GDI関数の描画座標がおかしくなる問題の原因について


(過去ログ 92 を表示中)

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

■55153 / inTopicNo.1)  GDI関数の描画座標がおかしくなる問題の原因について
  
□投稿者/ てつ (1回)-(2010/11/18(Thu) 13:23:48)

分類:[C/C++] 

お世話になります。

VC++9.0を使用しています。

Win32APIのGDIを使った描画処理に関連して、(まれに)発生している問題について
原因を探しているのですが、問題箇所の特定ができず困っております。

推定される原因、あるいは解決方法など、参考になる情報をご存知の方がいらっしゃいましたら、お助けいただけないでしょうか?

[現象]
Win32APIのGDI関数による描画を行っているのですが、
突発的に、一部のダイアログ上のウィンドウについてのみ、
そのウィンドウの座標ではなく、デスクトップ上に描画されるという、問題が発生します。

見た目でいうと、複数のダイアログ上のコントロールが、
デスクトップの左上に重ねて表示された状態になります。
問題が発生するプログラムのメインウィンドウ上のメニューやツールバー、ドッキングウィンドウなどは、
正常な位置で描画されたままの状態でした。

異常が発生するきっかけとしては、
・ダイアログのリサイズ
・アプリケーションの切り替え
などの操作が行われたようですが、再現頻度が低く絞込みができていません。

また、問題のきっかけとなったダイアログを閉じて、
開きなおすと正常な表示に戻ります。

[環境]
・VS2008 VC++9.0
 MFCのMDIアプリ + ActiveXコントロール

・OSは、WinXP、Win7で発生しました。

・使用しているGDI関数は
 ・DrawText
 ・DrawEdge
 ・FillRect
 ・MoveTo,LineTo
 などです。

・同じDLL内で、Theme APIを使った描画も使用しています。
 ・DrawThemeText
 ・DrawThemeEdge
 ・DrawThemeBackground


引用返信 編集キー/
■55156 / inTopicNo.2)  Re[1]: GDI関数の描画座標がおかしくなる問題の原因について
□投稿者/ 囚人 (567回)-(2010/11/18(Thu) 14:26:54)
どこかでスクリーン座標とクライアント座標を間違っているとか、たとえばWM_PAINT(OnPaint)のどこかで計算間違いしてるとかはないでしょうか。
引用返信 編集キー/
■55157 / inTopicNo.3)  Re[2]: GDI関数の描画座標がおかしくなる問題の原因について
□投稿者/ てつ (2回)-(2010/11/18(Thu) 14:46:35)
No55156 (囚人 さん) に返信
> どこかでスクリーン座標とクライアント座標を間違っているとか、たとえばWM_PAINT(OnPaint)のどこかで計算間違いしてるとかはないでしょうか。

囚人さん、返信ありがとうございます。

そうですよね。私も、そこを真っ先に疑ったのですが、以下の理由で、原因から外して考えています。

仮に計算を間違えても、平常時には、描画用APIのデバイスコンテキスト(HDC)の元となるウィンドウ(HWND)の
クライアント領域以外には、描画できないので、今回の現象は、座標値を間違えているようなバグではないと踏んでいます。
ちなみに、HDCを取得するのに、GetDC(HWND)を使用していますが、GetDC(NULL)で呼んでいることもなさそうです。

表現が適当かわかりませんが、
今のところ、デバイスコンテキストの領域を破壊するような処理(バグ)をどこかに埋め込んでいる可能性が一番高いと考えています。

過去には、WinNT OS上で、GDIリソースを食いつぶしたときに、類似の現象を体験したことがありますが、
今回の件については、今のところ、リソースの大量消費の有無を確認することができていません。


引用返信 編集キー/
■55160 / inTopicNo.4)  Re[3]: GDI関数の描画座標がおかしくなる問題の原因について
□投稿者/ オショウ (560回)-(2010/11/18(Thu) 16:25:20)
> 過去には、WinNT OS上で、GDIリソースを食いつぶしたときに、類似の現象を体験したことがありますが、
> 今回の件については、今のところ、リソースの大量消費の有無を確認することができていません。

  そのテストされたWinXP/Win7 両機のビデオボードの
  メーカーと型式は?

  大概ビデオドライバーの問題だったりするもので。

以上。
引用返信 編集キー/
■55161 / inTopicNo.5)  Re[3]: GDI関数の描画座標がおかしくなる問題の原因について
□投稿者/ てつ (3回)-(2010/11/18(Thu) 16:29:03)
自己レスです。

>
> 過去には、WinNT OS上で、GDIリソースを食いつぶしたときに、類似の現象を体験したことがありますが、
> 今回の件については、今のところ、リソースの大量消費の有無を確認することができていません。
>
>
特定オペレーションで、リソースのリークが発生する事が確認でき、
リークしている実装箇所の洗い出しで解決できそうです。

ありがとうございます&失礼いたしました。
解決済み
引用返信 編集キー/
■55162 / inTopicNo.6)  Re[4]: GDI関数の描画座標がおかしくなる問題の原因について
□投稿者/ てつ (4回)-(2010/11/18(Thu) 16:32:01)
No55160 (オショウ さん) に返信
>>過去には、WinNT OS上で、GDIリソースを食いつぶしたときに、類似の現象を体験したことがありますが、
>>今回の件については、今のところ、リソースの大量消費の有無を確認することができていません。
>
>   そのテストされたWinXP/Win7 両機のビデオボードの
>   メーカーと型式は?
>
>   大概ビデオドライバーの問題だったりするもので。
>
> 以上。


オショウさん、情報ありがとうございます。
自己レスを入れましたが、入れ違いになってしまいました。

今回の件は、結果的にH/Wの依存が見られなかったのですが、機種依存で同様の問題が発生する事もあるんですね。今後の参考にします。

引用返信 編集キー/
■55163 / inTopicNo.7)  Re[5]: GDI関数の描画座標がおかしくなる問題の原因について
□投稿者/ てつ (5回)-(2010/11/18(Thu) 16:36:14)
解決済みのチェックをしそこねてしまいました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -