右クリックで一気に閉じてしまう

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
s707

右クリックで一気に閉じてしまう

#1

投稿記事 by s707 » 14年前

オプションに入り右クリックでタイトルへ
タイトルで右クリックで閉じる
という風にしたいのですが

オプションで右クリックで
一気に閉じてしまいます。

ご助力の程よろしくお願い致します。

コード:

//main.cpp

#include "DxLib.h"

void graphic();
void day();
void jihou();
void title();


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	int screensofthandle, capsofthandle, softhandle, grhandle ;
	int opacity, opacityadd ;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);

	
	if ( DxLib_Init( ) == -1 ) return -1;

	if( ProcessMessage() == -1 ){
		return 0;		// エラーが起きたらループを抜ける
	}

	title();

	DxLib_End( ); 
	return 0;
}


//title.cpp

#include "DxLib.h"
#include <time.h>
#define  FontSize 40
void day();
void jihou();
void graphic();

void title(){
	int Cr_0,Cr_1,Cr_2 ;
	int	MouseInput=0,MouseX=0,MouseY=0;
	int status=0; 

	// マウス状態管理用変数
	int nClickNow = 0;
	int nClickPrev = 0;
	
	int nClickNow_R = 0;
	int nClickPrev_R = 0;

	// 描画する文字列のサイズを設定
	SetFontSize( FontSize ) ;

	MouseInput = GetMouseInput() ;
	while (ProcessMessage() != -1 && ClearDrawScreen() != -1){
		nClickNow   = GetMouseInput();
		nClickNow_R = GetMouseInput();


		// マウス状態の更新
		nClickNow   = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);
		
		if ( nClickNow_R != 0 && nClickNow_R != nClickPrev_R && (nClickNow_R & MOUSE_INPUT_RIGHT) != 0){  // 右クリックされたら終了させる          
			break;
		}

		// 白色の値を取得
		Cr_0 = GetColor( 255 , 255 , 255 ) ;
		Cr_1 = GetColor( 255 , 255 , 255 ) ;
		Cr_2 = GetColor( 255 , 255 , 255 ) ;

		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );


		// マウスの入力を得る
		//MouseInput = GetMouseInput() ;

		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;

		if (nClickNow != 0 && nClickNow != nClickPrev){
			if(MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
				Cr_0 = GetColor( 255 , 255 , 0 ) ;
				day();
			}
			else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
				Cr_1 = GetColor( 255 , 255 , 0 ) ;
				jihou();
			}
			else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
				Cr_2 = GetColor( 255 , 255 , 0 ) ;
				graphic();
			}
			else
				status = 0;
			// 文字列の描画
			DrawString( 16 , 384 , "時刻" , Cr_0 );
			DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
			DrawString( 416 , 384 , "オプション" , Cr_2 );

			// マウスの入力を得る
			MouseInput = GetMouseInput() ;
		}
		else{
			time_t timer;
			struct tm *local;
			timer = time(NULL);//現在時刻を取得
			local = localtime(&timer); //地方時に変換

			int min[2],sec[2];
			min[0] = (local->tm_min / 10)%10;
			min[1] = local->tm_min % 10;

			sec[0] = (local->tm_sec / 10)%10;
			sec[1] = local->tm_sec % 10;

			if( !min[0] && !min[1] && !sec[0] && !sec[1] )day();
		}

		// 今回のクリック状態を保持する
		nClickPrev   = nClickNow;
		nClickPrev_R = nClickNow_R;

	}
}


//graphic.cpp

#include "DxLib.h"
 
#define FontSize 48
 
void graphic()
{
    // 描画する文字列のサイズを設定
    SetFontSize(FontSize);
 
    // マウスを表示状態にする
    SetMouseDispFlag(TRUE);
 
    // 文字列表示色を白で初期化しておく
    int nColor[4] = {GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF)};
 
    // 曜日情報保持用配列
    int nDayState[4] = {0, 0, 0, 0};
 
    // マウス状態管理用変数
    int nClickNow = 0;
    int nClickPrev = 0;

	int nClickNow_R = 0;
	int nClickPrev_R = 0;
 
    // メッセージ処理と、画面の消去処理を行いつつ処理ループ
    while (ProcessMessage() != -1 && ClearDrawScreen() != -1)
    {
        nClickNow = GetMouseInput();
		nClickNow_R = GetMouseInput();
		
 
        // マウス状態の更新
        nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);
		
		if ( nClickNow_R != 0 && nClickNow_R != nClickPrev_R && (nClickNow_R & MOUSE_INPUT_RIGHT) != 0){  // 右クリックされたら終了させる     
            break;
        }

        if (nClickNow != 0 && nClickNow != nClickPrev)
        {
            // マウスの位置を取得
            int nMouseX = 0;
            int nMouseY = 0;
            GetMousePoint(&nMouseX, &nMouseY);
 
            // 文字の色と曜日の更新
            for (int i = 0; i < 4; ++i)
            {
                // クリックされた箇所の判定
                if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
                {
                    // 色を変更して、曜日を1つ進める
                    nColor[i] = GetColor(0xFF, 0xFF, 0x00);
 
                    // 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる
                    nDayState[i] = (nDayState[i] + 1) % ((i == 3) ? 2 : 7); 
                }
                else
                {
                    // 今回変更した箇所以外の色を戻す
                    nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
                }
            }
        }
 
        // 今回のクリック状態を保持する
        nClickPrev = nClickNow;
		nClickPrev_R = nClickNow_R;
 
        // 文字列の描画
        const char* pszDay1[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
        const char* pszDay2[] = {"当日", "翌日"};
        DrawString( 64,  64, "燃えるゴミ", nColor[0]);
        DrawString( 64, 128, "燃えないゴミ", nColor[1]);
        DrawString( 64, 192, "資源ゴミ", nColor[2]);
        DrawString( 64, 256, "再生日切替", nColor[3]);
        DrawString(448,  64, pszDay1[nDayState[0]], nColor[0]);
        DrawString(448, 128, pszDay1[nDayState[1]], nColor[1]);
        DrawString(448, 192, pszDay1[nDayState[2]], nColor[2]);
        DrawString(448, 256, pszDay2[nDayState[3]], nColor[3]);
        ScreenFlip();
    } 
}


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

Re: 右クリックで一気に閉じてしまう

#2

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

右クリックですぐ抜けてしまうのは、右クリックが押されてからの継続期間をカウントしていないからだと思います。
押されたらカウントを始めて、離したら0に戻るカウンタを作ってもらえば管理しやすいと思います。この処理は1フレームに1回処理します。

あとwhile (ProcessMessage() != -1 && ClearDrawScreen() != -1){があちこちにありますが、多分ループをちゃんとし管理しきれていないので問題が起きやすいです。
ゲームプログラミングの館の
「34. メイン関数の書き方。」
http://dixq.net/g/37.html
を参考にしてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: 右クリックで一気に閉じてしまう

#3

投稿記事 by s707 » 14年前

ご返信ありがとうございます。色々試してみましたがうまくいかず
なかなか進展しないです。コードは直しました。

コード:


//main.cpp
#include "DxLib.h"

void graphic();
void day();
void jihou();
int title();


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	// マウス状態管理用変数
	int nClickNow_R = 0 , nClickPrev_R = 0;

	int frmcnt = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);


	if ( DxLib_Init( ) == -1 ) return -1;

	while (1){
		// マウス状態の更新
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R)frmcnt++;//右クリックを押しているときはカウントアップ
		else{frmcnt = 0;}//それ以外ではカウントを0にする

		if ( ProcessMessage() == -1 || !frmcnt && nClickPrev_R){  // 右クリックされたら終了させる     プロセスメッセージは1ループ毎に1回必要
			break;
		}
		int status = title();

		if(status == 1)
			day();
		else if(status == 2)
			jihou();
		else if(status)
			graphic();

		// 今回のクリック状態を保持する
		nClickPrev_R = nClickNow_R;
	}

	DxLib_End( ); 
	return 0;
}


//title.cpp
#include "DxLib.h"
#include <time.h>
#define  FontSize 40
void day();
void jihou();
void graphic();

int title(){
	int Cr_0,Cr_1,Cr_2 ;
	int	MouseInput=0,MouseX=0,MouseY=0;
	int status=0; 

	// マウス状態管理用変数
	int nClickNow = 0;
	int nClickPrev = 0;

	int nClickNow_R = 0;
	int nClickPrev_R = 0;

	// 描画する文字列のサイズを設定
	SetFontSize( FontSize ) ;

	// マウス状態の更新
	nClickNow   = (GetMouseInput() & MOUSE_INPUT_LEFT);
	nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);


	// 白色の値を取得
	Cr_0 = GetColor( 0xff , 0xff , 0xff ) ;
	Cr_1 = GetColor( 0xff , 0xff , 0xff ) ;
	Cr_2 = GetColor( 0xff , 0xff , 0xff ) ;

	// 文字列の描画
	DrawString( 16 , 384 , "時刻" , Cr_0 );
	DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
	DrawString( 416 , 384 , "オプション" , Cr_2 );

	// マウスの位置を取得
	GetMousePoint( &MouseX , &MouseY ) ;

	if(MouseX > 20 && MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
		Cr_0 = GetColor( 0xff , 0xff , 0 ) ;
		if (nClickNow && nClickNow != nClickPrev)status = 1;
	}
	else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
		Cr_1 = GetColor( 0xff , 0xff , 0 ) ;
		if (nClickNow && nClickNow != nClickPrev)status = 2;

	}
	else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
		Cr_2 = GetColor( 0xff , 0xff , 0 ) ;
		if (nClickNow && nClickNow != nClickPrev)status = 3;
	}
	else
		status = 0;
	// 文字列の描画
	DrawString( 16 , 384 , "時刻" , Cr_0 );
	DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
	DrawString( 416 , 384 , "オプション" , Cr_2 );

	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	if( !min[0] && !min[1] && !sec[0] && !sec[1] && !status )status = 1;//一時間毎に時刻を読む

	// 今回のクリック状態を保持する
	nClickPrev   = nClickNow;
	nClickPrev_R = nClickNow_R;

	return status;
}


