Win32API

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

Win32API

#1

投稿記事 by DIL » 16年前

ビットマップの描画について質問です。
BitBltを使って描画したのですが画像が、作成したウィンドウ上ではなく別の場所に描画されてしまいます。
どこが間違っているのかわからないので、どなたか助けてください。
使用したソースファイルとビットマップは添付しておきます。

開発環境は
WindowsVista HomePremium SP1
VisualC++2008
です。

たいちう

Re:Win32API

#2

投稿記事 by たいちう » 16年前

まず、WndProc。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
	PAINTSTRUCT paint;
	HDC hdc;

	switch(msg){
		(略)
		case WM_PAINT://描画するとき
			hdc = BeginPaint(hWnd, &paint);
			DrawMain(hdc);
			EndPaint(hWnd, &paint);
			break;

次に、DrawMainとDrawPrayer(スペルミスですよ)。

void DrawMain(HDC hdc){
	DrawPrayer(hdc);
};

void DrawPrayer(HDC hdc){
	BitBlt(hdc,100,100,48,48,hCompateDC,0,0,SRCCOPY);
};
使っているのは、staticのhDCではなく、WndProcのローカルのhdcです。
私ならば、hDCは削除かな。

DIL

Re:Win32API

#3

投稿記事 by DIL » 16年前

回答ありがとうございます。
hDCにかかわるところをいじっていたらどこをどう直せばいいのかわからなくなってきました。
loadの中身も訂正しないとダメですよね?
主にそこがわかりません。
すみませんが訂正したコードを添付していただけないでしょうか。

たいちう

Re:Win32API

#4

投稿記事 by たいちう » 16年前

> loadの中身も訂正しないとダメですよね?

違いますよ。私が変更したところは、既に書いたところの他は、
DrawMainとDrawPrayerの宣言のみです。

DIL

Re:Win32API

#5

投稿記事 by DIL » 16年前

ありがとうございます。
おかげさまで、できました。
>私ならば、hDCは削除かな。
とありますが、hDCを削除した場合はload関数内を変更しないとコンパイルできませんが、
その場合はどのように書き換えればいいのですか?
あと、もうひとつ疑問が出てきたのでついでに質問します。
ゲーム等を作るときには画像データをたくさん描画しますけど、それらの画像はそれぞれの
デバイスコンテキストとかメモリデバイスコンテキストを用意しないとだめなんですか?

たいちう

Re:Win32API

#6

投稿記事 by たいちう » 16年前

これで解りますか?
case WM_CREATE://ウィンドウが作成されたとき
			hdc = GetDC(hWnd);//描画先となるウィンドウに対するデバイスコンテキストハンドルを取得
			load(hdc);
			ReleaseDC(hWnd,hdc);//ウィンドウのデバイスコンテキストハンドルを解放
			break;

void load(HDC hdc){
	//自機の画像をロード
	img_ch = (HBITMAP)LoadImage(NULL,TEXT("0.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
	if(img_ch == NULL){//ロードの確認
		MessageBox(hWnd,"ロードに失敗しました。","エラー",MB_OK | MB_ICONWARNING);
		return 0;
	};
	hCompateDC = CreateCompatibleDC(hdc);//メモリデバイスコンテキストハンドルを作成
	himg_ch = SelectObject(hCompateDC,img_ch);//ロードしたビットマップを選択
}
ReleaseDCはWM_DESTROYから移動させています。
それと今気付きましたが、関数の最後の"}"の後に";"は不要です。
クラスや構造体の定義の場合と間違えていませんか?

ちょっと手元に資料が見当たらないのですが、HDCは必要なときにGetDCやBeginPaintで
取ってくるものだったと思います。EndPaintやReleaseDCはその対ですので、そばに書きたい。
処理の出発点はメッセージループですので、私の場合、WndProc内でHDCを取得することが
多いです。描画などの関数を呼ぶときは、HDCのインスタンスを引数で渡します。
ここに描いてね、という感じで。

私はWinAPIは殆ど趣味でしか使わず、HDCの扱い方も全くの我流ですので、
あまり参考にされないほうが良いのかもしれません。
ゲームでの画像の扱い方についても、ケースバイケースじゃないの?としか言えません。
ゲームの入門書を何冊か読んだ程度ですし、私の作るWinAPIのプログラムで、
そんなに多くの画像データが必要になることはありませんでした。

まぁ、これについては、管理人さんを始めとして経験豊かな方が多いようですので、
その方々の回答を待ちましょう。

DIL

Re:Win32API

#7

投稿記事 by DIL » 16年前

>これで解りますか?
はい、わかりました。
>クラスや構造体の定義の場合と間違えていませんか?
"}"のあとは";"がいるものだと思ってました。

たいへん助かりました。本当にありがとうございました。

閉鎖

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