至急!C++でのストップウォッチの作り方

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

至急!C++でのストップウォッチの作り方

#1

投稿記事 by まるべる » 12年前

ストップウォッチを作りたいのですが全く手も足も出ない状態です。
プログラムの内容としては。。。

1.左クリックをするたびに、カウントを開始したり一時停止する
2.右クリックをするとカウントを初期化する

といったものです。
カウントは秒単位でお願いいたします。
環境はwindows XPでVisual C++ 2008 Express Editionです。
よろしくお願いいたします。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 至急!C++でのストップウォッチの作り方

#2

投稿記事 by beatle » 12年前

何に詰まっているのでしょうか。
  • GUI関連(Windows.Formsの使い方について。マウスボタンをクリックした場合に何か処理をする方法が分からない、など)
  • 時間計測の方法
  • その他

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 至急!C++でのストップウォッチの作り方

#3

投稿記事 by bitter_fox » 12年前

まるべる さんが書きました:ストップウォッチを作りたいのですが全く手も足も出ない状態です。
プログラムの内容としては。。。

1.左クリックをするたびに、カウントを開始したり一時停止する
2.右クリックをするとカウントを初期化する

といったものです。
カウントは秒単位でお願いいたします。
環境はwindows XPでVisual C++ 2008 Express Editionです。
よろしくお願いいたします。
フォーラムルールに従った質問をしてください。

もっと細かい仕様や言語や使用するライブラリも書いてください。

それから、もしこれが課題だとすれば丸投げになります。
この掲示板では丸投げは禁止されています。

まるべる

Re: 至急!C++でのストップウォッチの作り方

#4

投稿記事 by まるべる » 12年前

すいません!しっかりと規約を読んでいませんでした。
言語はC++でライブラリというのは良く分かりません…すいません。

仕様ですがwindowを表示し、そこに数字を表示してストップウォッチとしています。
現状ですが、GetTickCount関数(?)を使って0かか1秒ずつカウントしていく状態になっています。
つまずいている点は。。。

1.起動→クリック→開始 ではなく起動時点ですでにカウントが始まってしまっている点。
2.クリックでの停止、開始をする方法が不明な点。
3。右クリックでのカウント初期化の点です。

私は初心者なのでおかしな説明になってしまっていますがこの3点でつまずいています。
ご助言の程よろしくお願いいたします。

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

Re: 至急!C++でのストップウォッチの作り方

#5

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

次の問いに全部回答をお願いします。
(1)課題であるかどうかをお答え頂いておりません。
(2)参考にしている書籍やサイトを教えて下さい。
(3)フォーラムルールのテンプレートを使って記載して下さい。
(4)現在出来ているソースコードをコードタグを使って貼り付けてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まるべる

Re: 至急!C++でのストップウォッチの作り方

#6

投稿記事 by まるべる » 12年前

すいません。回答が不十分でした。

(1)課題です。
(2)先生の作成したPDF資料と口頭なので参考書等はありません。サイトなどは見ていますが、先生の書き方にあわせたいので参考程度にしています。
(3)
[1.1] 自分が今行いたい事は何か
 課題でストップウォッチを作成したいです。※カウントは秒単位
 形はまずウィンドウを表示し、その中に数字を描画してカウントするといったものです。

 1.左クリックをするたびに、カウントを開始したり一時停止する
 2.右クリックをするとカウントを初期化する

 といった機能をつけなければいけません。

[1.2] どのように取り組んだか(プログラムコードがある場合記載)
授業の物を調べながら変えたものなのでかなり見にくいです。申し訳ありません。

コード:


//ex4.cpp
//タイマーを使用し、デジタル時計を表示するプログラム

#include <windows.h>
#define ID_MYTIMER 100 //タイマーID

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
HFONT MyCreateFont(int, DWORD, LPCTSTR);

TCHAR szClassName[] = TEXT("ex4");	//ウィンドウクラス


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
				   LPSTR lpsCmdLine, int nCmdShow)
{
	MSG msg;
	BOOL bRet;
	
	if (!InitApp(hCurInst))
		return FALSE;
	if (!InitInstance(hCurInst, nCmdShow)) 
		return FALSE;
	while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRet == -1) {
			break;
		} else {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}

