使用PreTranslateMessage检测对话框何时将焦点设置为各种组合控件。

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

我有一个 CDialog 而我想覆盖 PreTranslateMessage 像这样。

BOOL CWeekendMeetingDlg::PreTranslateMessage(MSG* pMsg)
{

    if (pMsg->message == WM_SETFOCUS)
    {
        if (::GetDlgCtrlID(pMsg->hwnd) != IDC_COMBO_PT_CHAIRMAN &&
            ::GetDlgCtrlID(pMsg->hwnd) != IDC_COMBO_PT_OPEN_PRAYER &&
            ::GetDlgCtrlID(pMsg->hwnd) != IDC_COMBO_WT_CLOSE_PRAYER &&
            ::GetDlgCtrlID(pMsg->hwnd) != IDC_COMBO_WEEKEND_HOST &&
            ::GetDlgCtrlID(pMsg->hwnd) != IDC_COMBO_WEEKEND_COHOST &&
            ::GetDlgCtrlID(pMsg->hwnd) != IDC_COMBO_PT_READER)
        {
            if (m_gridAssignHist.GetRowCount() != 1)
            {
                m_gridAssignHist.SetRowCount(1);
            }
        }
    }

    return CDialog::PreTranslateMessage(pMsg);
}

它没有工作。我想做的是重置我的 CGridCtrl 当其他控件获得焦点时(例如:编辑组合),行数变为1。但如果我在第一个 if 它永远不会被拦截。

目前我唯一能想到的是将对话框中所有的组合ID重新编号,使它们是按顺序排列的,然后使用命令范围为 OnSetFocus 并在该处理程序中检测。但也有一些 CEdit 控制。

不过我不能用PTM来避免吗?对我来说,这似乎是最简单的。

下面是对话框。

enter image description here

目前我有7个组合 OnSetFocus 处理程序。当它们启动时,在右边的网格中显示特定的分配历史。

因此,如果用户移动到对话框上的任何其他控件,分配历史控件将不适用。这就是为什么我想重置历史记录到只显示标题行的原因。我希望用PTM来实现这一点。

visual-c++ mfc setfocus
1个回答
1
投票

子控件的通知是在父对话框中通过 WM_COMMAND 消息。覆盖MFC对话框的 OnCommand 捕捉这些通知 (CBN_SETFOCUS, EN_SETFOCUS 等)。)

void DoSomething()
{   /* ... */ }

BOOL CWeekendMeetingDlg::OnCommand(WPARAM wParam, LPARAM /*unused*/)
{
    switch (HIWORD(wParam))
    {
    case CBN_SETFOCUS:
        switch (LOWORD(wParam))
        {
        case IDC_COMBO_PT_CHAIRMAN:
        // ...more combobox IDCs
            DoSomething();
            break; // or return TRUE to bypass any message map handlers
        }
        break;

    case EN_SETFOCUS:
        switch (LOWORD(wParam))
        {
        case IDC_EDIT_WHATEVER:
        // ...more editbox IDCs
            DoSomething();
            break;
        }
        break;

    // ...more notification codes
    }
    return CDialog::OnCommand(wParam, lParam);
}

0
投票

我在对话框中添加了一个2秒的计时器。

void CWeekendMeetingDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == 1)
    {
        CWnd* pControl = GetFocus();
        if (pControl != nullptr)
        {
            CWnd* pParent = pControl->GetParent();
            if (pParent != nullptr)
            {
                int iCtrlID = pParent->GetDlgCtrlID();

                if (iCtrlID != IDC_COMBO_PT_CHAIRMAN &&
                    iCtrlID != IDC_COMBO_PT_OPEN_PRAYER &&
                    iCtrlID != IDC_COMBO_WT_CLOSE_PRAYER &&
                    iCtrlID != IDC_COMBO_WEEKEND_HOST &&
                    iCtrlID != IDC_COMBO_WEEKEND_COHOST &&
                    iCtrlID != IDC_COMBO_PT_READER)
                {
                    if (m_gridAssignHist.GetRowCount() != 1)
                    {
                        m_gridAssignHist.SetRowCount(1);

                        UpdateData(TRUE);
                        m_strAssignHistLabel = _T("Assignment:");
                        UpdateData(FALSE);
                    }
                }

            }

        }

    }

    CDialog::OnTimer(nIDEvent);
}

这似乎很好用。

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