CView类中的标签编辑(EditLabel)忽略鼠标单击

时间:2014-07-23 16:33:22

标签: mfc clistctrl

我有一个应用程序,它使用CView类和CListCtrl作为其主要控件。当我使用EditLabel功能时,它的工作原理是'在标签编辑开始时,现有的字符突出显示,我可以使用键盘箭头键移动并更改文本。但我无法识别鼠标。因此,如果最终用户想要单击现有文本中的某个位置并对其进行修改,则无法识别该单击。只有箭头键,主页,结尾等可用于导航编辑单元格。

此应用程序还使用CListCtrl的几个对话框,就地编辑允许使用鼠标。

因此,在应用程序或框架中似乎存在捕获CEdit控件中鼠标单击的内容。

此应用程序有许多事件处理程序,但在编辑模式下不会调用OnClick事件。调用PretranslateMessage处理程序,但不处理WM_LBUTTONDOWN消息。我可以为它设置陷阱,但无论如何都不知道在哪里发送消息。

鼠标点击事件发生的地方是否有我遗漏的东西?

1 个答案:

答案 0 :(得分:0)

我在CFormView派生的类中嵌入的编辑控件遇到了类似的问题。

尽管已启用并相应亮起,但控件的行为就像已被禁用或已启用,但被“力场”所覆盖,会阻止其使用。无法使用鼠标选择它。它似乎不是与MFC文献一致的状态。

我主要通过子类化MFC CEdit控件并添加以下消息映射条目ON_WM_LBUTTONDOWN()及其处理程序来解决此问题:

void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
    auto bEnabled = IsWindowEnabled();
    BOOL bReadOnly = GetStyle() & ES_READONLY;
    //ShowCursor(TRUE);
    //ShowCaret();// Does nothing

    // New logic to circumvent "force field" that prevents editing the control's contents
    // Identify the position that the mouse was clicked on
    auto ptMousePos = (CPoint)GetMessagePos();
    ScreenToClient(&ptMousePos);
    auto nChar = CharFromPos(ptMousePos);

    CEdit::OnLButtonDown(nFlags, point);
    if (bEnabled)
    {
        auto pWnd = SetFocus();// Grab the focus
        TRACE(_T("Got focus \n"));

        // Explicitly select the character
        int nStartChar, nEndChar;// troubleshooting
        GetSel(nStartChar, nEndChar);// troubleshooting
        SetSel(nChar, nChar);// Automatically handles nChar overflow
    }
}

处理程序完成了我们所需的大多数功能,但有细微的差别。例如,您不能在编辑控件中拖动选择文本。