更改组合框选择的 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_UPDOWN
或DTS_SHOWNONE
创建后。
您的选择是根据需要销毁并重新创建控件,或者首先从两个不同的控件开始,然后使用 ShowWindow
在它们之间切换。
我正在尝试更改 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_UPDOWN
或DTS_SHOWNONE
创建后。
您的选择是根据需要销毁并重新创建控件,或者首先从两个不同的控件开始,然后使用 ShowWindow
在它们之间切换。