如何让 OnCommand 检测 DTN_DATETIMECHANGE?

问题描述 投票:0回答:1

我的

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

visual-c++ mfc datetimepicker
1个回答
0
投票

根据@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
转换为结构,但它不喜欢它。


资源:

© www.soinside.com 2019 - 2024. All rights reserved.