ストップウォッチを作りたいのですが全く手も足も出ない状態です。
プログラムの内容としては。。。
1.左クリックをするたびに、カウントを開始したり一時停止する
2.右クリックをするとカウントを初期化する
といったものです。
カウントは秒単位でお願いいたします。
環境はwindows XPでVisual C++ 2008 Express Editionです。
よろしくお願いいたします。
至急!C++でのストップウォッチの作り方
Re: 至急!C++でのストップウォッチの作り方
何に詰まっているのでしょうか。
- GUI関連(Windows.Formsの使い方について。マウスボタンをクリックした場合に何か処理をする方法が分からない、など)
- 時間計測の方法
- その他
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 至急!C++でのストップウォッチの作り方
フォーラムルールに従った質問をしてください。まるべる さんが書きました:ストップウォッチを作りたいのですが全く手も足も出ない状態です。
プログラムの内容としては。。。
1.左クリックをするたびに、カウントを開始したり一時停止する
2.右クリックをするとカウントを初期化する
といったものです。
カウントは秒単位でお願いいたします。
環境はwindows XPでVisual C++ 2008 Express Editionです。
よろしくお願いいたします。
もっと細かい仕様や言語や使用するライブラリも書いてください。
それから、もしこれが課題だとすれば丸投げになります。
この掲示板では丸投げは禁止されています。
Re: 至急!C++でのストップウォッチの作り方
すいません!しっかりと規約を読んでいませんでした。
言語はC++でライブラリというのは良く分かりません…すいません。
仕様ですがwindowを表示し、そこに数字を表示してストップウォッチとしています。
現状ですが、GetTickCount関数(?)を使って0かか1秒ずつカウントしていく状態になっています。
つまずいている点は。。。
1.起動→クリック→開始 ではなく起動時点ですでにカウントが始まってしまっている点。
2.クリックでの停止、開始をする方法が不明な点。
3。右クリックでのカウント初期化の点です。
私は初心者なのでおかしな説明になってしまっていますがこの3点でつまずいています。
ご助言の程よろしくお願いいたします。
言語はC++でライブラリというのは良く分かりません…すいません。
仕様ですがwindowを表示し、そこに数字を表示してストップウォッチとしています。
現状ですが、GetTickCount関数(?)を使って0かか1秒ずつカウントしていく状態になっています。
つまずいている点は。。。
1.起動→クリック→開始 ではなく起動時点ですでにカウントが始まってしまっている点。
2.クリックでの停止、開始をする方法が不明な点。
3。右クリックでのカウント初期化の点です。
私は初心者なのでおかしな説明になってしまっていますがこの3点でつまずいています。
ご助言の程よろしくお願いいたします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 至急!C++でのストップウォッチの作り方
次の問いに全部回答をお願いします。
(1)課題であるかどうかをお答え頂いておりません。
(2)参考にしている書籍やサイトを教えて下さい。
(3)フォーラムルールのテンプレートを使って記載して下さい。
(4)現在出来ているソースコードをコードタグを使って貼り付けてください。
(1)課題であるかどうかをお答え頂いておりません。
(2)参考にしている書籍やサイトを教えて下さい。
(3)フォーラムルールのテンプレートを使って記載して下さい。
(4)現在出来ているソースコードをコードタグを使って貼り付けてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 至急!C++でのストップウォッチの作り方
すいません。回答が不十分でした。
(1)課題です。
(2)先生の作成したPDF資料と口頭なので参考書等はありません。サイトなどは見ていますが、先生の書き方にあわせたいので参考程度にしています。
(3)
[1.1] 自分が今行いたい事は何か
課題でストップウォッチを作成したいです。※カウントは秒単位
形はまずウィンドウを表示し、その中に数字を描画してカウントするといったものです。
1.左クリックをするたびに、カウントを開始したり一時停止する
2.右クリックをするとカウントを初期化する
といった機能をつけなければいけません。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
授業の物を調べながら変えたものなのでかなり見にくいです。申し訳ありません。
[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>これの事でしょうか?
(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.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++でのストップウォッチの作り方
なるほど課題ですか。まるべる さんが書きました: (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変数についてもご存知ですか?
「Linux等々」とありますが、Windows機以外でも動作するように作らないといけないのでしょうか?まるべる さんが書きました: [2] 環境
[2.1] OS : Windows, Linux等々
WindowsXP Professional Version 2002 Servise Pack 3
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++ 2008EE
今回の場合はWindows APIやMicrosoft Windows SDKというライブラリを使っています。まるべる さんが書きました: [3] その他
・ライブラリを使っている場合は何を使っているか
→今調べたので怪しいですが、#include <windows.h>これの事でしょうか?
Re: 至急!C++でのストップウォッチの作り方
提出日は明日のAM9時です。bitter_fox さんが書きました: なるほど課題ですか。
題に「至急!」とありますが提出日が近づいているのでしょうか?
もしそうであれば提出日も教えてください。
すみません殆ど理解していないと思います。まずこのプログラムのウィンドウプロシージャがどのようなことをやっているか分かりますか?
また、左シングルクリックや右シングルクリックがされた時に発生するウィンドウズメッセージは分かりますか?
それから、static変数についてもご存知ですか?
分かっているのはタイマー関数(?)なるものを呼び出しそれをstaet_timeで引いている
そしてそれを描画しているといった理解しかありません。
どの分かどの分に対応しているか、などは殆ど理解していません。申し訳ないです。
クリックに関しては全く知識かありません。。。
いえ、その分は他の方のテンプレのようなものの文面です。「Linux等々」とありますが、Windows機以外でも動作するように作らないといけないのでしょうか?
私の課題はWindowsで動けば問題ありません。
そうなのですか。ライブラリとはどんな物をさすのかすら分かっていませんでして。。。今回の場合はWindows APIやMicrosoft Windows SDKというライブラリを使っています。
情けない限りです。勉強になりました。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 至急!C++でのストップウォッチの作り方
あんまり時間が無いですね・・・まるべる さんが書きました: 提出日は明日の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: その他
標準の処理を行う
まず一つ目の問題、起動時点ですでにカウントが始まってしまうのはWM_CREATEの処理に依ります。まるべる さんが書きました: 1.起動→クリック→開始 ではなく起動時点ですでにカウントが始まってしまっている点。
2.クリックでの停止、開始をする方法が不明な点。
3。右クリックでのカウント初期化の点です。
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++でのストップウォッチの作り方
とても丁寧で的確なアドバイスありがとうございます。
やっと何とか形になりました。
実行したところ課題通りの動きをしているようです。
一応ですが変更したウィンドウプロシージャを記載します。
厚かましいのですが宜しければ確認して頂けると嬉しいです。
タイマーの表示を"現在時刻-開始時刻"ではなく1秒経過ごとにローカル変数に1加算する事で表示しています。
またif文で偶数の時はWM_TIMERでカウントをし、奇数の場合はカウントぜず現在のローカル変数を表示しています。
この2つを変更したのですがあってますでしょうか?
また、このソースコードの場合、start_timeとnow_timeは必要ないと思うのですがどうでしょうか?
次は早く取り組む様にしたいと思います。
やっと何とか形になりました。
実行したところ課題通りの動きをしているようです。
一応ですが変更したウィンドウプロシージャを記載します。
厚かましいのですが宜しければ確認して頂けると嬉しいです。
//ウィンドウプロシージャ
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;
}
またif文で偶数の時はWM_TIMERでカウントをし、奇数の場合はカウントぜず現在のローカル変数を表示しています。
この2つを変更したのですがあってますでしょうか?
また、このソースコードの場合、start_timeとnow_timeは必要ないと思うのですがどうでしょうか?
全くその通りです。。。bitter_fox さんが書きました: あんまり時間が無いですね・・・
もしまた課題で困り次質問するときは余裕を持って質問してくださいね。
次は早く取り組む様にしたいと思います。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 至急!C++でのストップウォッチの作り方
お疲れ様です。まるべる さんが書きました:とても丁寧で的確なアドバイスありがとうございます。
やっと何とか形になりました。
実行したところ課題通りの動きをしているようです。
かなり良いですね。まるべる さんが書きました: 一応ですが変更したウィンドウプロシージャを記載します。
厚かましいのですが宜しければ確認して頂けると嬉しいです。
この2つを変更したのですがあってますでしょうか?
また、このソースコードの場合、start_timeとnow_timeは必要ないと思うのですがどうでしょうか?
start_timeやnow_timeはもう必要ないのでそれ関連はバッサリ削除してしまって問題ないでしょう。
他にも残骸が幾つかあったり、コメントとの不一致があるので削除・修正しておくとよいでしょう。