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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
レフェリア
記事: 33
登録日時: 12年前

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

#1

投稿記事 by レフェリア » 12年前

件名の通り矢印キーでの入力を受け取って文字を移動させたいのですがうまくいきません(´・ω・`)

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

よろしくお願いします 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;
}

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

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

#2

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

キー取得時に再描画されていないからではないでしょうか?
「Win32API(C言語)編 第14章 表示のタイミング」
http://www.geocities.jp/ky_webid/win32c/014.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

レフェリア
記事: 33
登録日時: 12年前

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

#3

投稿記事 by レフェリア » 12年前

>>softya(ソフト屋)さんへ

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

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

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

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

#4

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

レフェリア さんが書きました:>>softya(ソフト屋)さんへ

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

static int zahyou = 10;
にしてみたところ文字が動きました!
あっ見逃していました。
そうしないとダメですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

レフェリア
記事: 33
登録日時: 12年前

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

#5

投稿記事 by レフェリア » 12年前

続けてですが、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;
}

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

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

#6

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

InvalidateRect( hWnd, NULL, TRUE );にすれば前のが消えると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

レフェリア
記事: 33
登録日時: 12年前

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

#7

投稿記事 by レフェリア » 12年前

>>softya(ソフト屋)さんへ

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

閉鎖

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