至急回答お願いします!タイマーについて

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

至急回答お願いします!タイマーについて

#1

投稿記事 by falcom » 13年前

下にあるソースを参考に

起動後に20秒間カウントし、カウントが終了したら
ウィンドウへ「終了」と表示するプログラム

を作らなければいけないのですが、全くわかりません
どなたか助けていただけないしょうか?

//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,now_time;
HDC hdc;
PAINTSTRUCT ps;
static TCHAR szTime[64], szDate[64];
HFONT hFont1, hFont2;

switch (msg) {
case WM_CREATE:
SetTimer(hWnd, ID_MYTIMER, 100, NULL);//タイマ作成。タイマ割込みは500ミリ秒ごとに実行される
break;
case WM_TIMER:
//関係ないタイマーイベントはDefWindowProcに任せる
if (wp != ID_MYTIMER)
return (DefWindowProc(hWnd, msg, wp, lp));
now_time = (int)(GetTickCount() / 1000 + 0.5);
wsprintf(szTime, TEXT("%02d"), now_time);
//クライアント領域全体を更新
InvalidateRect(hWnd, NULL, TRUE);
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));
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 至急回答お願いします!タイマーについて

#2

投稿記事 by みけCAT » 13年前

まずコードはcodeタグで囲みましょう。

起動時に現在のWindows起動からの経過時間をGetTickCountで取得し、
描画時にソフトの起動から20秒以上経っていたら「終了」を描画、
そうでなければ(20-(現在のGetTickCount-ソフト起動時のGetTickCount)/1000)を描画すればいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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