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