//graphic.cpp
#include "DxLib.h"

#define FontSize 48

void graphic()
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	// マウスを表示状態にする
	SetMouseDispFlag(TRUE);

	// 文字列表示色を白で初期化しておく
	int nColor[4] = {GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF)};

	// 曜日情報保持用配列
	int nDayState[4] = {0, 0, 0, 0};

	// マウス状態管理用変数
	int nClickNow = 0;
	int nClickPrev = 0;

	int nClickNow_R = 0;
	int nClickPrev_R = 0;

	// メッセージ処理と、画面の消去処理を行いつつ処理ループ
	while (1){
		ProcessMessage();
		ClearDrawScreen();

		int nMouseX = 0;
		int nMouseY = 0;

		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);
		
		if( nClickNow_R && nClickNow_R != nClickPrev_R )break;

		if ( nClickNow && nClickNow != nClickPrev )
		{
			// マウスの位置を取得
			GetMousePoint(&nMouseX, &nMouseY);

			// 文字の色と曜日の更新
			for (int i = 0; i < 4; ++i)
			{
				// クリックされた箇所の判定
				if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
				{
					// 色を変更して、曜日を1つ進める
					nColor[i] = GetColor(0xFF, 0xFF, 0x00);

					// 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる
					nDayState[i] = (nDayState[i] + 1) % ((i == 3) ? 2 : 7); 
				}
				else
				{
					// 今回変更した箇所以外の色を戻す
					nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
				}
			}
		}


		// 今回のクリック状態を保持する
		nClickPrev = nClickNow;
		nClickPrev_R = nClickNow_R;

		// 文字列の描画
		const char* pszDay1[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
		const char* pszDay2[] = {"当日", "翌日"};
		DrawString( 64,  64, "燃えるゴミ", nColor[0]);
		DrawString( 64, 128, "燃えないゴミ", nColor[1]);
		DrawString( 64, 192, "資源ゴミ", nColor[2]);
		DrawString( 64, 256, "再生日切替", nColor[3]);
		DrawString(448,  64, pszDay1[nDayState[0]], nColor[0]);
		DrawString(448, 128, pszDay1[nDayState[1]], nColor[1]);
		DrawString(448, 192, pszDay1[nDayState[2]], nColor[2]);
		DrawString(448, 256, pszDay2[nDayState[3]], nColor[3]);
		ScreenFlip();
	} 
}


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

Re: 右クリックで一気に閉じてしまう

#4

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

やることは2つです。
まず、回数は数えているみたいですが、
!frmcnt && nClickPrev_R
ではなくfrmcnt==1だけ反応すれば良いです。2以上は連続で押されている場合なので反応してはいけません。
nClickPrev_Rも不要です。

それとfrmcntを各関数に引数で受渡していませんので、同じ情報が使えません。
ところでfrmcntってどういう意味でしょう?名前はnClickR_Countで良い気がしますが。

もう1つは、あちこちにあるwhileループを止めてmainのwhileループだけにしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: 右クリックで一気に閉じてしまう

#5

投稿記事 by s707 » 14年前

frmcnt==1 にしました。

名前はそれでいいと思います。
frmcntはフレームカウントです。

whileはmain.cpp と graphic.cppにあります。
graphic.cpp の whileは外しづらいです。

graphic.cpp の whileを止めると曜日変更がやりづらくなるからです。

whileを止めて曜日変更をする方法はグローバル変数やスタティック変数を
使う方法です。でもそれはあまり使わないほうがいいと思うので。

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

Re: 右クリックで一気に閉じてしまう

#6

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

