Compartir a través de


Cómo crear un control de calendario de mes

En este tema se muestra cómo crear dinámicamente un control de calendario de mes mediante la función CreateWindowEx .

Lo que necesita saber

Tecnologías

Requisitos previos

  • C/C++
  • Programación de la interfaz de usuario de Windows

Instrucciones

Para crear un control de calendario de mes, use la función CreateWindowEx , especificando MONTHCAL_CLASS como clase de ventana. Primero debe registrar la clase de ventana llamando a la función InitCommonControlsEx , especificando el bit ICC_DATE_CLASSES en la estructura INITCOMMONCONTROLSEX correspondiente.

En el ejemplo siguiente se muestra cómo crear un control de calendario de mes en un cuadro de diálogo modeless existente. Tenga en cuenta que los valores de tamaño pasados a CreateWindowEx son ceros. Dado que el tamaño mínimo necesario depende de la fuente que usa el control, el ejemplo usa la macro MonthCal_GetMinReqRect para solicitar información de tamaño y, a continuación, cambia el tamaño del control llamando a SetWindowPos. Si posteriormente cambia la fuente con WM_SETFONT, las dimensiones del control no cambiarán. Debe llamar a MonthCal_GetMinReqRect de nuevo y cambiar el tamaño del control para ajustarse a la nueva fuente.

// 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;
}

Referencia de control de calendario de mes

Acerca de los controles de calendario de mes

Usar controles de calendario de mes