我试图在combobox的DateTimePicker控制通知上更改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...格式被正确地改变,但是spin控件根本没有被添加。
在调试器中运行时,我可以看到它通过我的代码并没有抛出任何异常-> --我转到Debug->Exceptions并检查了Thrown下的所有内容。
我使用Visual 2013在Windows 7 x86上工作。
我的目标是XP继续。
你能帮我修复我的代码吗?这样我才能达到预期的行为?
发布于 2015-01-25 20:21:53
在创建控件后不能更改某些常见的控件属性。在这种情况下,日期/时间选择器只在创建时查看DTS_UPDOWN样式--如果在处理WM_CREATE时设置了位,那么它将创建子自旋控件。
实际上,如果在尝试更改控件样式后使用GetWindowLong查询控件的样式位,您将看到它主动阻止了更改--创建后不会让您更改DTS_UPDOWN或DTS_SHOWNONE。
您的选项要么销毁并根据需要重新创建控件,要么首先从两个不同的控件开始,然后使用ShowWindow在它们之间切换。
https://stackoverflow.com/questions/28137962
复制相似问题