バックバッファについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Integral

バックバッファについて

#1

投稿記事 by Integral » 14年前

WinAPIを独学している学生です。バックバッファのやり方がよく分らないため、質問させてください。

テンプレ使わせて頂きますね。
[1] 質問文
 [1.1] 自分が今行いたい事は何か
WinAPIを用いたバックバッファ(ビットマップをファイルから読み込み、一度裏画面に出力、その裏画面をディスプレイに出力するプログラム)

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:

#include <windows.h>

#define BMPFILE TEXT("test.bmp")

LRESULT CALLBACK WindowProc (
	HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
	HDC hdc;
	PAINTSTRUCT ps;
	static HDC hBackDC,hBmpDC;
	static HBITMAP hSampleBmp,hBackBmp;
	static BITMAP bitmap;

	switch(uMsg) {
	case WM_DESTROY:
		DeleteDC(hBackDC);
		DeleteDC(hBmpDC);
		DeleteObject(hSampleBmp);
		DeleteObject(hBackBmp);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		//ビットマップ用のデバイスコンテキスト
		hBmpDC = CreateCompatibleDC(NULL);
		hSampleBmp = LoadImage(
			NULL , BMPFILE , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE
		);
		SelectObject(hBmpDC , hSampleBmp);
		GetObject(hSampleBmp , sizeof(BITMAP) , &bitmap);

		//バックバッファ用のデバイスコンテキスト
		hBackDC = CreateCompatibleDC(NULL);
		hBackBmp = CreateCompatibleBitmap(NULL , bitmap.bmWidth , bitmap.bmHeight);
		SelectObject(hBackDC , hBackBmp);

		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		//ビットマップからバックバッファへの出力
		BitBlt(
			hBackDC , 0 , 0 , bitmap.bmWidth , bitmap.bmHeight ,
			 hBmpDC, 0 , 0 , SRCCOPY
		);
		//バックバッファからディスプレイへの出力
		BitBlt(
			hdc , 0 , 0 , bitmap.bmWidth , bitmap.bmHeight ,
			 hBackDC, 0 , 0 , SRCCOPY
		);

		EndPaint(hWnd , &ps);
		return 0;
	}
	return DefWindowProc(hWnd , uMsg , wParam , lParam);
}
※すいません。ソースはこれが全てではないのですが、禁止されている単語と表示されるため、全文を書き込めません。とりあえず問題となっているのはプロシージャ内なので、さしあたりここまでとさせてください。

 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
エラーメッセージはありません。
無事にコンパイルされるのですが、肝心の画像がウィンドウに出力されないので困っています。
元々はとある参考書の付録からの引用を改変してみたのですが、うまくいきません。

元々のソースでは、
「ファイル」→「仮想メモリ」→「ディスプレイ」という工程を踏んでいたのですが、
「ファイル」→「仮想メモリ1」→「仮想メモリ2(裏画面)」→「ディスプレイ」という操作ができるように変えたいのです。

 [1.4] 今何がわからないのか、知りたいのか
どうしたらこの工程を踏んで画像をディスプレイに出力できるようになるのでしょうか?

[2] 環境  
 [2.1] OS : Windows Vista
 [2.2] コンパイラ名 : VC++ 2008Express

[3] その他
 ・どの程度C言語を理解しているか
一応数冊参考書を読みました。大きなプロジェクトは未経験ですが、文字列制御、数値計算やグラフの出力といった小さなプログラムはいくつか作ってきているので、それなりに使えると自分では思っています。

わかる方がおられましたら、ご回答のほど宜しくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: バックバッファについて

#2

投稿記事 by softya(ソフト屋) » 14年前

こちらのサイトは参考になりますでしょうか。
http://www.geocities.jp/gamerabbits/programing.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: バックバッファについて

#3

投稿記事 by ISLe » 14年前

33行目を
hBackBmp = CreateCompatibleBitmap(hBmpDC , bitmap.bmWidth , bitmap.bmHeight);
とすれば表示されると思います。

#デバイスコンテキストハンドルの作りっぱなしはやめましょう。

Integral

Re: バックバッファについて

#4

投稿記事 by Integral » 14年前

お二人とも回答ありがとうございます。

>>softya(ソフト屋)さん
実はこの問題に3日間ぐらい悩まされてまして、その間にバックバッファについて書かれているサイトは大方回ってしまってました。リンクして頂いたサイトも見ましたがどうも分らなくて・・・。

>>ISLeさん
本当に助かりました。3日間頭を煮詰めた課題がようやく解決しました!
コメント頂いた『デバイスコンテキストハンドルの作りっぱなし』についてなのですが、具体的にはどこがいけなかったのでしょうか?

コード:

    case WM_DESTROY:
        DeleteDC(hBackDC);
        DeleteDC(hBmpDC);
        DeleteObject(hSampleBmp);
        DeleteObject(hBackBmp);
で自分としては生成したハンドルを削除したつもりだったのですが。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: バックバッファについて

#5

投稿記事 by ISLe » 14年前

Integral さんが書きました:コメント頂いた『デバイスコンテキストハンドルの作りっぱなし』についてなのですが、具体的にはどこがいけなかったのでしょうか?
ごめんなさい。
Createしたデバイスコンテキストは使い回しても問題なかったです。
使い回すと問題になるのはGetしたデバイスコンテキストでした。

Integral

Re: バックバッファについて

#6

投稿記事 by Integral » 14年前

>>ISLeさん

問題なくて安心しました。完全独学なのでまずい処理があっても誰も注意してもらえないものですから^^;

これでようやく裏画面処理が行えるようになりました。
グラフィカルなプログラミングの場合、何かしら画面に出力されれば何かしら手の打ちようもあるのですが、今回のように何も表示されないと本当に困ります。

これでようやく先に進めます本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る