キー押下回数に応じた座標変化について

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

キー押下回数に応じた座標変化について

#1

投稿記事 by ちー » 13年前

キー押下によって色などの変化はできるようになったのですが
キー押下回数によって座標変化を施したいのですが力不足でできませんでした.
なにかやり方が根本的に間違っていると思うので
お教えいただけたら幸いです.
(今は0~1となっていますが指定した座標に50か所以上押下回数によてって
座標を変化させたいのですが・・・)

コード:

  /// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	switch( msg )
	{
		

	case WM_KEYDOWN:        // キーが押されたとき
		if( wp == VK_RETURN ){ // エンターキーが押されたとき
		
			
			int count;
		     count=0;
		 count=count+1;
		
			
			for(count = 0; count < 1;count  ++){
				
				draw_round2(640,512,12); //赤い丸を提示
			   delete_round(640,512,3); //赤の中を白でくりぬく
                
if(count=0){
                draw_round2(640,512,12); //赤い丸を提示
			   delete_round(640,512,3); //赤の中を白でくりぬく
                
}
			 
if(count=1){
                draw_round2(700,600,12); //赤い丸を提示
			   delete_round(700,600,3); //赤の中を白でくりぬく
}


     
			
			}			
		}


	case WM_KEYDOWN:          // キーが離されたとき
		if( wp == VK_SPACE ){ // スペースキーが押されたとき
		
			delete_round(640,512,12);	//白で消去
			
			return 0;
		}
		break;  // 特に処理しないキーはDefWindowProc()に任せる

	case WM_DESTROY:        // ウィンドウが破棄されるとき
		PostQuitMessage( 0 );
		return 0;
	}

	return DefWindowProc( hWnd, msg, wp, lp );
} 

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

Re: キー押下回数に応じた座標変化について

#2

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

すいません。やりたいことが良く分かりませんので具体的に例を上げて説明をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ちー
記事: 13
登録日時: 13年前

Re: キー押下回数に応じた座標変化について

#3

投稿記事 by ちー » 13年前

説明不足大変すみませんでした.
エンターキー押下一回目は座標1(640,512,12),そしてエンターキー押下二回目は座標2(700,600,12),三回目は・・・といった感じに押下回数によって定めた座標へ移動させたいのですが・・・
わかりにくくてすみません.

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

Re: キー押下回数に応じた座標変化について

#4

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

ちー さんが書きました:説明不足大変すみませんでした.
エンターキー押下一回目は座標1(640,512,12),そしてエンターキー押下二回目は座標2(700,600,12),三回目は・・・といった感じに押下回数によって定めた座標へ移動させたいのですが・・・
わかりにくくてすみません.
そうですね問題点も含めて説明します。
1.描画はWM_PAINTメッセージで行なってください。あちこちで描画しちゃダメです。
2.どれを表示すべきかの変数を追加してください。
3.エンターキーが押される度に「どれを表示すべきかの変数」の値を変更させます。このとき再描画を促すためInvalidateRect()を行います。
「Win32API(C言語)編 第14章 表示のタイミング」
http://www.geocities.jp/ky_webid/win32c/014.html
4.WM_PAINTでは、「どれを表示すべきかの変数」の値に従って1,2,3回目の場所に表示させます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ちー
記事: 13
登録日時: 13年前

Re: キー押下回数に応じた座標変化について

#5

投稿記事 by ちー » 13年前

ご返答ありがとうございます.
変数,変数の値,変数の追加,等の書き方がいまいちわかりません.
InvalidateRect()の原理はわかりました.

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

Re: キー押下回数に応じた座標変化について

#6

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

そこはC言語の基本と同じです。
1.方針:分かりやすく1,2,3を値にする。
2.関数外に抜けても値を保つようにstatic変数にして初期値1を与える。
3.ENTERで1なら2、2なら3に変化させる。
4.WM_PAINTで値に合わせてif文かswitch文で分岐して表示。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ちー
記事: 13
登録日時: 13年前

Re: キー押下回数に応じた座標変化について

#7

投稿記事 by ちー » 13年前

一応考えてみたのですが
それはfor文で表わすということでしょうか.
C言語の知識があいまいでどのようにかけばいいかわかりません.
申し訳ありません.

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

Re: キー押下回数に応じた座標変化について

#8

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

ちー さんが書きました:一応考えてみたのですが
それはfor文で表わすということでしょうか.
C言語の知識があいまいでどのようにかけばいいかわかりません.
申し訳ありません.
ここは回答を書くサイトではないので、勉強していただくことになります。
for文は使いません。
とりあえず分かる範囲で書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ちー
記事: 13
登録日時: 13年前

