開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 Compute
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

Sleepの引数を1から100にするとかなり反応が悪くなる。
Sleepの次のifをwhileに変更するとレスポンスが改善する。
//
		Sleep(100);
		while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
 

Compute.c
#include <Windows.h>
#include <CommCtrl.h>
#include "resource.h"
 
// 関数プロトタイプ宣言
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnStart(HWND hDlg);
 
// 外部変数
int g_nTimer;
int g_nCount = 0;
enum { nMaxCount = 1000 };
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc);
	return 0;
}
 
//------------------------------------------------------------------------------
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	INT_PTR nRet = TRUE;
 
	switch (uMsg) {
	case WM_TIMER:
		{
			HWND hWnd = GetDlgItem(hDlg, IDC_PROGRESS);
			SendMessage(hWnd, PBM_SETPOS, g_nCount * 100 / nMaxCount, 0);
		}
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDC_START:
			OnStart(hDlg);
			break;
		case IDCANCEL:
			if (g_nCount == 0) {
				EndDialog(hDlg, IDCANCEL);
			} else {
				g_nCount = nMaxCount;
			}
			break;
		}
		break;
	case WM_CLOSE:
		EndDialog(hDlg, 0);
		break;
	default:
		nRet = FALSE;
	}
	return nRet;
}
 
//------------------------------------------------------------------------------
void OnStart(HWND hDlg)
{
	MSG message;
 
	g_nTimer = SetTimer(hDlg, 1, 100, NULL);	// 100ms
	EnableWindow(GetDlgItem(hDlg, IDC_START), FALSE);
	for (g_nCount = 0; g_nCount < nMaxCount; g_nCount++) {
		Sleep(1);
		if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&message);
			DispatchMessage(&message);
		}
	}
	EndDialog(hDlg, IDOK);
}
 

resource.h
#define IDD_MAIN	100
#define IDC_START	1000
#define IDC_PROGRESS	1001
 

Compute.rc
// resource script
#include <windows.h>
#include "resource.h"
 
IDD_MAIN DIALOGEX 100, 100, 320, 200
STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION "Compute"
FONT 9, "MS Pゴシック"
BEGIN
	DEFPUSHBUTTON	"Start",IDC_START,260,7,50,14
	PUSHBUTTON	"Cancel",IDCANCEL,260,23,50,14
	CONTROL		"",IDC_PROGRESS,"msctls_progress32",
			WS_BORDER,40,120,240,14
END
 
最終更新:2012年10月14日 19:45