s707 さんが書きました:名前はそれでいいと思います。
frmcntはフレームカウントです。
何のフレームカウントって情報が抜け落ちている名前なので余りお薦めはしません。
s707 さんが書きました:whileを止めて曜日変更をする方法はグローバル変数やスタティック変数を
使う方法です。でもそれはあまり使わないほうがいいと思うので。
whileループが多数あると整合性を取るのに苦労するのでお勧めできません。
特にnClickNow_Rの取得など同じような処理が何箇所もあるとタイミングの制御に失敗する恐れがあります。
右クリックで予定外に抜けてしまう事態を防ぐために直しているのに、それがうまく働かずに抜けてしまう事が考えられます。
これは、変数をstaticにするよりも動的バグ原因になると思います。

例えば、龍神録等を見てもらえば分かりますがProcessMessage()やScreenFlip();を呼んでいるところは一箇所しかありません。
それと同じくキー入力しているところも一箇所で、1フレームに1回しか呼び出されないようになっています。
なぜ、こうするのかと言うとタイミング・バグを避けるためとしか言えません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: 右クリックで一気に閉じてしまう

#7

投稿記事 by s707 » 14年前

おかげさまで助かりました。
これで次へ進めます。
ありがとうございます。

コード:


//main.cpp
#include "DxLib.h"

void graphic();
void day();
void jihou();
int title(int);


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);


	if ( DxLib_Init( ) == -1 ) return -1;

	while (1){
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if ( ProcessMessage() == -1 || !status && nClickR_Count == 1){  // プロセスメッセージは1ループ毎に1回必要
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
			ClearDrawScreen();
		}

		int temp = title(status);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				day();
				status = 0;
			}
			else if(status == 2 ){
				jihou();
				status = 0;
			}
			else if(status)
				graphic();
		}

		// 今回のクリック状態を保持する
		nClickPrev = nClickNow;
		nClickPrev_R = nClickNow_R;
	}

	DxLib_End(); 
	return 0;
}



//title.cpp
#include "DxLib.h"
#include <time.h>
#define  FontSize 40

int title(int hyouji_hantei){
	int status=0; 
	if(hyouji_hantei != 3){
		int Cr_0,Cr_1,Cr_2 ;
		int	MouseInput=0,MouseX=0,MouseY=0;

		// 描画する文字列のサイズを設定
		SetFontSize( FontSize ) ;

		// 白色の値を取得
		Cr_0 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_1 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_2 = GetColor( 0xff , 0xff , 0xff ) ;

		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );

		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;

		if(MouseX > 20 && MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
			Cr_0 = GetColor( 0xff , 0xff , 0 ) ;
			status = 1;
		}
		else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
			Cr_1 = GetColor( 0xff , 0xff , 0 ) ;
			status = 2;

		}
		else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
			Cr_2 = GetColor( 0xff , 0xff , 0 ) ;
			status = 3;
		}
		else
			status = 0;
		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );
	}
	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	if( !min[0] && !min[1] && !sec[0] && !sec[1] && !status )status = 1;//一時間毎に時刻を読む

	return status;
}



//graphic.cpp
#include "DxLib.h"

#define FontSize 48

void graphic()
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	// マウスを表示状態にする
	SetMouseDispFlag(TRUE);

	// 文字列表示色を白で初期化しておく
	int nColor[4] = {GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF)};

	// 曜日情報保持用配列
	static int nDayState[4] = {0, 0, 0, 0};

	ClearDrawScreen();

	int nMouseX = 0;
	int nMouseY = 0;
	// マウスの位置を取得
	GetMousePoint(&nMouseX, &nMouseY);

	// 文字の色と曜日の更新
	for (int i = 0; i < 4; ++i)
	{
		// クリックされた箇所の判定
		if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
		{
			// 色を変更して、曜日を1つ進める
			nColor[i] = GetColor(0xFF, 0xFF, 0x00);

			// 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる
			nDayState[i] = (nDayState[i] + 1) % ((i == 3) ? 2 : 7); 
		}
		else
		{
			// 今回変更した箇所以外の色を戻す
			nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
		}
	}

	// 文字列の描画
	const char* pszDay1[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
	const char* pszDay2[] = {"当日", "翌日"};
	DrawString( 64,  64, "燃えるゴミ", nColor[0]);
	DrawString( 64, 128, "燃えないゴミ", nColor[1]);
	DrawString( 64, 192, "資源ゴミ", nColor[2]);
	DrawString( 64, 256, "再生日切替", nColor[3]);
	DrawString(448,  64, pszDay1[nDayState[0]], nColor[0]);
	DrawString(448, 128, pszDay1[nDayState[1]], nColor[1]);
	DrawString(448, 192, pszDay1[nDayState[2]], nColor[2]);
	DrawString(448, 256, pszDay2[nDayState[3]], nColor[3]);
	ScreenFlip();
}


閉鎖

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