//ウィンドウ・クラスの登録

ATOM InitApp(HINSTANCE hInst)
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
	wc.lpfnWndProc = WndProc;	//プロシージャ名
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;//インスタンス
	wc.hIcon = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hCursor = (HCURSOR)LoadImage(NULL,
		MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;	//メニュー名
	wc.lpszClassName = szClassName;
	wc.hIconSm = (HICON)LoadImage(NULL,
		MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON,
		0,
		0,
		LR_DEFAULTSIZE | LR_SHARED);

	return (RegisterClassEx(&wc));
}

//ウィンドウの生成

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
	HWND hWnd;

	hWnd = CreateWindow(szClassName,
			TEXT(""),
			WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, //ウィンドウの種類
			CW_USEDEFAULT,	//X座標
			CW_USEDEFAULT,	//Y座標
			148, //幅
			82,	//高さ
			NULL, //親ウィンドウのハンドル、親を作るときはNULL
			NULL, //メニューハンドル、クラスメニューを使うときはNULL
			hInst, //インスタンスハンドル
			NULL);
	if (!hWnd)
		return FALSE;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

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

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id;
	HDC hdc;
	PAINTSTRUCT ps;
	static TCHAR szTime[64], szDate[64];
	SYSTEMTIME st;
	HFONT hFont1, hFont2;

	int now_time;
	static int start_time;

	switch (msg) {
		case WM_CREATE:
			SetTimer(hWnd, ID_MYTIMER, 500, NULL);//タイマ作成。タイマ割込みは500ミリ秒ごとに実行される
			start_time = (int)(GetTickCount() / 1000 + 0.5);
			break;
		case WM_TIMER:
			//関係ないタイマーイベントはDefWindowProcに任せる
			if (wp != ID_MYTIMER)
				return (DefWindowProc(hWnd, msg, wp, lp));
			//GetLocalTime(&st);//現在時刻を取得
			//現在の日時を文字列に格納

			//wsprintf(szTime, TEXT("%02d:%02d:%02d"), st.wHour, st.wMinute, st.wSecond);
			//wsprintf(szDate, TEXT("%d年%02d月%02d日"), st.wYear, st.wMonth, st.wDay);

			now_time = (int)(GetTickCount() / 1000 + 0.5);
			now_time = now_time-start_time;
		
			wsprintf(szTime, TEXT("%02d"),now_time);

			//クライアント領域全体を更新
			InvalidateRect(hWnd, NULL, TRUE);
			SetWindowText(hWnd, szTime);//ウィンドウタイトルに文字列を表示
			break;
		case WM_LBUTTONDBLCLK://左ボタンをダブルクリックすると、WM_CLOSEメッセージが発生(そちらの処理へ飛ぶ)
			SendMessage(hWnd, WM_CLOSE, 0, 0);
			break;
		case WM_PAINT:
			//タイマで格納した日時の文字列を描画する
			hdc = BeginPaint(hWnd, &ps);//描画開始
			hFont1 = MyCreateFont(12, SHIFTJIS_CHARSET, TEXT("MS ゴシック"));//フォントの作成(指定)
			SelectObject(hdc, hFont1);//フォントの選択
			TextOut(hdc, 5, 5, szDate, lstrlen(szDate));//文字列表示
			hFont2 = MyCreateFont(30, ANSI_CHARSET, TEXT("MS ゴシック"));
			SelectObject(hdc, hFont2);
			SetTextColor(hdc, RGB(0, 0, 255));
			TextOut(hdc, 10, 20, szTime, lstrlen(szTime));
			DeleteObject(hFont1);
			DeleteObject(hFont2);
			EndPaint(hWnd, &ps);
			break;
		case WM_CLOSE:
			id = MessageBox(hWnd,
				TEXT("終了してもよろしいですか"),
				TEXT("確認"),
				MB_YESNO | MB_ICONQUESTION);
			if (id == IDYES) {
				//if (KillTimer(hWnd, ID_MYTIMER) == 0) {
					//MessageBox(hWnd, 
						//TEXT("KillTimer Error!"), 
						//TEXT("Error"), 
						//MB_OK | MB_ICONEXCLAMATION);
				//}
				DestroyWindow(hWnd);
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName)
{
	return(	CreateFont(nHeight, 0, 0, 0,
				FW_DONTCARE,
				FALSE, FALSE, FALSE,
				dwCharSet,
				OUT_DEFAULT_PRECIS,
				CLIP_DEFAULT_PRECIS,
				DEFAULT_QUALITY,
				DEFAULT_PITCH | FF_DONTCARE,
				lpName));
}

[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
エラーは現状ありません。
[1.4] 今何がわからないのか、知りたいのか
 1.起動→クリック→開始 ではなく起動時点ですでにカウントが始まってしまっている点。
 2.クリックでの停止、開始をする方法が不明な点。
 3。右クリックでのカウント初期化の点です。
 
 の3点です。
 

[2] 環境  
 [2.1] OS : Windows, Linux等々
 WindowsXP Professional Version 2002 Servise Pack 3
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++ 2008EE

[3] その他
 ・どの程度C言語を理解しているか
→ほとんど初心者です。基礎を学んでいるところです。
 ・ライブラリを使っている場合は何を使っているか
→今調べたので怪しいですが、#include <windows.h>これの事でしょうか?

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 至急!C++でのストップウォッチの作り方

#7

投稿記事 by bitter_fox » 12年前

まるべる さんが書きました: (1)課題です。
なるほど課題ですか。
題に「至急!」とありますが提出日が近づいているのでしょうか?
もしそうであれば提出日も教えてください。
まるべる さんが書きました: (3)
[1.1] 自分が今行いたい事は何か
 課題でストップウォッチを作成したいです。※カウントは秒単位
 形はまずウィンドウを表示し、その中に数字を描画してカウントするといったものです。

 1.左クリックをするたびに、カウントを開始したり一時停止する
 2.右クリックをするとカウントを初期化する

 といった機能をつけなければいけません。

コード:


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

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id;
	HDC hdc;
	PAINTSTRUCT ps;
	static TCHAR szTime[64], szDate[64];
	SYSTEMTIME st;
	HFONT hFont1, hFont2;

	int now_time;
	static int start_time;

	switch (msg) {
		case WM_CREATE:
			SetTimer(hWnd, ID_MYTIMER, 500, NULL);//タイマ作成。タイマ割込みは500ミリ秒ごとに実行される
			start_time = (int)(GetTickCount() / 1000 + 0.5);
			break;
		case WM_TIMER:
			//関係ないタイマーイベントはDefWindowProcに任せる
			if (wp != ID_MYTIMER)
				return (DefWindowProc(hWnd, msg, wp, lp));
			//GetLocalTime(&st);//現在時刻を取得
			//現在の日時を文字列に格納

			//wsprintf(szTime, TEXT("%02d:%02d:%02d"), st.wHour, st.wMinute, st.wSecond);
			//wsprintf(szDate, TEXT("%d年%02d月%02d日"), st.wYear, st.wMonth, st.wDay);

			now_time = (int)(GetTickCount() / 1000 + 0.5);
			now_time = now_time-start_time;
		
			wsprintf(szTime, TEXT("%02d"),now_time);

			//クライアント領域全体を更新
			InvalidateRect(hWnd, NULL, TRUE);
			SetWindowText(hWnd, szTime);//ウィンドウタイトルに文字列を表示
			break;
		case WM_LBUTTONDBLCLK://左ボタンをダブルクリックすると、WM_CLOSEメッセージが発生(そちらの処理へ飛ぶ)
			SendMessage(hWnd, WM_CLOSE, 0, 0);
			break;
		case WM_PAINT:
			//タイマで格納した日時の文字列を描画する
			hdc = BeginPaint(hWnd, &ps);//描画開始
			hFont1 = MyCreateFont(12, SHIFTJIS_CHARSET, TEXT("MS ゴシック"));//フォントの作成(指定)
			SelectObject(hdc, hFont1);//フォントの選択
			TextOut(hdc, 5, 5, szDate, lstrlen(szDate));//文字列表示
			hFont2 = MyCreateFont(30, ANSI_CHARSET, TEXT("MS ゴシック"));
			SelectObject(hdc, hFont2);
			SetTextColor(hdc, RGB(0, 0, 255));
			TextOut(hdc, 10, 20, szTime, lstrlen(szTime));
			DeleteObject(hFont1);
			DeleteObject(hFont2);
			EndPaint(hWnd, &ps);
			break;
		case WM_CLOSE:
			id = MessageBox(hWnd,
				TEXT("終了してもよろしいですか"),
				TEXT("確認"),
				MB_YESNO | MB_ICONQUESTION);
			if (id == IDYES) {
				//if (KillTimer(hWnd, ID_MYTIMER) == 0) {
					//MessageBox(hWnd, 
						//TEXT("KillTimer Error!"), 
						//TEXT("Error"), 
						//MB_OK | MB_ICONEXCLAMATION);
				//}
				DestroyWindow(hWnd);
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

まずこのプログラムのウィンドウプロシージャがどのようなことをやっているか分かりますか?

また、左シングルクリックや右シングルクリックがされた時に発生するウィンドウズメッセージは分かりますか?
それから、static変数についてもご存知ですか? 
まるべる さんが書きました: [2] 環境  
 [2.1] OS : Windows, Linux等々
 WindowsXP Professional Version 2002 Servise Pack 3
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++ 2008EE
「Linux等々」とありますが、Windows機以外でも動作するように作らないといけないのでしょうか?
まるべる さんが書きました: [3] その他
 ・ライブラリを使っている場合は何を使っているか
→今調べたので怪しいですが、#include <windows.h>これの事でしょうか?
今回の場合はWindows APIやMicrosoft Windows SDKというライブラリを使っています。

まるべる

Re: 至急!C++でのストップウォッチの作り方

#8

投稿記事 by まるべる » 12年前

bitter_fox さんが書きました: なるほど課題ですか。
題に「至急!」とありますが提出日が近づいているのでしょうか?
もしそうであれば提出日も教えてください。
提出日は明日のAM9時です。
まずこのプログラムのウィンドウプロシージャがどのようなことをやっているか分かりますか?

また、左シングルクリックや右シングルクリックがされた時に発生するウィンドウズメッセージは分かりますか?
それから、static変数についてもご存知ですか? 
すみません殆ど理解していないと思います。
分かっているのはタイマー関数(?)なるものを呼び出しそれをstaet_timeで引いている
そしてそれを描画しているといった理解しかありません。
どの分かどの分に対応しているか、などは殆ど理解していません。申し訳ないです。
クリックに関しては全く知識かありません。。。
「Linux等々」とありますが、Windows機以外でも動作するように作らないといけないのでしょうか?
いえ、その分は他の方のテンプレのようなものの文面です。
私の課題はWindowsで動けば問題ありません。
今回の場合はWindows APIやMicrosoft Windows SDKというライブラリを使っています。
そうなのですか。ライブラリとはどんな物をさすのかすら分かっていませんでして。。。
情けない限りです。勉強になりました。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 至急!C++でのストップウォッチの作り方

#9

投稿記事 by bitter_fox » 12年前

まるべる さんが書きました: 提出日は明日のAM9時です。
あんまり時間が無いですね・・・
もしまた課題で困り次質問するときは余裕を持って質問してくださいね。
まるべる さんが書きました: すみません殆ど理解していないと思います。
分かっているのはタイマー関数(?)なるものを呼び出しそれをstaet_timeで引いている
そしてそれを描画しているといった理解しかありません。
どの分かどの分に対応しているか、などは殆ど理解していません。申し訳ないです。
クリックに関しては全く知識かありません。。。
そうですか。
まず、ウィンドウズプロシージャの簡単な説明をしておきますと、ウィンドウ関連で何らかの変化があった時に第二引数msgにその変化に対応するWM_等で始まるメッセージ定数が代入されて呼び出されます。
例えば、ウィンドウが作成された際はWM_CREATEというメッセージが発生します。
この様な仕組みをイベントドリブン、イベント駆動と呼ばれます。

これに基づいてウィンドウズプロシージャを読み解くと

コード:

WM_CREATE:  ウィンドウが作成された際
	このウィンドウにID_MYTIMERという識別子を持つタイマーを設定する。(0.5秒間隔)
	ウィンドウが作成された時の時刻を保存。

WM_TIMER: タイマーの指定された間隔が満たされた時
	ID_MYTIMERでないときは標準定義の動作
	ID_MYTIMERの時は今の時刻とstart_timeの差を求めて
	再描画を行う(WM_PAINTが発生するようにする)(この時の差はszTimeに文字列として書かれる)
	ウィンドウのタイトルをszTimeに設定

WM_LBUTTONDBLCLK: ウィンドウ領域内で左ボタンがダブルクリックされた時
	WM_CLOSEを自ウィンドウに送る(WM_CLOSEは右上の×印が押された時などウィンドウが閉じられるときにも発生する)

WM_PAINT: ウィンドウ領域が再描画されるとき
	szTimeを表示

WM_CLOSE: ウィンドウが閉じられるとき
	終了するかを確認して「はい」なら自ウィンドウを破棄する(WM_DESTROYが発生する)

WM_DESTROY: ウィンドウが破棄されるとき
	正常終了する

default: その他
	標準の処理を行う
この様な流れになります。
まるべる さんが書きました:  1.起動→クリック→開始 ではなく起動時点ですでにカウントが始まってしまっている点。
 2.クリックでの停止、開始をする方法が不明な点。
 3。右クリックでのカウント初期化の点です。
まず一つ目の問題、起動時点ですでにカウントが始まってしまうのはWM_CREATEの処理に依ります。
WM_CREATEでタイマーをスタートさせて、start_time(開始時刻)を保存しているのでウィンドウが作成された時、つまり起動時点でカウントが始まってしまいます。
左クリックされた時にスタートさせたいので、この時の処理は左クリックがされた時に行いましょう。
左クリックがされた時に発生するメッセージは、WM_LBUTTONDOWN(左ボタンが押された時)、WM_LBUTTONUP(左ボタンがあげられた時)です。

次に停止、開始の問題ですが、これは一時停止しているかを管理する変数を作りWM_TIMERを処理するときにその変数によって処理を行うかを分けます。
また、開始時の時刻と今の時刻の差で何秒経過したかを求めていますが、一時停止に対応するとなるとこの手は使えません。
何秒経過したかを管理する変数を用意して、WM_TIMERでインクリメントさせましょう。
タイマーの間隔も0.5秒から1秒にする必要があります。

三番目の問題は上二つが出来れば簡単です。
右クリックされた時に、時間を管理する変数に0を代入すれば初期化できます。
右クリックされた時に発生するメッセージは、左クリックの時と同様二つあり、WM_RBUTTONDOWN(左ボタンが押された時)、WM_RBUTTONUP(左ボタンがあげられた時)です。

この処理を作るにはstaticなローカル変数をうまく使う必要があります。
http://www.kiso.tsukuba.ac.jp/~makimura ... ode68.html
http://www.geocities.jp/ky_webid/c/022.html - 静的ローカル変数
http://www1.cts.ne.jp/~clab/hsample/Primary/Io7.html
まるべる さんが書きました: いえ、その分は他の方のテンプレのようなものの文面です。
私の課題はWindowsで動けば問題ありません。
失礼しました、テンプレと混合してしまいました。

まるべる

Re: 至急!C++でのストップウォッチの作り方

#10

投稿記事 by まるべる » 12年前

とても丁寧で的確なアドバイスありがとうございます。
やっと何とか形になりました。
実行したところ課題通りの動きをしているようです。

一応ですが変更したウィンドウプロシージャを記載します。
厚かましいのですが宜しければ確認して頂けると嬉しいです。

コード:

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

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int id;
	HDC hdc;
	PAINTSTRUCT ps;
	static TCHAR szTime[64], szDate[64];
	SYSTEMTIME st;
	HFONT hFont1, hFont2;

	int now_time;
	static int start_time,time=0,stop=1;

	switch (msg) {
		case WM_LBUTTONDOWN:
			SetTimer(hWnd, ID_MYTIMER, 1000, NULL);//タイマ作成。タイマ割込みは500ミリ秒ごとに実行される
			start_time = (int)(GetTickCount() / 1000 + 0.5);
			stop=stop++;
			break;
		case WM_TIMER:
			//関係ないタイマーイベントはDefWindowProcに任せる
			if (wp != ID_MYTIMER)
				return (DefWindowProc(hWnd, msg, wp, lp));
			//GetLocalTime(&st);//現在時刻を取得
			//現在の日時を文字列に格納

			//wsprintf(szTime, TEXT("%02d:%02d:%02d"), st.wHour, st.wMinute, st.wSecond);
			//wsprintf(szDate, TEXT("%d年%02d月%02d日"), st.wYear, st.wMonth, st.wDay);

			now_time = (int)(GetTickCount() / 1000 + 0.5);

			if(stop % 2 == 0)
			{
				time=time++;
				wsprintf(szTime, TEXT("%02d"),time);
			}
			else
			{
				wsprintf(szTime, TEXT("%02d"),time);
			}

			//クライアント領域全体を更新
			InvalidateRect(hWnd, NULL, TRUE);
			SetWindowText(hWnd, szTime);//ウィンドウタイトルに文字列を表示
			break;
		case WM_RBUTTONDOWN:
			time=0;
			break;
		//case WM_LBUTTONDBLCLK://左ボタンをダブルクリックすると、WM_CLOSEメッセージが発生(そちらの処理へ飛ぶ)
			SendMessage(hWnd, WM_CLOSE, 0, 0);
			break;
		case WM_PAINT:
			//タイマで格納した日時の文字列を描画する
			hdc = BeginPaint(hWnd, &ps);//描画開始
			hFont1 = MyCreateFont(12, SHIFTJIS_CHARSET, TEXT("MS ゴシック"));//フォントの作成(指定)
			SelectObject(hdc, hFont1);//フォントの選択
			TextOut(hdc, 5, 5, szDate, lstrlen(szDate));//文字列表示
			hFont2 = MyCreateFont(30, ANSI_CHARSET, TEXT("MS ゴシック"));
			SelectObject(hdc, hFont2);
			SetTextColor(hdc, RGB(0, 0, 255));
			TextOut(hdc, 10, 20, szTime, lstrlen(szTime));
			DeleteObject(hFont1);
			DeleteObject(hFont2);
			EndPaint(hWnd, &ps);
			break;
		case WM_CLOSE:
			id = MessageBox(hWnd,
				TEXT("終了してもよろしいですか"),
				TEXT("確認"),
				MB_YESNO | MB_ICONQUESTION);
			if (id == IDYES) {
				//if (KillTimer(hWnd, ID_MYTIMER) == 0) {
					//MessageBox(hWnd, 
						//TEXT("KillTimer Error!"), 
						//TEXT("Error"), 
						//MB_OK | MB_ICONEXCLAMATION);
				//}
				DestroyWindow(hWnd);
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}
タイマーの表示を"現在時刻-開始時刻"ではなく1秒経過ごとにローカル変数に1加算する事で表示しています。
またif文で偶数の時はWM_TIMERでカウントをし、奇数の場合はカウントぜず現在のローカル変数を表示しています。
この2つを変更したのですがあってますでしょうか?
また、このソースコードの場合、start_timeとnow_timeは必要ないと思うのですがどうでしょうか?
bitter_fox さんが書きました: あんまり時間が無いですね・・・
もしまた課題で困り次質問するときは余裕を持って質問してくださいね。
全くその通りです。。。
次は早く取り組む様にしたいと思います。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 至急!C++でのストップウォッチの作り方

#11

投稿記事 by bitter_fox » 12年前

まるべる さんが書きました:とても丁寧で的確なアドバイスありがとうございます。
やっと何とか形になりました。
実行したところ課題通りの動きをしているようです。
お疲れ様です。

まるべる さんが書きました: 一応ですが変更したウィンドウプロシージャを記載します。
厚かましいのですが宜しければ確認して頂けると嬉しいです。

この2つを変更したのですがあってますでしょうか?
また、このソースコードの場合、start_timeとnow_timeは必要ないと思うのですがどうでしょうか?
かなり良いですね。

start_timeやnow_timeはもう必要ないのでそれ関連はバッサリ削除してしまって問題ないでしょう。
他にも残骸が幾つかあったり、コメントとの不一致があるので削除・修正しておくとよいでしょう。

閉鎖

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