标签编辑(EditLabel)在CView类忽略鼠标点击



我有一个应用程序,使用CView类与CListCtrl作为其主要控件。当我使用EditLabel函数时,它的"工作"是因为标签编辑开始了,现有的字符被突出显示,我可以使用键盘箭头键来移动和更改文本。但是我不能让老鼠被认出来。因此,如果最终用户想要单击现有文本中的某个地方并修改它,则无法识别单击。只有方向键、home键、end键等可以用来导航编辑单元格。

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

因此,在应用程序或框架中似乎有什么东西正在捕获CEdit控件中的鼠标单击。

这个应用程序有很多事件处理程序,但是在编辑模式下不调用OnClick事件。调用PretranslateMessage处理程序,但是不处理WM_LBUTTONDOWN消息。我可以给它设个陷阱,但我不知道该把消息发送到哪里。

是否有一些东西,我错过了鼠标点击事件去哪里?

我在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
    }
}

处理程序完成了我们所需的大部分功能,只有一些小的区别。例如,不能在编辑控件中拖选文本。

最新更新