開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 プロジェクト |
プロジェクト名 |
ProgBar |
アプリケーションの種類 |
Windows アプリケーション |
追加のオプション |
空のプロジェクト |
文字セット |
Unicode |
WM_TIMER
- タイマーを1減らす
- タイマーが0になったら処理を行う
IDOK
- インターバル秒数の取得
- 開始ボタン無効化
- タイマー発行
IDCANCEL
WM_CLOSE
ProgBar.c
#include <tchar.h>
#include <Windows.h>
#include <CommCtrl.h>
#include "resource.h"
// 関数プロトタイプ宣言
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnInitDialog(HWND hDlg);
void OnOK(HWND hDlg);
void StopTimer(HWND hDlg);
// グローバル変数
HWND g_hProgress;
UINT g_uiIDEvent = 0;
int g_iInterval;
int g_iTimer;
//==============================================================================
int APIENTRY _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_PROGBAR_DIALOG), NULL, DialogProc);
return 0;
}
//------------------------------------------------------------------------------
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
INT_PTR iRetVal = TRUE; // メッセージを処理した
switch (uMsg) {
case WM_TIMER:
// タイマーを1減らす
g_iTimer--;
SendMessage(g_hProgress, PBM_SETPOS, g_iTimer, 0);
if (g_iTimer <= 0) {
// タイマーが0になったら処理を行う
g_iTimer = g_iInterval;
SendMessage(g_hProgress, PBM_SETPOS, g_iTimer, 0);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
OnOK(hDlg);
break;
case IDCANCEL:
// タイマー停止
StopTimer(hDlg);
SendMessage(g_hProgress, PBM_SETPOS, 0, 0);
// 開始ボタン有効化
EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
break;
}
break;
case WM_INITDIALOG:
OnInitDialog(hDlg);
iRetVal = TRUE; // SetFocusでフォーカスを設定した場合はFALSE
break;
case WM_CLOSE:
// タイマー停止
StopTimer(hDlg);
EndDialog(hDlg, IDOK);
break;
default:
iRetVal = FALSE; // メッセージを処理しなかった
}
return iRetVal;
}
//------------------------------------------------------------------------------
void OnInitDialog(HWND hDlg)
{
RECT rcDesktop;
RECT rcDialog;
GetWindowRect(GetDesktopWindow(), &rcDesktop);
GetWindowRect(hDlg, &rcDialog);
SetWindowPos(hDlg, HWND_TOP,
(rcDesktop.right - (rcDialog.right - rcDialog.left)) / 2,
(rcDesktop.bottom - (rcDialog.bottom - rcDialog.top)) / 2,
0, 0, SWP_NOSIZE);
g_hProgress = GetDlgItem(hDlg, IDC_PROGRESS);
}
//------------------------------------------------------------------------------
void OnOK(HWND hDlg)
{
HWND hEditInterval;
TCHAR atcBuf[16];
int iRet;
// インターバル秒数の取得
hEditInterval = GetDlgItem(hDlg, IDC_EDIT_INTERVAL);
iRet = GetWindowText(hEditInterval, atcBuf, _countof(atcBuf));
if (iRet == 0) {
return;
}
g_iInterval = _tstoi(atcBuf);
if (g_iInterval <= 0 || 60 < g_iInterval) {
return;
}
// 開始ボタン無効化
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
// タイマー発行
g_uiIDEvent = SetTimer(hDlg, 1, 1000, NULL);
g_iTimer = g_iInterval;
SendMessage(g_hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, g_iTimer));
SendMessage(g_hProgress, PBM_SETPOS, g_iTimer, 0);
}
//------------------------------------------------------------------------------
// タイマー停止
void StopTimer(HWND hDlg)
{
if (g_uiIDEvent != 0) {
KillTimer(hDlg, g_uiIDEvent);
g_uiIDEvent = 0;
}
}
resource.h
#define IDD_PROGBAR_DIALOG 100
#define IDC_STATIC -1
#define IDC_EDIT_INTERVAL 1000
#define IDC_PROGRESS 1001
ProgBar.rc
// リソース スクリプト
#include <windows.h>
#include "resource.h"
IDD_PROGBAR_DIALOG DIALOGEX 0, 0, 320, 88
STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION "プログレスバーのサンプル"
FONT 9, "MS Pゴシック"
BEGIN
LTEXT "間隔(&I):",IDC_STATIC,12,12,36,12
EDITTEXT IDC_EDIT_INTERVAL,48,12,36,12
LTEXT "秒",IDC_STATIC,96,12,12,12
CONTROL "Progress",IDC_PROGRESS,"msctls_progress32",WS_BORDER,
12,36,296,12
DEFPUSHBUTTON "開始",IDOK,12,60,48,16
PUSHBUTTON "停止",IDCANCEL,72,60,48,16
END
最終更新:2012年09月01日 16:47