首页 > 解决方案 > Win32 DateTime_SetMonthCalColor 似乎不起作用

问题描述

我想更改 datetimepicker contorl 日历的背景颜色。根据 windows SDK,有一个 marco DateTime_SetMonthCalColor。

DateTime_SetMonthCalColor(hwnd,MSC_BACKGROUND,RGB(0,120,250));

但不行。我在 windows control spy 上执行此操作,发送相同的消息 DTM_SETMCCOLOR ,也没有效果。那么怎么了?

标签: winapi

解决方案


MCSC_BACKGROUND设置月历控件本身的背景颜色,仅在下拉菜单的大小调整为大于默认单月时显示。各个月份的背景设置为MCSC_MONTHBK相反。

在此处输入图像描述

每次打开下拉菜单时都会创建月历控件。为了调整它的大小,日期时间选择器控件的父窗口必须处理DTN_DROPDOWN通知,如下面的最小示例所示。

HWND CreateDTC(HWND hWnd)
{
    INITCOMMONCONTROLSEX icex = { sizeof(icex), ICC_DATE_CLASSES };
    InitCommonControlsEx(&icex);

    return CreateWindowExW(0, DATETIMEPICK_CLASS, L"DateTime",
                           WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_SHOWNONE,
                           10, 10, 150, 25, hWnd, nullptr, hInst, nullptr);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hDTC = nullptr;

    switch(msg)
    {
    case WM_CREATE:
        hDTC = CreateDTC(hWnd);
        DateTime_SetMonthCalColor(hDTC, MCSC_BACKGROUND, RGB(0, 120, 250)); // blue
        DateTime_SetMonthCalColor(hDTC, MCSC_MONTHBK, RGB(120, 250, 0));    // green
        break;

    case WM_NOTIFY:
        switch(((LPNMHDR)lParam)->code)
        {
        case DTN_DROPDOWN:
            HWND hMC = DateTime_GetMonthCal(hDTC);
            RECT rc;
            MonthCal_GetMinReqRect(hMC, &rc);
            MoveWindow(hMC, 0, 0, (5 * rc.right) / 2, (3 * rc.bottom) / 2, FALSE);
            break;
        }
        break;
    //...
    }
    return 0;
}

推荐阅读