プロパティシートを使う
プロパティシートを使います
最終更新:2017/11/18
初版:2017/11/17
プロパティシートとは、項目の設定などで使われるダイアログの一種です。
typedef struct {
DWORD dwSize;
DWORD dwFlags;
HINSTANCE hInstance;
union {
LPCSTR pszTemplate;
LPCDLGTEMPLATE pResource;
};
union {
HICON hIcon;
LPCSTR pszIcon;
};
LPCSTR pszTitle;
DLGPROC pfnDlgProc;
LPARAM lParam;
LPFNPSPCALLBACK pfnCallback;
UINT *pcRefParent;
#if (_WIN32_IE >= 0x0500)
LPCTSTR pszHeaderTitle;
LPCTSTR pszHeaderSubTitle;
#endif
#if (_WIN32_WINNT >= 0x0501)
HANDLE hActCtx;
#endif
} PROPSHEETPAGE, *LPPROPSHEETPAGE;
dwSizeメンバには構造体のサイズ=52を代入します。| 値 | 意味 |
|---|---|
| PSP_DEFAULT(0x00000000) | デフォルト。 |
| PSP_DLGINDIRECT(0x00000001) | |
| PSP_HASHELP(0x00000020) | ヘルプボタンを有効にします。 |
| PSP_HIDEHEADER(0x00000800) | ウェルカムページと設定完了ページだけに指定します。 |
| PSP_USECALLBACK(0x00000080) | ページが作成または破棄されたときに、pfnCallbackメンバに指定された関数を呼び出します。 |
| PSP_USEHICON(0x00000002) | hIconをページのタブアイコンとして使用します。 |
| PSP_USEICONID(0x00000004) | pszIconをページのタブアイコンとして使用するアイコンリソースの名前として使います。 |
| PSP_USETITLE(0x00000008) | pszTitleメンバをダイアログボックステンプレートに格納されているタイトルではなく、プロパティシートダイアログボックスのタイトルとして使用します。 |
typedef struct {
DWORD dwSize;
DWORD dwFlags;
HWND hwndParent;
HINSTANCE hInstance;
union {
HICON hIcon;
LPCTSTR pszIcon;
};
LPCTSTR pszCaption;
UINT nPages;
union {
UINT nStartPage;
LPCTSTR pStartPage;
};
union {
LPCPROPSHEETPAGE ppsp;
HPROPSHEETPAGE *phpage;
};
PFNPROPSHEETCALLBACK pfnCallback;
#if (_WIN32_IE >= 0x0400)
union {
HBITMAP hbmWatermark;
LPCTSTR pszbmWatermark;
};
HPALETTE hplWatermark;
union {
HBITMAP hbmHeader;
LPCSTR pszbmHeader;
};
#endif
} PROPSHEETHEADER, *LPPROPSHEETHEADER;
dwSizeメンバには構造体のサイズ=52を代入します。| 値 | 意味 |
|---|---|
| PSH_DEFAULT(0x00000000) | デフォルト。通常のプロパティシートが作成されます。 |
| PSH_AEROWIZARD(0x00004000) | Version 6.00か、Windows Vista対応。 新しいAeroスタイルを使用するウィザードのプロパティシートを作成します。PSH_WIZARDフラグも指定する必要があります。シングルスレッドアパートメント(STA)モデルを使用する必要があります。 |
| PSH_HASHELP(0x00000200) | プロパティシートのページにヘルプボタンを表示できるようにします。(PSH_AEROWIZARD指定時無効) |
| PSH_NOAPPLYNOW(0x0x00000080) | [適用]ボタンを削除します。(PSH_AEROWIZARD指定時無効) |
| PSH_NOCONTEXTHELP(0x02000000) | Version 5.80以降対応。 コンテキストヘルプボタンを削除します。(PSH_AEROWIZARD指定時無効) |
| PSH_PROPSHEETPAGE(0x0x00000008) | ppspメンバを使用し、phpageメンバを無視します。 |
| PSH_PROPTITLE(0x0x00000001) | プロパティシートのタイトルバーに加工されたタイトルが表示されます。pszCaptionで指定された文字列の後に「のプロパティ」が挿入されます。 |
| PSH_RESIZABLE(0x04000000) | ユーザーがプロパティシートのサイズを変更できるようにします。PSH_AEROWIZARDと一緒に使います。 |
| PSH_RTLREADING(0x00000800) | プロパティシートのタイトル文字列の読む向きを右から左に変更します。 |
| PSH_WIZARD(0x00000020) | ウィザードのプロパティシートを作成します。PSH_AEROWIZARDを指定するときにも使います。 |
| PSH_WIZARD97(0x00002000) | Version 5.80以降対応。Wizard97ウィザードのプロパティシートを作成します。(PSH_AEROWIZARD指定時無効) |
| PSH_WIZARDCONTEXTHELP(0x00001000) | コンテキストヘルプボタンを追加します。(PSH_AEROWIZARD指定時無効) |
| PSH_WIZARDHASFINISH(0x00000010) | ウィザードに[完了]ボタンが常に表示されます。ウィザード形式のプロパティシート(PSH_WIZARD、PSH_WIZARD97、PSH_AEROWIZARD)である必要があります。 |
| ID_PSREBOOTSYSTEM(0x00000003) | ページがPSM_REBOOTSYSTEMメッセージをプロパティシートに送信しました。ユーザーの変更を有効にするには、コンピュータを再起動する必要があります。 |
| ID_PSRESTARTWINDOWS(0x00000002) | ページがPSM_RESTARTWINDOWSメッセージをプロパティシートに送信しました。ユーザーの変更を有効にするには、Windowsを再起動する必要があります。 |
LANGUAGE 17, SUBLANG_DEFAULT
200 DIALOG 0, 0, 260, 180
STYLE DS_SETFONT | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP
CAPTION "書式"
FONT 9, "MS UI Gothic"
{
EDITTEXT 40000, 75, 25, 165, 17, ES_AUTOHSCROLL, WS_EX_LEFT
EDITTEXT 40001, 75, 50, 165, 17, ES_AUTOHSCROLL | ES_NUMBER, WS_EX_LEFT
AUTOCHECKBOX "太字(&B)", 40002, 25, 100, 60, 10, 0, WS_EX_LEFT
AUTOCHECKBOX "斜体(&I)", 40003, 25, 115, 60, 10, 0, WS_EX_LEFT
AUTOCHECKBOX "下線(&U)", 40004, 90, 100, 60, 10, 0, WS_EX_LEFT
AUTOCHECKBOX "打ち消し線(&S)", 40005, 90, 115, 60, 10, 0, WS_EX_LEFT
GROUPBOX "スタイル(&Y):", 65535, 15, 85, 145, 55, 0, WS_EX_TRANSPARENT
LTEXT "フォント名(&N):", 65535, 16, 27, 37, 9, SS_LEFT, WS_EX_LEFT
LTEXT "フォントサイズ(&Z):", 65535, 16, 52, 46, 9, SS_LEFT, WS_EX_LEFT
}
LANGUAGE 17, SUBLANG_DEFAULT
201 DIALOG 0, 0, 260, 180
STYLE DS_SETFONT | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP
CAPTION "文字列"
FONT 9, "MS UI Gothic"
{
EDITTEXT 40000, 75, 25, 165, 17, ES_AUTOHSCROLL, WS_EX_LEFT
LTEXT "タイトル文字列(&T):", 65535, 16, 27, 55, 9, SS_LEFT, WS_EX_LEFT
}
resource.h:
#define IDC_EDIT_FONTNAME 40000 #define IDC_EDIT_TITLE 40000 #define IDC_EDIT_FONTSIZE 40001 #define IDC_CHK_BOLD 40002 #define IDC_CHK_ITALIC 40003 #define IDC_CHK_UNDERLINE 40004 #define IDC_CHK_STRIKEOUT 40005ソースファイル:
//HSP3.5から対応。
#include "comctl32.as"
#include "user32.as"
#include "kernel32.as"
#include "shell32.as"
#include "hscallbk.as"
#include "resource.h"
#packopt name "プロパティシート表示サンプル"
#packopt runtime "runtime.hrt"
#uselib ""
#func _PropWndProc "" int, int, int
#func _PropPageProc1 "" int, int, int, int
#func _PropPageProc2 "" int, int, int, int
setcallbk pPropWndProc, _PropWndProc, *PropWndProc
setcallbk pPropPageProc1, _PropPageProc1, *PropPageProc1
setcallbk pPropPageProc2, _PropPageProc2, *PropPageProc2
#define PROPSHEETPAGE_SIZE 13
#define PROPSHEETHEADER_SIZE 13
#define WM_DESTROY 0x0002
#define WM_SETTEXT 0x000C
#define WM_NOTIFY 0x004E
#define BM_GETCHECK 0x00F0
#define BM_SETCHECK 0x00F1
#define WM_INITDIALOG 0x0110
#define PSN_APPLY -202
#define PSP_DEFAULT 0x00000000
#define PSH_DEFAULT 0x00000000
#define mhwnd callbkarg(0)
#define mmsg callbkarg(1)
#define mwp callbkarg(2)
#define mlp callbkarg(3)
#define mplp callbkarg(2)
//プロパティシートで使う設定項目用の変数
sdim FontName,0x101
sdim sTitle,0x101
FontName = "MS ゴシック" //フォント名
FontSize = 12 //フォントサイズ
FontStyle = 0 //フォントスタイル
sTitle = "タイトル" //タイトル
button gosub "表示!", *ShowProp
stop
*ShowProp
dim psp,PROPSHEETPAGE_SIZE //PROPSHEETPAGE構造体
dim psh,PROPSHEETHEADER_SIZE //PROPSHEETHEADER構造体
dim hPsp,3 //プロパティページハンドル
//前準備
psp(0) = PROPSHEETPAGE_SIZE*4 //dwSize
psp(1) = PSP_DEFAULT //dwFlags
psp(2) = hinstance //hInstance
psp(3) = 0 //pszTemplate
psp(4) = 0 //hIcon
psp(5) = 0 //pszTitle
psp(6) = 0 //pfnDlgProc
psp(7) = 0 //lParam
psp(8) = 0 //pfnCallback
psp(9) = 0 //pcRefParent
//タブページ1を作る
psp(3) = 200 //pszTemplate
psp(6) = varptr(pPropPageProc1) //pfnDlgProc
hPsp(0)=CreatePropertySheetPage(varptr(psp))
//タブページ2を作る
psp(3) = 201 //pszTemplate
psp(6) = varptr(pPropPageProc2) //pfnDlgProc
hPsp(1)=CreatePropertySheetPage(varptr(psp))
szCaption="はじめてのプロパティシート" //タイトル
psh(0) = PROPSHEETHEADER_SIZE*4 //dwSize
psh(1) = PSH_DEFAULT //dwFlags
psh(2) = hwnd //hwndParent
psh(3) = hDLLInstance //hInstance
psh(4) = 0 //hIcon / pszIcon
psh(5) = varptr(szCaption) //pszCaption
psh(6) = 2 //nPages
psh(7) = 0 //nStartPage / pStartPage
psh(8) = varptr(hPsp) //ppsp / phpage
psh(9) = varptr(pPropWndProc) //pfnCallback
psh(10) = 0 //hbmWatermark / pszbmWatermark
psh(11) = 0 //hplWatermark
psh(12) = 0 //hbmHeader / pszbmHeader
ret = PropertySheet(varptr(psh))
if (ret == -1){ //作成失敗
mes "作成失敗"
}else:if (ret == 0){ //変更を保存しない
mes "キャンセル"
}else:if (ret >= 1){ //変更を保存する
mes "OK"
}
//変更した設定を反映
color 255, 255, 255:boxf
color 0, 0, 0:pos 40,40
font FontName, FontSize, FontStyle
mes sTitle
return
*PropWndProc
return 0
return
*PropPageProc1
switch mmsg
case WM_INITDIALOG //ダイアログが初期化される
//GetDlgItemでIDからウィンドウハンドルを取得し、文字列を設定する。
//フォント名入力ボックス
SendMessage GetDlgItem(mhwnd, IDC_EDIT_FONTNAME), WM_SETTEXT, 0, varptr(FontName)
//フォントサイズ入力ボックス
string=strf("%u",FontSize)
SendMessage GetDlgItem(mhwnd, IDC_EDIT_FONTSIZE), WM_SETTEXT, 0, varptr(string)
SendMessage GetDlgItem(mhwnd, IDC_CHK_BOLD), BM_SETCHECK, (FontStyle&&1)!=0, 0
SendMessage GetDlgItem(mhwnd, IDC_CHK_ITALIC), BM_SETCHECK, (FontStyle&&2)!=0, 0
SendMessage GetDlgItem(mhwnd, IDC_CHK_UNDERLINE), BM_SETCHECK, (FontStyle&&4)!=0, 0
SendMessage GetDlgItem(mhwnd, IDC_CHK_STRIKEOUT), BM_SETCHECK, (FontStyle&&8)!=0, 0
return 1
swbreak
case WM_NOTIFY
dupptr hdr, mlp, 3*4
if (hdr(2) == PSN_APPLY){//[OK]か[適用]ボタンが押された
//GetDlgItemTextでダイアログ上のコントロールの文字列を取得する。
GetDlgItemText mhwnd, IDC_EDIT_FONTNAME, varptr(FontName), 0x100
FontSize = GetDlgItemInt(mhwnd, IDC_EDIT_FONTSIZE, 0, 0)
FontStyle = 0
FontStyle |= (SendMessage(GetDlgItem(mhwnd, IDC_CHK_BOLD), BM_GETCHECK, 0, 0)!=0) * 1
FontStyle |= (SendMessage(GetDlgItem(mhwnd, IDC_CHK_ITALIC), BM_GETCHECK, 0, 0)!=0) * 2
FontStyle |= (SendMessage(GetDlgItem(mhwnd, IDC_CHK_UNDERLINE), BM_GETCHECK, 0, 0)!=0) * 4
FontStyle |= (SendMessage(GetDlgItem(mhwnd, IDC_CHK_STRIKEOUT), BM_GETCHECK, 0, 0)!=0) * 8
}
swbreak
swend
return 0
return
*PropPageProc2
switch mmsg
case WM_INITDIALOG //ダイアログが初期化される
//GetDlgItemでIDからウィンドウハンドルを取得し、文字列を設定する。
SendMessage GetDlgItem(mhwnd, IDC_EDIT_TITLE), WM_SETTEXT, 0, varptr(sTitle)
return 1
swbreak
case WM_NOTIFY
dupptr hdr, mlp, 3*4
if (hdr(2) == PSN_APPLY){//[OK]か[適用]ボタンが押された
//GetDlgItemTextでダイアログ上のコントロールの文字列を取得する。
GetDlgItemText mhwnd, IDC_EDIT_TITLE, varptr(sTitle), 0x100
}
swbreak
swend
return 0
return

(C)2019 inonote / 無断転載禁止