OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

TextOut( ) を BeginPaint( ) と GetDC( )

  • 暇なときにでも
  • 質問No.181031
  • 閲覧数1126
  • ありがとう数6
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 59% (194/328)

LRESULT CALLBACK の case WM_PAINT: で、

hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hWnd, &ps);

↑問題無し。↓文字がちらつく。

hdc = GetDC(hWnd);
TextOut(hdc,0,0,str,strlen(str));
ReleaseDC(hWnd,hdc);

ちらつきの原因は、高速で TextOut( ) が繰り返されるから
だと思いました。
どうして TextOut( ) が繰り返されるんですか?

上の方法の場合は、
ReleaseDC(hWnd,hdc);
は書かなくてもいいですか?
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル8

ベストアンサー率 60% (21/35)

基本的にWM_PAINTの場合はBeginPaintを使うほうがいい気がします。
というのはWM_PAINT時には再描画領域等の情報が設定されてきて
BeginPaintを使うと必要のない領域には描画されないはずです。
GetDCを使用するとこの情報は取得できず、Window全体に対して描画されるので
再描画の必要のない領域まで描画することになってしまいます。
ちなみに繰り返しとありますが、実際に繰り返されてるのは確かめられたのでしょうか?
お礼コメント
A__

お礼率 59% (194/328)

BeginPaint では、窓の右に半分重なっていた別の窓が
消えた場合、窓の全てを再描画するのではなく、
窓の右半分だけを描画するということですね。
知りませんでした。ありがとうございます。

繰り返し については、窓のちらつきを見た感じで
予想したことです。
投稿日時 - 2001-12-07 21:49:43
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル9

ベストアンサー率 43% (27/62)

何の関数の中のcase文なんでしょうか? ReleaseDC() は自分で GetDC() を記述したのでなければやってはいけません。 ...続きを読む
何の関数の中のcase文なんでしょうか?

ReleaseDC() は自分で GetDC() を記述したのでなければやってはいけません。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
上の例では ReleaseDC( ) を書いてはいけないんですね。
投稿日時 - 2001-12-07 21:45:05
  • 回答No.3
レベル11

ベストアンサー率 58% (114/195)

GetDC(),RelaseDC()のペアではメッセージキュー内のWM_PAINTメッセージが処理されず、無限にWM_PAINTが呼ばれつづけます。 そのためTextOutが呼ばれつづけちらつくのでしょう(ビデオカードのドライバによってはV-SYNCに同期して描画するためちらつかないものもあります)。 そのためWM_PAINTメッセージのハンドラではBeginPaint()、EndPaint()の ...続きを読む
GetDC(),RelaseDC()のペアではメッセージキュー内のWM_PAINTメッセージが処理されず、無限にWM_PAINTが呼ばれつづけます。
そのためTextOutが呼ばれつづけちらつくのでしょう(ビデオカードのドライバによってはV-SYNCに同期して描画するためちらつかないものもあります)。

そのためWM_PAINTメッセージのハンドラではBeginPaint()、EndPaint()のペアを使う必要があります。尚、BeginPaint()、EndPaint(9を使う場合、ReleaseDC()する必要はありません。
お礼コメント
A__

お礼率 59% (194/328)

ちらつきは、
 switch (msg){
 case WM_PAINT:
の中の GetDC( ),RelaseDC( ) のペアによって
UINT に WM_PAINT が入るせいで case WM_PAINT
が無限に繰り返していたからだったんですね。

ReleaseDC( ) が必要ないということもありがとうございます。
投稿日時 - 2001-12-07 21:56:37
  • 回答No.4
レベル7

ベストアンサー率 52% (10/19)

M_PAINTは無効化された(再描画が必要な)領域が在ると 送られてきますが、キューから取り除くには マウスやタイマのメッセージのように単にメッセージを 処理すると取り除かれるのではなく、無効化された(再描画が必要な) 領域が無くなったときに除かれます。 BeginPaint、EndPaintは無効化された領域を処理しますが、 GetDCは無効化された領域とは関係なしに動作しますので、 依然 ...続きを読む
M_PAINTは無効化された(再描画が必要な)領域が在ると
送られてきますが、キューから取り除くには
マウスやタイマのメッセージのように単にメッセージを
処理すると取り除かれるのではなく、無効化された(再描画が必要な)
領域が無くなったときに除かれます。
BeginPaint、EndPaintは無効化された領域を処理しますが、
GetDCは無効化された領域とは関係なしに動作しますので、
依然として無効化された(再描画が必要な)領域が残ったままとなり
WM_PAINTがキューに存在し続けるわけです。
ReleaseDCの後にValidateRectで無効化された領域を消してやれば
GetDCの方も描画が繰り返されると言うことは無くなりますが、
これはお勧めしません。
お礼コメント
A__

お礼率 59% (194/328)

hdc = GetDC(hWnd);
TextOut(hdc,0,0,str,strlen(str));
ValidateRect(hWnd,NULL);
ReleaseDC(hWnd,hdc);

これでちらつく問題が解決しました。

窓が隠れていれば、常に UINT に WM_PAINT が入るんですね。
ありがとうございます。
投稿日時 - 2001-12-07 22:16:38
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