画像の描画がうまくいかないのです

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

画像の描画がうまくいかないのです

#1

投稿記事 by きのこのこのこ » 14年前

マウスの左ボタンを離した時に座標を取得して配列に記憶
その時、配列の要素数を変えるための変数(j 初期値0)を1加算させます
WM_PAINT内でjが0でなければ取得した座標にBitBltで画像を描画するプログラムを作成しているのですが、1つ目の画像が描画された時、座標(0,0)にまで画像が描画されてしまいます
座標(0,0)に描画された画像はdrei[20]、vier[20]に座標が入れられた時に消えるようですのでそれが影響しているとは思うのですが解決法がわからないのです
ご教授願います

一部抜粋

コード:

LRESULT CALLBACK DocProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp)

static int x , y , j = 0 , ein , zwei , drei[256] , vier[256];
static int b1_w , b1_h , b2_w , b2_h , bm_w , bm_h;
static HBITMAP hB1 , hB2 , hBm;
static HDC hdc_b1 , hdc_b2 , hdc_bm;
BITMAP bi_b1 , bi_b2 , bi_bm;
HDC hdc;
PAINTSTRUCT ps;

case WM_MOUSEMOVE:
			x = LOWORD(lp);
			y = HIWORD(lp);
			return 0;
case WM_LBUTTONUP:
			drei[j] = x;
			vier[j] = y;
			j++;
			return 0;
case WM_PAINT:
			hdc = BeginPaint(hWnd , &ps);
			if(j != 0){
				BitBlt(hdc , drei[0]  , vier[0]  , b1_w , b1_h , hdc_b1 , 0 , 0 , SRCCOPY);
				BitBlt(hdc , drei[1]  , vier[1]  , b1_w , b1_h , hdc_b1 , 0 , 0 , SRCCOPY);
				BitBlt(hdc , drei[2]  , vier[2]  , b1_w , b1_h , hdc_b1 , 0 , 0 , SRCCOPY);
                 以下drei[20]、vier[20]までBitBlt
			}
			EndPaint(hWnd , &ps);
			return 0;

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 画像の描画がうまくいかないのです

#2

投稿記事 by bitter_fox » 14年前

きのこのこのこ さんが書きました:その時、配列の要素数を変えるための変数(j 初期値0)を1加算させます
WM_PAINT内でjが0でなければ取得した座標にBitBltで画像を描画するプログラムを作成しているのですが、1つ目の画像が描画された時、座標(0,0)にまで画像が描画されてしまいます
座標(0,0)に描画された画像はdrei[20]、vier[20]に座標が入れられた時に消えるようですのでそれが影響しているとは思うのですが解決法がわからないのです
ご教授願います
掲示していただいたプログラムの場合だと、最初に描画されるときに0~20まですべて描画されてしまいます。以下のようにするが適切でしょう。
(20に座標が入れられたときに消えるのはjから20までが座標(0, 0)に表示されていたのが、20に代入されることで正常な座標に表示されたためです。)

コード:

LRESULT CALLBACK DocProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp)

static int x , y , j = 0 , ein , zwei , drei[256] , vier[256];
static int b1_w , b1_h , b2_w , b2_h , bm_w , bm_h;
static HBITMAP hB1 , hB2 , hBm;
static HDC hdc_b1 , hdc_b2 , hdc_bm;
BITMAP bi_b1 , bi_b2 , bi_bm;
HDC hdc;
PAINTSTRUCT ps;

int k; // 追加

// WM_MOUSEMOVEは削除しました。

case WM_LBUTTONUP:
			if (j < 256)
			{
				drei[j] = LOWORD(lp);
				vier[j] = HIWORD(lp);	
				j++;
			}


			return 0;
case WM_PAINT:
			hdc = BeginPaint(hWnd , &ps);
			if(j != 0){
				for (k = 0; k < j; k++) // ここから
				{
					BitBlt(hdc , drei[k]  , vier[k]  , b1_w , b1_h , hdc_b1 , 0 , 0 , SRCCOPY);
				} // ここまで変更
			}
			EndPaint(hWnd , &ps);
			return 0;
オーバーフローが起きる可能性があったのでそこも修正しときました。

[hr][削除]
WM_LBUTTONUPのlParamの下位および上位ワードにマウスの位置情報が格納されているのでWM_MOUSEMOVEでわざわざx, yに代入してあげる必要はないので削除しました。
最後に編集したユーザー bitter_fox on 2010年12月29日(水) 16:08 [ 編集 1 回目 ]

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

Re: 画像の描画がうまくいかないのです

#3

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

これだったら、座標を入れていない配列を使っているのが原因だと思います。
お望みのことは

コード:

			int i;	//これを変数宣言に追加。

			for( i=0; i<j ; i++ )
                BitBlt(hdc , drei[i]  , vier[i]  , b1_w , b1_h , hdc_b1 , 0 , 0 , SRCCOPY);
			}
とすれば座標未定義も表示されなくなると思いますし、プログラムも簡単になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きのこのこのこ

Re: 画像の描画がうまくいかないのです

#4

投稿記事 by きのこのこのこ » 14年前

解決しました
お2人ともありがとうございます

閉鎖

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