開発環境 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