今回は、プロパティシートに適用ボタンを付け、テキストボックスに入力すると、適用ボタンを押せるようにします。
適用ボタンを押すと、テキストボックスの内容を保存するようにします。
プロパティシート1 - インコのWindowsSDK で作成したソースを修正します。
流れ
1.PROPSHEETHEADER構造体のdwFlagsメンバを、PSH_NOAPPLYNOW(「適用」ボタンを削除)から、PSH_DEFAULT(デフォルト)にして「適用」ボタンを有効にします。
プロパティシートのコールバック関数
1.プロパティシートにあるテキストバックにアクションがあり、 エディットコントロールの内容を変更されたときに、wParamの上位16ビットにEN_CHANGE通知コードが発生します。
2、「適用」ボタンは、プロパティシートに変更が加えられない限り、上の図のように無効になっています。
EN_CHANGEメッセージが発生したとき、PropSheet_Changed()で、プロパティシートに変更が加えられたことを通知します。
これにより、「適用」ボタンを押すことができるようになります。
BOOL PropSheet_Changed( HWND hPropSheetDlg, // プロパティシートのハンドル HWND hwndPage // 変更されたページのハンドル );
ユーザーが「OK」ボタンや「適用」ボタンを押すと、ダイアログプロシージャにWM_NOTIFYメッセージが送信されます。 この通知コードは PSN_APPLYになります。
ソースコードの入力
ソースコードは下記のように入れてください。
#include <windows.h> #include <commctrl.h> #include "resource.h" #pragma comment(lib, "comctl32.lib") // グローバル変数: TCHAR szBuf_edit1[64], szBuf_edit2[64]; // このコード モジュールに含まれる関数の宣言を転送します: BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc1(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogProc2(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { UINT wmId; PROPSHEETPAGE psp; PROPSHEETHEADER psh; HPROPSHEETPAGE hPsp[2]; switch (msg) { case WM_INITDIALOG: InitCommonControls(); break; case WM_CLOSE: EndDialog(hWnd, IDOK); break; case WM_COMMAND: wmId = LOWORD(wParam); switch (wmId) { case IDM_EXIT: EndDialog(hWnd, IDOK); break; case IDM_PROP: psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwFlags = PSP_DEFAULT | PSP_USEICONID; psp.pszIcon = TEXT("IDI_TEST"); psp.hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); psp.pszTemplate = TEXT("DIALOG1"); psp.pfnDlgProc = (DLGPROC)DialogProc1; hPsp[0] = CreatePropertySheetPage(&psp); psp.pszTemplate = TEXT("DIALOG2"); psp.pfnDlgProc = (DLGPROC)DialogProc2; hPsp[1] = CreatePropertySheetPage(&psp); psh.dwSize = sizeof (PROPSHEETHEADER); psh.dwFlags = PSH_DEFAULT | PSH_USEHICON; psh.hwndParent = hWnd; psh.hIcon = LoadIcon(NULL, IDI_ASTERISK); psh.pszCaption = TEXT("設定"); psh.nPages = 2; psh.phpage = hPsp; PropertySheet(&psh); break; default: break; } default: break; } return FALSE; } BOOL CALLBACK DialogProc1(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { NMHDR *nmhdr; switch(msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT1: if (HIWORD(wParam) == EN_CHANGE) { PropSheet_Changed(GetParent(hWnd), hWnd); } break; } break; case WM_INITDIALOG: SetWindowText(GetDlgItem(hWnd, IDC_EDIT1), szBuf_edit1); break; case WM_NOTIFY: nmhdr = (NMHDR *)lParam; switch(nmhdr->code) { case PSN_APPLY: GetWindowText(GetDlgItem(hWnd, IDC_EDIT1), szBuf_edit1, sizeof(szBuf_edit1)); break; default: break; } break; } return FALSE; } BOOL CALLBACK DialogProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { NMHDR *nmhdr; switch(msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_EDIT2: if (HIWORD(wParam) == EN_CHANGE) { PropSheet_Changed(GetParent(hWnd), hWnd); } break; } break; case WM_INITDIALOG: SetWindowText(GetDlgItem(hWnd, IDC_EDIT2), szBuf_edit2); break; case WM_NOTIFY: nmhdr = (NMHDR *)lParam; switch(nmhdr->code) { case PSN_APPLY: GetWindowText(GetDlgItem(hWnd, IDC_EDIT2), szBuf_edit2, sizeof(szBuf_edit2)); break; default: break; } break; } return FALSE; }
#define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDM_PROP 106 #define IDC_HP 109 #define IDC_EDIT1 1001 #define IDC_EDIT2 1002 #ifndef IDC_STATIC #define IDC_STATIC -1 #endif
Reseditで作成した場合は、これとは異なるソースコードになります。
#include <windows.h> #include "resource.h" ///////////////////////////////////////////////////////////////////////////// // // アイコン // IDI_TEST ICON "test.ico" ///////////////////////////////////////////////////////////////////////////// // // メニュー // IDC_HP MENU BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "アプリケーションの終了(&X)", IDM_EXIT MENUITEM "プロパティ(&P)", IDM_PROP END POPUP "ヘルプ(&H)" BEGIN MENUITEM "バージョン情報(&A)...", IDM_ABOUT END END ///////////////////////////////////////////////////////////////////////////// // // ダイアログ // DIALOG_BOX DIALOG 0, 0, 170, 62 FONT 9, "MS UI Gothic" CAPTION "ダイアログ" MENU IDC_HP BEGIN LTEXT "Copyright (C) 2008",IDC_STATIC,42,26,114,8 END DIALOG1 DIALOG 0, 0, 170, 62 FONT 9, "MS UI Gothic" CAPTION "設定1" BEGIN EDITTEXT IDC_EDIT1, 2, 2, 166, 13, ES_AUTOHSCROLL END DIALOG2 DIALOG 0, 0, 170, 62 FONT 9, "MS UI Gothic" CAPTION "設定2" BEGIN EDITTEXT IDC_EDIT2, 2, 2, 166, 13, ES_AUTOHSCROLL END
Reseditで作成した場合は、これとは異なるソースコードになります。