すいません。回答が不十分でした。
(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>これの事でしょうか?