
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);
は書かなくてもいいですか?
No.2ベストアンサー
- 回答日時:
基本的にWM_PAINTの場合はBeginPaintを使うほうがいい気がします。
というのはWM_PAINT時には再描画領域等の情報が設定されてきて
BeginPaintを使うと必要のない領域には描画されないはずです。
GetDCを使用するとこの情報は取得できず、Window全体に対して描画されるので
再描画の必要のない領域まで描画することになってしまいます。
ちなみに繰り返しとありますが、実際に繰り返されてるのは確かめられたのでしょうか?
BeginPaint では、窓の右に半分重なっていた別の窓が
消えた場合、窓の全てを再描画するのではなく、
窓の右半分だけを描画するということですね。
知りませんでした。ありがとうございます。
繰り返し については、窓のちらつきを見た感じで
予想したことです。
No.4
- 回答日時:
M_PAINTは無効化された(再描画が必要な)領域が在ると
送られてきますが、キューから取り除くには
マウスやタイマのメッセージのように単にメッセージを
処理すると取り除かれるのではなく、無効化された(再描画が必要な)
領域が無くなったときに除かれます。
BeginPaint、EndPaintは無効化された領域を処理しますが、
GetDCは無効化された領域とは関係なしに動作しますので、
依然として無効化された(再描画が必要な)領域が残ったままとなり
WM_PAINTがキューに存在し続けるわけです。
ReleaseDCの後にValidateRectで無効化された領域を消してやれば
GetDCの方も描画が繰り返されると言うことは無くなりますが、
これはお勧めしません。
hdc = GetDC(hWnd);
TextOut(hdc,0,0,str,strlen(str));
ValidateRect(hWnd,NULL);
ReleaseDC(hWnd,hdc);
これでちらつく問題が解決しました。
窓が隠れていれば、常に UINT に WM_PAINT が入るんですね。
ありがとうございます。

No.3
- 回答日時:
GetDC(),RelaseDC()のペアではメッセージキュー内のWM_PAINTメッセージが処理されず、無限にWM_PAINTが呼ばれつづけます。
そのためTextOutが呼ばれつづけちらつくのでしょう(ビデオカードのドライバによってはV-SYNCに同期して描画するためちらつかないものもあります)。
そのためWM_PAINTメッセージのハンドラではBeginPaint()、EndPaint()のペアを使う必要があります。尚、BeginPaint()、EndPaint(9を使う場合、ReleaseDC()する必要はありません。
ちらつきは、
switch (msg){
case WM_PAINT:
の中の GetDC( ),RelaseDC( ) のペアによって
UINT に WM_PAINT が入るせいで case WM_PAINT
が無限に繰り返していたからだったんですね。
ReleaseDC( ) が必要ないということもありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 飛行機・空港 ミルウォーキーツールHDC大阪から伊丹空港へ乗り換え無しで行く方法はありますか? できれば、空港直通 2 2023/05/12 06:44
- C言語・C++・C# C言語の質問です HTMLでこのようなコードを書いたのですがそれをC言語で同じように書きたいです < 1 2022/08/11 23:38
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
Minecraft 統合版(PC)の描画距...
-
WM_PAINTとBitBlt
-
Form1 Load で実行されない。
-
word
-
MFCでOnPaintのタイミング
-
CScrollViewの使用方法について
-
GDI+のDrawStringを使って文字...
-
プシュボタンのテキストの色を...
-
タブをオーナードローすると、...
-
リストビューでのドラッグ&ド...
-
VBAにGDI+を参照させる方法
-
panelのスクロール表示について
-
エクセルでガンチャートを作成...
-
c言語を使いダイアログにbmpを...
-
画面リサイズ時のちらつきをな...
-
VC++プログラムをつかったBMP画...
-
BitBltでの表示での問題です。
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報