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

时间:2015-01-25 15:16:50

标签: c++ c winapi combobox datetimepicker

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

当用户选择一个选项时,日期时间选择器应该具有旋转控制并且仅显示年份。如果用户选择其他选项,则应将样式重置为短日期样式,日期格式应将日期显示为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下的所有内容。

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

我的目标是XP。

你能帮助我修改我的代码,以便达到理想的行为吗?

1 个答案:

答案 0 :(得分:1)

创建控件后,某些常用控件属性无法更改。在这种情况下,日期/时间选择器仅在创建时查看DTS_UPDOWN样式 - 如果在处理WM_CREATE时设置该位,则创建子旋转控件。

事实上,如果您在尝试更改该样式后使用GetWindowLong查询控件的样式位,您会看到它主动阻止了更改 - 它不会让您更改DTS_UPDOWN或{{ 1}}创造之后。

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