単純なグラフィックスを書くWindows WinMain()ウィンドウがあります。これは単にLineTo()とFillRect()です。長方形が動き回ります。約1時間後、oを使用した出力がメインウィンドウに表示され、クライアント座標が画面座標として解釈されているかのように、突然画面の左上に移動します。 GetDC()とReleaseDC()のバランスが取れているように見えますが、ReleaseDC()からの戻り値もチェックして、MSDNごとに0でないことを確認します。出力がメインウィンドウに戻ることがあります。私がデバッガ(VS 2010)に行ったとき、私の座標は間違っているように見えませんでしたが、出力は間違った場所に行きます。私はWM_PAINT、WM_CREATE、WM_TIMER、その他いくつかを扱います。私はこれをデバッグする方法を知らない。どんな助けもありがとう。ウィンドウの左上に描画されたWindowsクライアントグラフィック
答えて
これは、すべてその上に書かれた「戻り値チェックしていない」をしています。生のWin32プログラミングでは非常に重要ですが、ほとんどのAPI関数はブール値またはハンドルを返します.FALSEまたはNULLは失敗を示します。 GetLastError()はエラーコードを提供します。
コードを変更せずにこれをチェックする安価な方法は、デバッガを使用してAPIコールの後にEAXレジスタ値を調べる方法です。 A 0は障害を示します。 Visual Studioでは、[ウォッチ]ウィンドウの@eaxと@err疑似変数、それぞれ関数の戻り値とGetLastError値を使用して実行できます。
WindowsがAPI呼び出しに失敗すると、これはおそらくリソースリークのために悪くなります。 TaskMgr.exe、Processesタブでそれを見ることができます。ビュー+列を選択し、ハンドル、ユーザーオブジェクト、およびGDIオブジェクトをチェックします。通常は後者ですが、デバイスコンテキストを復元し、描画オブジェクトを解放するのは非常に簡単です。それが失敗するまで待つ必要はありません。その列の1つに登場する着実に登る数字がプレゼントです。値がヒットするとバリーアップします
間違ってどこかでGetDC(NULL)を呼び出す必要があります。これはデスクトップ全体のDCを取得します。
あなたはすべてのあなたのGetDCの呼び出しは引数がこれを追跡支援するNULLである場合にアサートラッパー関数を呼び出して作ることができます:
#include <assert.h>
HDC GetDCAssert(HWND hWnd)
{
assert(hWnd);
return ::GetDC(hWnd);
}
ありがとう、レオ。これはあまりにも助けになりました。GetDC()はリソースが不足した後に画面座標を取得する可能性が高いです。 –
- 1. OpenGLウィンドウの上にWindowsが描画されない
- 2. すべてのウィンドウの上に直接描画する描画
- 3. FLTKの子ウィンドウがLinux上で再描画されない
- 4. OpenGLはフレームバッファに描画されず、ウィンドウに描画されます
- 5. CardLayoutがウィンドウ上で正しく描画されない
- 6. C#のWin API。子ウィンドウに親ウィンドウが描画されます
- 7. 複数のモニタ上のすべてのウィンドウの上に描画
- 8. 画面はウィンドウの左上隅にのみ表示されます
- 9. Windows CE上のJScriptでの描画
- 10. 描画されたポリラインがマップ上に表示されない
- 11. JFrameの描画ウィンドウ
- 12. iPhone、画面が一番上に描画され、次にデュエルアプリのメニューバーの後に描画されます
- 13. ドッキングされたコントロールの上に線を描画する
- 14. キャンバス上で縮尺変更された画像上のアンドロイドの描画線
- 15. OSX上のWebViewに表示されたGoogleマップの上にサブビューを描画
- 16. ウィンドウのサイズを変更したときに、Windowsフォームが再描画されないのはなぜですか?
- 17. キャンバスの左上隅にテキストを描く
- 18. HatchBrushは、左上のダッシュだけを描画します。
- 19. C#のWindowsタスクバーに描画
- 20. オペレーティングシステムは画面上にウィンドウをどのように描画しますか?
- 21. Xlib - ビットマップの設定されたビットのみをウィンドウに描画します。
- 22. drawStringがウィンドウ上にテキストを描画しない
- 23. 不正な行がウィンドウに描画される
- 24. Javascriptイメージがオフスクリーンキャンバスに描画された後でキャンバスに描画されない
- 25. キャンバスにドラッグされた画像ビューの上にWPF描画矩形を描く方法
- 26. キャンバスが描画された後の描画の線幅
- 27. ネストされたコントロール+上部、左のプロパティ
- 28. Matlab - 画像上にスケーリングされた図形を描画する方法
- 29. GLXアプリケーションのデバッグ - 鈍いウィンドウが再描画されない
- 30. 標準描画Javaウィンドウ
スポットがオン!ハンスGDIオブジェクトは、10,000(正確に)を頂点に達するまで着実に上昇しました。その瞬間、図面はスクリーンコーナーに切り替えられました。問題は、HPENをリリースしていないことでした。愚かなことに、私は、ReleaseDC()は、その支配下に作られたどんなリソースも破壊するだろうと考えていたに違いありません。うーん!私がGet-Release DCを数えた後、私はこれが非常に微妙な問題でなければならず、デバッグする指標はないと考えました。私はTaskMgrについても学びました。新しい、貧しい人々を助ける時間をとってくれてありがとう。 –