更改组合框选择的 DateTimePicker 样式失败

Change DateTimePicker style on combobox selection fails

我正在尝试更改 DateTimePicker control 组合框 CBS_SELCHANGE 通知的样式和日期格式。

当用户选择一个选项时,日期时间选择器应该有旋转控件并且只显示年份。如果用户选择其他选项,样式应重置为短日期样式,日期格式应将日期显示为 dd.mm.yyyy.

这是我目前的代码:

case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDC_COMBO5:
        {
            if (HIWORD(wParam) == CBN_SELENDOK)  
            {
                int iSelected = ComboBox_GetCurSel((HWND)lParam);

                switch (i)
                {
                case 1:
                    {
                        DWORD_PTR dwStyle = 
                            GetWindowLongPtr(GetDlgItem(hDlg,
                               IDC_DATETIMEPICKER1), GWL_STYLE);
                        // remove short date style
                        dwStyle &= ~DTS_SHORTDATEFORMAT;
                        // add spin control
                        dwStyle |= DTS_UPDOWN;
                        SetWindowLongPtr(GetDlgItem(hDlg,
                            IDC_DATETIMEPICKER1), GWL_STYLE, dwStyle);

                        // set date format
                        DateTime_SetFormat(GetDlgItem(hDlg,
                            IDC_DATETIMEPICKER1), L"yyyy");
                    }
                    break;
                case -1:
                case 0:
                case 2:
                default:
                    {
                        DWORD_PTR dwStyle = 
                            GetWindowLongPtr(GetDlgItem(hDlg,
                                IDC_DATETIMEPICKER1), GWL_STYLE);
                        // remove spin control
                        dwStyle &= ~DTS_UPDOWN;
                        // restore short date format
                        dwStyle |= DTS_SHORTDATEFORMAT;
                        SetWindowLongPtr(GetDlgItem(hDlg,
                            IDC_DATETIMEPICKER1), GWL_STYLE, dwStyle);

                        // set date format
                        DateTime_SetFormat(GetDlgItem(hDlg,
                            IDC_DATETIMEPICKER1), L"dd'|'MM'|'yyyy");
                    }
                    break;
                }
            }
        }
        break; 
        // other cases...

格式正确更改,但旋转控件根本没有添加。

运行 通过调试器,我可以看到它通过了我的代码并且没有抛出异常 -> 我去了 Debug->Exceptions 并检查了 Thrown.[=16= 下的所有内容]

我在 Windows 7 x86 上工作,使用 Visual Studio 2013。

我的目标是 XP。

你能帮我修正我的代码,这样我就能达到预期的效果吗?

有些公共控件属性在创建控件后无法更改。在这种情况下,date/time 选择器在创建时仅查看 DTS_UPDOWN 样式 - 如果在处理 WM_CREATE 时设置了该位,则它会创建子旋转控件。

事实上,如果您在尝试更改该样式后使用 GetWindowLong 查询控件的样式位,您会发现它主动阻止了更改 - 它不会让您更改 DTS_UPDOWNDTS_SHOWNONE创建后。

您的选择是根据需要销毁并重新创建控件,或者首先从两个不同的控件开始,然后使用 ShowWindow 在它们之间切换。