C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 非イベント型プログラムでの文字描画


(過去ログ 53 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■29294 / inTopicNo.1)  非イベント型プログラムでの文字描画
  
□投稿者/ 七篠 (9回)-(2008/12/07(Sun) 17:36:38)

分類:[C/C++] 

環境 : Visual Studio 2005
言語 : C++, Win32API

こんばんは。

現在、非イベント型(ループ中に一定間隔で処理を行う)のウィンドウフォームで文字の描画をしたいのです。

しかし、一応描画はされるところまでいったのですが、そういった資料やサンプルが見つからず、
間違ったことをしているのではないかと不安です。(WM_PAINT イベント内で BeginPaint と EndPaint を
挟んで行うものしか見当たりませんでした)

描画までの処理は以下の通りです。

1: ウィンドウを作成した後、GetDC でデバイスコンテキストハンドルを取得しておく。
   (HDC が必要なところではこれを使います)

2; 背景の塗りつぶしが黒なので、文字の背景を透明に、文字色を白にしておく。

3: DrawText で描画。

4: EndPaint を呼び出す。(引数の PaintStruct は変数の宣言をした後、値を設定していません。
   それから、画面全体を毎ループ描画するから BeginPaint を呼んでいません。)

はじめは4の手順は必要ないと思っていたのですが、これがないと文字がチラチラしてしまいます。

これが間違っている、あるいは他に良い方法があればその方法を、この方法で問題なければ、
PaintStruct に設定すべき値をご教授いただければ幸いです。

どうぞ、よろしくお願いします。
引用返信 編集キー/
■29299 / inTopicNo.2)  Re[1]: 非イベント型プログラムでの文字描画
□投稿者/ chobi (8回)-(2008/12/07(Sun) 18:52:47)
GetDCで取得したならEndPaintじゃなくReleaseDCじゃないんですか?

paintstruct構造体は以下のような定義です。

typedef struct tagPAINTSTRUCT{
HDC DCのハンドル;
BOOL 更新時に背景を描画するか;
  RECT 更新する領域を含んだ長方形の左上と右下;
BOOL WIN予約;
BOOL WIN予約;
BYTE WIN予約;
}PAINTSTRUCT;

いまいちWM_PAINTを使わない理由が分かりませんが・・・・

引用返信 編集キー/
■29302 / inTopicNo.3)  Re[2]: 非イベント型プログラムでの文字描画
□投稿者/ 七篠 (11回)-(2008/12/07(Sun) 19:08:03)
お返事ありがとうございます。



> GetDCで取得したならEndPaintじゃなくReleaseDCじゃないんですか?
HDC の使用頻度が高いため、あらかじめ保存しておき、
はプログラムの終了時に ReleaseDC を行っています。



> paintstruct構造体は以下のような定義です。
>
> typedef struct tagPAINTSTRUCT{
> HDC DCのハンドル;
> BOOL 更新時に背景を描画するか;
>   RECT 更新する領域を含んだ長方形の左上と右下;
> BOOL WIN予約;
> BOOL WIN予約;
> BYTE WIN予約;
> }PAINTSTRUCT;
>
ここまでは調べていたのですが、提示した方法での場合 BeginPaintを使わないため
WIN 予約の部分を自分で設定するため知りたいのです。



> いまいちWM_PAINTを使わない理由が分かりませんが・・・・
ゆくゆくはゲームを作ろうと思っているので、描画はイベント発生時でなく、一定間隔で行う
必要があるためです。
引用返信 編集キー/
■29306 / inTopicNo.4)  Re[3]: 非イベント型プログラムでの文字描画
□投稿者/ chobi (9回)-(2008/12/07(Sun) 19:49:51)
> ここまでは調べていたのですが、提示した方法での場合 BeginPaintを使わないため
> WIN 予約の部分を自分で設定するため知りたいのです。

カーネルが勝手に使う領域なので私には分かりません。

>>いまいちWM_PAINTを使わない理由が分かりませんが・・・・
> ゆくゆくはゲームを作ろうと思っているので、描画はイベント発生時でなく、一定間隔で行う
> 必要があるためです。

InvalidateRect(), InvalidateRgn()等を一定感覚で呼んでクライアント領域を無効化させて
WM_PAINTを発生させる方が自然なように思えますが・・・
引用返信 編集キー/
■29322 / inTopicNo.5)  Re[3]: 非イベント型プログラムでの文字描画
□投稿者/ aetos (32回)-(2008/12/08(Mon) 09:56:20)
No29302 (七篠 さん) に返信

>>GetDCで取得したならEndPaintじゃなくReleaseDCじゃないんですか?
> HDC の使用頻度が高いため、あらかじめ保存しておき、
> はプログラムの終了時に ReleaseDC を行っています。

RegisterClassEx 時に CS_OWNDC を付けておくといいかもしれません。
それはそれとして、BeginPaint の処理が PAINTSTRUCT を設定しているだけとは限りませんので、仮に PAINTSTRUCT の内容を把握して自力で設定しても、BeginPaint を呼んでないのに EndPaint を呼んでいいとは思えません。
引用返信 編集キー/
■29323 / inTopicNo.6)  Re[1]: 非イベント型プログラムでの文字描画
□投稿者/ .SHO (323回)-(2008/12/08(Mon) 09:56:43)
No29294 (七篠 さん) に返信

> これが間違っている、あるいは他に良い方法があればその方法を

一定間隔で InvalidateRect() を発行して
WM_PAINT の中だけで描画してください。

引用返信 編集キー/
■29644 / inTopicNo.7)  Re[4]: 非イベント型プログラムでの文字描画
□投稿者/ 七篠 (12回)-(2008/12/11(Thu) 22:23:24)
返事が送れて申し訳ありません。

どうやらペイントメッセージで処理した方がよさそうですね。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -