1

私は問題があります。スレッドでウィンドウを作成しました。ウィンドウハンドルが0になるまで関数を介して取得できないように、ミューテックスを作成しました。

また、whileループを使用して、ハンドルが0でないことを確認しました。

つまり、ウィンドウが画面に表示される前にCreateWindowExがウィンドウにハンドルを返すため、ハンドルが0になることはありません。

だから私のミューテックスとwhileループは失敗します。別のスレッドからウィンドウを描画できるように、ウィンドウが完全に表示され、必要な処理が完了したことを知る必要があります。

ハンドルは0ではなく、DCは0ではありません。しかし、私が描くとき、​​それは何も描きません。CreateWindowExとShowWindowを実行した直後にSleep(100)を配置すると、ウィンドウが表示され、画像が正しく描画されます。IsWindowVisisble(WindowHandle)をループしながらも試しました。それも失敗します。

寝たくない(100)、どうしたらいいの?

4

2 に答える 2

7

別のスレッドからウィンドウに描画しようとしないでください。

いくつかのデータをウィンドウに投稿し、そのデータに基づいてウィンドウ自体を描画させます。とにかくWM_PAINTに応答して自分自身を描画する準備をする必要があり、どのような場合でもそうするために必要なデータが必要です。フープを飛び越えて最初の描画を別の方法で行うと、多くの作業が追加され、基本的に何の見返りも得られません。

于 2012-12-25T17:18:58.587 に答える
0

また、メッセージキューで何かを行うまで、何も起こりません(ウィンドウは表示されません)。すなわちPeekMessage/GetMessageDispatchMessage。そして、他の人が言っているように、GDIを使用して描画している場合は、で実行する必要がありますWM_PAINT。強制的に更新する場合は、を使用してInvalidateRectください。他のスレッドで作成されたウィンドウを操作しようとすると、多くの落とし穴があることに注意してください。

于 2012-12-25T23:34:46.467 に答える