我正在尝试更改组合框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。
你能帮助我修改我的代码,以便达到理想的行为吗?
答案 0 :(得分:1)
创建控件后,某些常用控件属性无法更改。在这种情况下,日期/时间选择器仅在创建时查看DTS_UPDOWN
样式 - 如果在处理WM_CREATE
时设置该位,则创建子旋转控件。
事实上,如果您在尝试更改该样式后使用GetWindowLong
查询控件的样式位,您会看到它主动阻止了更改 - 它不会让您更改DTS_UPDOWN
或{{ 1}}创造之后。
您的选择是根据需要销毁和重新创建控件,或者首先从两个不同的控件开始,然后使用DTS_SHOWNONE
在它们之间切换。