2010-12-19 7 views
0

単純なグラフィックスを書くWindows WinMain()ウィンドウがあります。これは単にLineTo()とFillRect()です。長方形が動き回ります。約1時間後、oを使用した出力がメインウィンドウに表示され、クライアント座標が画面座標として解釈されているかのように、突然画面の左上に移動します。 GetDC()とReleaseDC()のバランスが取れているように見えますが、ReleaseDC()からの戻り値もチェックして、MSDNごとに0でないことを確認します。出力がメインウィンドウに戻ることがあります。私がデバッガ(VS 2010)に行ったとき、私の座標は間違っているように見えませんでしたが、出力は間違った場所に行きます。私はWM_PAINT、WM_CREATE、WM_TIMER、その他いくつかを扱います。私はこれをデバッグする方法を知らない。どんな助けもありがとう。ウィンドウの左上に描画されたWindowsクライアントグラフィック

答えて

2

これは、すべてその上に書かれた「戻り値チェックしていない」をしています。生のWin32プログラミングでは非常に重要ですが、ほとんどのAPI関数はブール値またはハンドルを返します.FALSEまたはNULLは失敗を示します。 GetLastError()はエラーコードを提供します。

コードを変更せずにこれをチェックする安価な方法は、デバッガを使用してAPIコールの後にEAXレジスタ値を調べる方法です。 A 0は障害を示します。 Visual Studioでは、[ウォッチ]ウィンドウの@eaxと@err疑似変数、それぞれ関数の戻り値とGetLastError値を使用して実行できます。

WindowsがAPI呼び出しに失敗すると、これはおそらくリソースリークのために悪くなります。 TaskMgr.exe、Processesタブでそれを見ることができます。ビュー+列を選択し、ハンドル、ユーザーオブジェクト、およびGDIオブジェクトをチェックします。通常は後者ですが、デバイスコンテキストを復元し、描画オブジェクトを解放するのは非常に簡単です。それが失敗するまで待つ必要はありません。その列の1つに登場する着実に登る数字がプレゼントです。値がヒットするとバリーアップします

+0

スポットがオン!ハンスGDIオブジェクトは、10,000(正確に)を頂点に達するまで着実に上昇しました。その瞬間、図面はスクリーンコーナーに切り替えられました。問題は、HPENをリリースしていないことでした。愚かなことに、私は、ReleaseDC()は、その支配下に作られたどんなリソースも破壊するだろうと考えていたに違いありません。うーん!私がGet-Release DCを数えた後、私はこれが非常に微妙な問題でなければならず、デバッグする指標はないと考えました。私はTaskMgrについても学びました。新しい、貧しい人々を助ける時間をとってくれてありがとう。 –

1

間違ってどこかでGetDC(NULL)を呼び出す必要があります。これはデスクトップ全体のDCを取得します。

あなたはすべてのあなたのGetDCの呼び出しは引数がこれを追跡支援するNULLである場合にアサートラッパー関数を呼び出して作ることができます:

#include <assert.h> 
HDC GetDCAssert(HWND hWnd) 
{ 
    assert(hWnd); 
    return ::GetDC(hWnd); 
} 
+0

ありがとう、レオ。これはあまりにも助けになりました。GetDC()はリソースが不足した後に画面座標を取得する可能性が高いです。 –

関連する問題