Re: キー押下回数に応じた座標変化について

#9

投稿記事 by ちー » 13年前

このようにしてみましたがなかなか厳しいです・・
caseの場合分けの仕方などが間違っているのでしょうか・・・


コード:

 // ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	static int count=0;
	static BOOL draw = FALSE;
	HDC hDC;
	PAINTSTRUCT ps;


		draw = TRUE;
switch( msg )
	{
	case WM_KEYDOWN:        // キーが押されたとき
		if( wp == VK_RETURN )
		{
           
			count=count+1

			return 0;
		}
		break;  // 特に処理しないキーはDefWindowProc()に任せる

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

	case WM_PAINT:  // 無効領域があるときに送られてくる
		if( draw )  // クリックが1回でも発生した後のみ
		{
			hDC = BeginPaint( hWnd, &ps );
			Ellipse( hDC, x, y , x , y);
			EndPaint( hWnd, &ps );
			return 0;
		switch( msg )
	{
	case 1:        
		x=600;
		y=500;
		return 0;
	case 2:
        x=700;
		y=200;
		return 0;
		
		}

		break;

	case WM_DESTROY:  // ウィンドウが破棄されるとき
		PostQuitMessage( 0 );
		return 0;
	}

	return DefWindowProc( hWnd, msg, wp, lp );
}
 

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	
	case WM_KEYUP:          // キーが離されたとき
		if( wp == VK_SPACE )
		{
			delete_round(640,512,12);	//白で消去
			
			return 0;
		}
		break;  // 特に処理しないキーはDefWindowProc()に任せる

	case WM_DESTROY:        // ウィンドウが破棄されるとき
		PostQuitMessage( 0 );
		return 0;
	}

	return DefWindowProc( hWnd, msg, wp, lp );
} 
 
 

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

Re: キー押下回数に応じた座標変化について

#10

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

色々と問題がありますね。
1.draw = TRUE;が無条件ではダメなのでは?
2.count = count + 1したらInvalidateRect()が必要です。
3.returnとbreakの後の文は実行されないことを理解してください。
4.x,yはグローバル変数でしょうか?
5.switch( msg )のmsgはどこから? countじゃないと今のENTERを押した回数を把握できません。
6.表示した後でx,y座標を変えても意味が無いです。
7.Ellipseの座標が右上と左下の表示になっていないです。
あとコンパイルが通るようにしてください。
ホントはC言語をちゃんと勉強して欲しいのですが時間がないのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ちー
記事: 13
登録日時: 13年前

Re: キー押下回数に応じた座標変化について

#11

投稿記事 by ちー » 13年前

ご迷惑おかけして本当にすみません.
低能な上に初心者で,また期限が決まっておりまして・・・
勉強が全く付いていかず困憊しております.

case50ほどでもう一度繰り返すというのは可能でしょうか.

コード:

  // ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	static int x,y,count=0;
	static BOOL draw =  TRUE;
	HDC hDC;
	PAINTSTRUCT ps;


		draw = TRUE;
switch( msg )
	{
	case WM_KEYDOWN:        // キーが押されたとき
		if( wp == VK_RETURN )
		{
           
			count=count+1;
		
			// 無効領域を発生させる
        InvalidateRect( hWnd, NULL, TRUE );
		return 0;

			
		}
		
		
		
		switch( count )
	{
	case 1:        
		x=600;
		y=500;
		break;

	case 2:
        x=700;
		y=200;
		break;

		
		}
	case WM_PAINT:  // 無効領域があるときに送られてくる
		if( draw )  // クリックが1回でも発生した後のみ
		{
			hDC = BeginPaint( hWnd, &ps );
			Ellipse( hDC, x-12, y-12 , x-12 , y-12);
			EndPaint( hWnd, &ps );
			return 0;
		

		break;

	case WM_DESTROY:  // ウィンドウが破棄されるとき
		PostQuitMessage( 0 );
		return 0;
	}

	return DefWindowProc( hWnd, msg, wp, lp );
}


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

Re: キー押下回数に応じた座標変化について

#12

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

すいません、こちらが指摘した点についてどう考えどう直したかを元の番号毎に書いてもらえますか?
それと書き忘れましたがインデントが乱れていますので、ちゃんと揃えてくださいね。

最後に基本中の基本ですがプログラムの流れてとしてプログラムは頭の命令から順に実行されると本当に理解されていますか?
draw の意味が全くないことになっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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