月カレンダー コントロールを作成する方法
このトピックでは、CreateWindowEx 関数を使用して 1 か月カレンダー コントロールを動的に作成する方法について説明します。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
1 か月カレンダー コントロールを作成するには、ウィンドウ クラスとして MONTHCAL_CLASS を指定して CreateWindowEx 関数を使用します。 まず、付随する INITCOMMONCONTROLSEX 構造体で ICC_DATE_CLASSES ビットを指定して InitCommonControlsEx 関数を呼び出すことにより、ウィンドウ クラスを登録します。
次の例では、既存のモードレス ダイアログ ボックスで 1 か月カレンダー コントロールを作成する方法を示します。 CreateWindowEx に渡されるサイズ値はすべてゼロであることに注意してください。 必要な最小サイズは、コントロールで使用するフォントによって異なるため、この例では MonthCal_GetMinReqRect マクロを使用してサイズ情報を要求し、その後で SetWindowPos を呼び出してコントロールのサイズを変更します。 それ以降に WM_SETFONT を使用してフォントを変更する場合は、コントロールの寸法は変更されません。 MonthCal_GetMinReqRect をもう一度呼び出して、新しいフォントに合うようにコントロールのサイズを変更する必要があります。
// Child window identifier of the month calendar.
#define IDC_MONTHCAL 101
// Symbols used by SetWindowPos function (arbitrary values).
#define LEFT 35
#define TOP 40
// Description:
// Creates a month calendar control in a dialog box.
// Parameters:
// hwndOwner - handle of the owner window.
// Nonlocal variables:
// MonthCalDlgProc - window procedure of the dialog box that
// contains the month calendar.
// g_hInst - global instance handle.
//
HRESULT CreateMonthCalDialog(HWND hwndOwner)
{
RECT rc;
INITCOMMONCONTROLSEX icex;
HWND hwndDlg = NULL;
HWND hwndMonthCal = NULL;
// Return an error code if the owner handle is invalid.
if (hwndOwner == NULL)
return E_INVALIDARG;
// Load the window class.
icex.dwSize = sizeof(icex);
icex.dwICC = ICC_DATE_CLASSES;
InitCommonControlsEx(&icex);
// Create a modeless dialog box to hold the control.
hwndDlg = CreateDialog(g_hInst,
MAKEINTRESOURCE(IDD_DATE_PICKER),
hwndOwner,
MonthCalDlgProc);
// Return if creating the dialog box failed.
if (hwndDlg == NULL)
return HRESULT_FROM_WIN32(GetLastError());
// Create the month calendar.
hwndMonthCal = CreateWindowEx(0,
MONTHCAL_CLASS,
L"",
WS_BORDER | WS_CHILD | WS_VISIBLE | MCS_DAYSTATE,
0,0,0,0, // resize it later
hwndDlg,
(HMENU) IDC_MONTHCAL,
g_hInst,
NULL);
// Return if creating the month calendar failed.
if (hwndMonthCal == NULL)
return HRESULT_FROM_WIN32(GetLastError());
// Get the size required to show an entire month.
MonthCal_GetMinReqRect(hwndMonthCal, &rc);
// Resize the control now that the size values have been obtained.
SetWindowPos(hwndMonthCal, NULL, LEFT, TOP,
rc.right, rc.bottom, SWP_NOZORDER);
// Set the calendar to the annual view.
MonthCal_SetCurrentView(hwndMonthCal, MCMV_YEAR);
// Make the window visible.
ShowWindow(hwndDlg, SW_SHOW);
return S_OK;
}
関連トピック