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

参考

ModelessDlg.cpp
// Unicode
#include <Windows.h>
#include "resource.h"
 
// 関数プロトタイプ宣言
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void CreateSubDlg(HWND hDlg);
void DestroySubDlg(void);
 
INT_PTR CALLBACK SubDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
// 外部変数構造体
static struct {
	HINSTANCE hInstance;
	HWND hSubDlg;
} g;
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
	g.hInstance = hInstance;
	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_COMMAND:
		switch (LOWORD(wParam)) {
		case IDC_SUBDLG:
			CreateSubDlg(hDlg);
			break;
		}
		break;
	case WM_INITDIALOG:
		nRet = TRUE;	// SetFocusでフォーカスを設定した場合はFALSE
		break;
	case WM_CLOSE:
		EndDialog(hDlg, 0);
		break;
	case WM_DESTROY:
		DestroySubDlg();
		break;
	default:
		nRet = FALSE;	// メッセージを処理しなかった
	}
	return nRet;
}
 
//------------------------------------------------------------------------------
void CreateSubDlg(HWND hDlg)
{
	if (g.hSubDlg == NULL) {
		g.hSubDlg = CreateDialog(g.hInstance, MAKEINTRESOURCE(IDD_SUB), hDlg, SubDlgProc);
		ShowWindow(g.hSubDlg, SW_SHOW);
	}
}
 
//------------------------------------------------------------------------------
void DestroySubDlg(void)
{
	if (g.hSubDlg) {
		DestroyWindow(g.hSubDlg);
		g.hSubDlg = NULL;
	}
}
 
//==============================================================================
INT_PTR CALLBACK SubDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	INT_PTR nRet = TRUE;	// メッセージを処理した
 
	switch (uMsg) {
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
			break;
		case IDCANCEL:
			DestroySubDlg();
			break;
		}
		break;
	case WM_INITDIALOG:
		nRet = TRUE;	// SetFocusでフォーカスを設定した場合はFALSE
		break;
	case WM_CLOSE:
		DestroySubDlg();
		break;
	default:
		nRet = FALSE;	// メッセージを処理しなかった
	}
	return nRet;
}
 

resource.h
#define IDD_MAIN	100
#define IDD_SUB		101
 
#define IDC_CHECK1	1000
#define IDC_SUBDLG	1001
 
#define IDC_CHECK2	1002
 

ModelessDlg.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 "MainDlg"
FONT 9, "MS Pゴシック"
BEGIN
	CONTROL		"Check1",IDC_CHECK1,"button",
			BS_AUTOCHECKBOX | WS_TABSTOP,8,8,48,12
	PUSHBUTTON	"SubDlg",IDC_SUBDLG,264,176,48,16
END
 
//------------------------------------------------------------------------------
IDD_SUB DIALOG 100, 100, 320, 200
STYLE WS_POPUPWINDOW
CAPTION "SubDlg"
FONT 9, "MS Pゴシック"
BEGIN
	CONTROL		"Check2",IDC_CHECK2,"button",
			BS_AUTOCHECKBOX | WS_TABSTOP,8,8,48,12
	DEFPUSHBUTTON	"OK",IDOK,212,176,48,16
	PUSHBUTTON	"Cancel",IDCANCEL,264,176,48,16
END
 
最終更新:2012年10月25日 17:08