ページ 1 / 1
キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 13:52
by ちー
キー押下によって色などの変化はできるようになったのですが
キー押下回数によって座標変化を施したいのですが力不足でできませんでした.
なにかやり方が根本的に間違っていると思うので
お教えいただけたら幸いです.
(今は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 );
}
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 14:44
by softya(ソフト屋)
すいません。やりたいことが良く分かりませんので具体的に例を上げて説明をお願いします。
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 16:48
by ちー
説明不足大変すみませんでした.
エンターキー押下一回目は座標1(640,512,12),そしてエンターキー押下二回目は座標2(700,600,12),三回目は・・・といった感じに押下回数によって定めた座標へ移動させたいのですが・・・
わかりにくくてすみません.
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 17:00
by softya(ソフト屋)
ちー さんが書きました:説明不足大変すみませんでした.
エンターキー押下一回目は座標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回目の場所に表示させます。
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 17:49
by ちー
ご返答ありがとうございます.
変数,変数の値,変数の追加,等の書き方がいまいちわかりません.
InvalidateRect()の原理はわかりました.
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 18:02
by softya(ソフト屋)
そこはC言語の基本と同じです。
1.方針:分かりやすく1,2,3を値にする。
2.関数外に抜けても値を保つようにstatic変数にして初期値1を与える。
3.ENTERで1なら2、2なら3に変化させる。
4.WM_PAINTで値に合わせてif文かswitch文で分岐して表示。
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 18:06
by ちー
一応考えてみたのですが
それはfor文で表わすということでしょうか.
C言語の知識があいまいでどのようにかけばいいかわかりません.
申し訳ありません.
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 18:08
by softya(ソフト屋)
ちー さんが書きました:一応考えてみたのですが
それはfor文で表わすということでしょうか.
C言語の知識があいまいでどのようにかけばいいかわかりません.
申し訳ありません.
ここは回答を書くサイトではないので、勉強していただくことになります。
for文は使いません。
とりあえず分かる範囲で書いてみてください。
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 19:01
by ちー
このようにしてみましたがなかなか厳しいです・・
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 );
}
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 19:33
by softya(ソフト屋)
色々と問題がありますね。
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言語をちゃんと勉強して欲しいのですが時間がないのでしょうか?
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 19:58
by ちー
ご迷惑おかけして本当にすみません.
低能な上に初心者で,また期限が決まっておりまして・・・
勉強が全く付いていかず困憊しております.
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 );
}
Re: キー押下回数に応じた座標変化について
Posted: 2012年11月19日(月) 20:27
by softya(ソフト屋)
すいません、こちらが指摘した点についてどう考えどう直したかを元の番号毎に書いてもらえますか?
それと書き忘れましたがインデントが乱れていますので、ちゃんと揃えてくださいね。
最後に基本中の基本ですがプログラムの流れてとしてプログラムは頭の命令から順に実行されると本当に理解されていますか?
draw の意味が全くないことになっています。