ページ 11

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

Posted: 2010年12月29日(水) 15:47
by きのこのこのこ
マウスの左ボタンを離した時に座標を取得して配列に記憶
その時、配列の要素数を変えるための変数(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;

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

Posted: 2010年12月29日(水) 16:02
by bitter_fox
きのこのこのこ さんが書きました:その時、配列の要素数を変えるための変数(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に代入してあげる必要はないので削除しました。

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

Posted: 2010年12月29日(水) 16:03
by softya(ソフト屋)
これだったら、座標を入れていない配列を使っているのが原因だと思います。
お望みのことは

コード:

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

			for( i=0; i<j ; i++ )
                BitBlt(hdc , drei[i]  , vier[i]  , b1_w , b1_h , hdc_b1 , 0 , 0 , SRCCOPY);
			}
とすれば座標未定義も表示されなくなると思いますし、プログラムも簡単になります。

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

Posted: 2010年12月29日(水) 16:08
by きのこのこのこ
解決しました
お2人ともありがとうございます