我的
CDialog
有两个日期时间控件(一个用于时间,一个用于日期):
LTEXT "Meeting Time:",IDC_STATIC,149,20,46,8
CONTROL "",IDC_DTP_MEETING_TIME,"SysDateTimePick32",DTS_RIGHTALIGN | DTS_UPDOWN | WS_TABSTOP | 0x8,148,31,76,15
LTEXT "Last Invited:",IDC_STATIC,149,49,42,8
CONTROL "",IDC_DTP_LAST_INVITED,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,147,60,100,15
我正在尝试使用
OnCommand
来检测大量控件何时更新:
BOOL CCongregationDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
const auto nMessage = HIWORD(wParam);
const auto nControlID = LOWORD(wParam);
if(IsWindowVisible())
{
if (nMessage == CBN_SELCHANGE ||
nMessage == DTN_DATETIMECHANGE ||
nMessage == EN_CHANGE)
{
IsModified(true);
SetControlStates();
}
else if (nMessage == BN_CLICKED && nControlID == IDC_CHECK_LOCAL_CONGREGATION)
{
IsModified(true);
SetControlStates();
}
}
return __super::OnCommand(wParam, lParam);
}
它对于组合和编辑框工作正常,但
DTN_DATETIMECHANGE
似乎没有被检测到?
我发现了关于通知的对话,其中指出:
我发现,
可以与DTN_DATETIMECHANGE
配合使用OnNotify
我很感激我可以为每个控件添加
DTN_DATETIMECHANGE
的处理程序并以这种方式跟踪 IsModified
。但是,是否不可能做类似于我正在做的事情 OnCommand
?
根据@Ilnspectable 的评论和进一步的研究,我得出:
BOOL CCongregationDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR != nullptr)
{
if (wParam == IDC_DTP_LAST_INVITED ||
wParam == IDC_DTP_MEETING_TIME)
{
if (pNMHDR->code == DTN_DATETIMECHANGE)
{
IsModified(true);
SetControlStates();
}
}
}
return __super::OnNotify(wParam, lParam, pResult);
}
我尝试使用
static_cast
和 dynamic_cast
转换为结构,但它不喜欢它。
资源: