WTLではコモンダイアログのフォント選択ダイアログを
CFontDialogImplというクラステンプレートでカプセル化しています。
これはATLのCDialogImplクラステンプレートのように基底クラスとしてのみ使用します。
atldlgs.hヘッダではCFontDialogImplから派生したCFontDialogクラスが定義されています。
// atldlgs.h
class CFontDialog : public CFontDialogImpl<CFontDialog>
{
...
...
|
WTLのCFontDialogクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。
以下に示すのは、CFontDialogクラスを使用する例です。
CFontDialog dlg;
if(dlg.DoModal() == IDOK){
CString strMsg;
strMsg.Format(_T("フォント名:%s\nサイズ:%dpt"),
dlg.GetFaceName(), dlg.GetSize() / 10);
MessageBox(strMsg);
}
|
CFontDialogクラスのコンストラクタ引数はすべて省略できます。
引数は順に、フォント選択ダイアログの初期状態を設定するためのLOGFONT構造体へのポインタ、
フラグ、プリンタデバイスコンテキスト、親ウィンドウのハンドルを指定できます。
フォント選択ダイアログを表示するためにはCFontDialogクラスのメンバ関数であるDoModal()を呼び出します。
[OK]ボタンを押してフォント選択ダイアログを閉じた場合は、
戻り値としてIDOKが、
[キャンセル]ボタンを押して閉じた場合はIDCANCELが返ります。
戻り値がIDOKの場合は、CFontDialogクラスのメンバ変数である
m_cfにフォント情報が設定されます。
CFontDialogクラスはこの情報を取得するためのメンバ関数を用意しています。
CFontDialogImplの派生クラスにメッセージマップを用意することによって、
フォント選択ダイアログの動作をカスタマイズすることができます。
次に示すのは、CFontDialogImplの派生クラスにWM_INITDIALOGメッセージハンドラを用意して、
独自のフォント選択ダイアログを作成する例です。
プロジェクトにCustomDlg.hというヘッダファイルを追加し、そこにCCustomDlgというクラスを定義します。
このフォント選択ダイアログには[ヘルプ]ボタンが追加され、親ウィンドウの中央に表示されます。
// CustomDlg.h
#pragma once
class CCustomDlg : public CFontDialogImpl<CCustomDlg>
{
public:
UINT m_uHelpMsg; // [ヘルプ]ボタン用メッセージID
// コンストラクタ
CCustomDlg(LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
HDC hDCPrinter = NULL)
: CFontDialogImpl<CCustomDlg>(lplfInitial, dwFlags, hDCPrinter), m_uHelpMsg(0)
{
// [ヘルプ]ボタンを表示するためにCF_SHOWHELPフラグ追加
m_cf.Flags |= CF_SHOWHELP;
}
BEGIN_MSG_MAP_EX(CCustomDlg)
MSG_WM_INITDIALOG(OnInitDialog)
MESSAGE_HANDLER_EX(m_uHelpMsg, OnHelp)
END_MSG_MAP()
LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){
m_cf.hwndOwner = m_hWnd;
// [ヘルプ]ボタン用メッセージを登録
m_uHelpMsg = RegisterWindowMessage(HELPMSGSTRING);
CenterWindow();
return TRUE;
}
LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam){
MessageBox(_T("ヘルプボタンを押しました。"));
return 0;
}
};
|
CCustomDlgクラスのコンストラクタ引数は、
CFontDialogクラスのコンストラクタ引数を参考にしています。
コンストラクタでは、フォント選択ダイアログに[ヘルプ]ボタンを追加するために
CF_SHOWHELPフラグを追加します。
メッセージマップマクロにはBEGIN_MSG_MAP_EXを使用する必要があります。
WM_INITDIALOGメッセージハンドラでは、
m_cf.hwndOwnerに[ヘルプ]ボタン用メッセージを受信するウィンドウハンドル
(つまりフォント選択ダイアログ自身のハンドル)を設定し、
[ヘルプ]ボタン用のメッセージを登録します。
また、CenterWindow()を呼び出してダイアログを中央に表示します。
OnHelp()は[ヘルプ]ボタンを押した時に呼び出されます。
今回の例ではメッセージボックスを表示します。
次に示すのは、CCustomDlgクラスを使用する例です。
// stdafx.h
#pragma once
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>
#include <atlcrack.h>
#include <atlmisc.h>
#include <atldlgs.h> // コモンダイアログ用クラスを使用するため
|
// MainDlg.h
#pragma once
class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
enum { IDD = IDD_MAINDLG };
BEGIN_MSG_MAP(CMainDlg)
MSG_WM_INITDIALOG(OnInitDialog)
COMMAND_ID_HANDLER_EX(IDC_BUTTON_OPENDLG, OnButtonOpenDlg)
COMMAND_ID_HANDLER_EX(IDOK, OnOK)
COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
END_MSG_MAP()
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
// スクリーンの中央に配置
CenterWindow();
// 大きいアイコン設定
HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
SetIcon(hIcon, TRUE);
// 小さいアイコン設定
HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
SetIcon(hIconSmall, FALSE);
return TRUE;
}
void OnButtonOpenDlg(UINT uNotifyCode, int nID, CWindow wndCtl){
CCustomDlg dlg;
if(dlg.DoModal() == IDOK){
CString strMsg;
strMsg.Format(_T("フォント名:%s\nサイズ:%dpt"),
dlg.GetFaceName(), dlg.GetSize() / 10);
MessageBox(strMsg);
}
}
void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl){
EndDialog(nID);
}
void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl){
EndDialog(nID);
}
};
|
// SampleProject.cpp
#include "stdafx.h"
#include "resource.h"
#include "CustomDlg.h"
#include "MainDlg.h"
CAppModule _Module;
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/)
{
HRESULT hRes = ::CoInitialize(NULL);
ATLASSERT(SUCCEEDED(hRes));
::DefWindowProc(NULL, 0, 0, 0L);
AtlInitCommonControls(ICC_BAR_CLASSES);
hRes = _Module.Init(NULL, hInstance);
ATLASSERT(SUCCEEDED(hRes));
CMainDlg dlg;
int nRet = (int) dlg.DoModal();
_Module.Term();
::CoUninitialize();
return nRet;
}
|
まず、リソースを作成します。ダイアログにボタンコントロールを配置し、
[ID]と[Caption]を次のように設定します。
| コントロール名 |
ID |
Caption |
| ボタン |
IDC_BUTTON_OPENDLG |
ダイアログを開く |
次に、stdafx.hヘッダでは、コモンダイアログを使用するためにatldlgs.hヘッダをインクルードします。
CMainDlgクラスでは、リソースIDがIDC_BUTTON_OPENDLGのWM_COMMANDメッセージハンドラとして
OnButtonOpenDlg()を追加します。
このハンドラ関数ではCCustomDlgクラスのインスタンスを作成し、
DoModal()を呼び出して独自のフォント選択ダイアログを表示します。
最後に、SampleProject.cppファイルでMainDlg.hヘッダの前にCustomDlg.hヘッダをインクルードします。
|