ページ 11

矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 13:39
by レフェリア
件名の通り矢印キーでの入力を受け取って文字を移動させたいのですがうまくいきません(´・ω・`)

ウィンドウプロシージャの部分のプログラムを載せますので
どのようにしたらいいかを教えてくれませんか?
矢印の上と下のみ使います。

よろしくお願いします m(_ _)m

コード:

//ウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	PAINTSTRUCT ps;
	HDC hdc;
	LPCTSTR lpszStr = TEXT("矢印キーを押すと動きます。");
	int zahyou = 10;

	switch (msg) {
		
		case WM_PAINT:

			hdc = BeginPaint(hWnd, &ps);

			TextOut(hdc, 10, zahyou,  lpszStr, lstrlen(lpszStr));
			
			EndPaint(hWnd, &ps);

			break;
		//キーを押したときの処理
		case WM_KEYDOWN:

			//押したキーの情報から上下に移動するように座標変更
			switch( wp )
			{
			case VK_UP:
				zahyou-=1;
				break;

			case VK_DOWN:
				zahyou+=1;
				break;

			default:
				break;
			}
			break;

		case WM_DESTROY:
			
			PostQuitMessage(0);
			
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

Re: 矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 14:18
by softya(ソフト屋)
キー取得時に再描画されていないからではないでしょうか?
「Win32API(C言語)編 第14章 表示のタイミング」
http://www.geocities.jp/ky_webid/win32c/014.html

Re: 矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 14:36
by レフェリア
>>softya(ソフト屋)さんへ

ありがとうございます!
ですが文字は動かなかったので
int zahyou = 10;

static int zahyou = 10;
にしてみたところ文字が動きました!

Re: 矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 14:38
by softya(ソフト屋)
レフェリア さんが書きました:>>softya(ソフト屋)さんへ

ありがとうございます!
ですが文字は動かなかったので
int zahyou = 10;

static int zahyou = 10;
にしてみたところ文字が動きました!
あっ見逃していました。
そうしないとダメですね。

Re: 矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 14:41
by レフェリア
続けてですが、Iキーを押すと元の位置に戻るようにしたいのですが

if( wp == 'I' )
zahyou = 10;

にすると、前の文字列が残ってしまいます。
残らないようにするにはどうすればよいでしょうか?

修正版のコードを乗せます。

コード:

//ウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	PAINTSTRUCT ps;
	HDC hdc;
	LPCTSTR lpszStr = TEXT("上下キーで動き I キーで元に戻る");
	static int zahyou = 10;

	switch (msg) {

		case WM_KEYDOWN:
			
			switch( wp )
			{
			case VK_UP:
				zahyou-=1;

			case VK_DOWN:
				zahyou+=1;

			}

			if( wp == 'I' )
				zahyou = 10;

			// 無効領域を発生させる
			InvalidateRect( hWnd, NULL, FALSE );
			return 0;

			break;
		
		case WM_PAINT:

			hdc = BeginPaint(hWnd, &ps);
			TextOut(hdc, 10, zahyou,  lpszStr, lstrlen(lpszStr));
			EndPaint(hWnd, &ps);

			break;

		case WM_DESTROY:
			PostQuitMessage(0);
			break;

		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

Re: 矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 14:44
by softya(ソフト屋)
InvalidateRect( hWnd, NULL, TRUE );にすれば前のが消えると思います。

Re: 矢印キーでの入力を受け取って文字を移動

Posted: 2013年1月15日(火) 14:46
by レフェリア
>>softya(ソフト屋)さんへ

ありがとうございます!!
InvalidateRectのことをすっかり忘れてました(汗)