我有一个应用程序,它使用CView类和CListCtrl作为其主要控件。当我使用EditLabel功能时,它的工作原理是'在标签编辑开始时,现有的字符突出显示,我可以使用键盘箭头键移动并更改文本。但我无法识别鼠标。因此,如果最终用户想要单击现有文本中的某个位置并对其进行修改,则无法识别该单击。只有箭头键,主页,结尾等可用于导航编辑单元格。
此应用程序还使用CListCtrl的几个对话框,就地编辑允许使用鼠标。
因此,在应用程序或框架中似乎存在捕获CEdit控件中鼠标单击的内容。
此应用程序有许多事件处理程序,但在编辑模式下不会调用OnClick事件。调用PretranslateMessage处理程序,但不处理WM_LBUTTONDOWN消息。我可以为它设置陷阱,但无论如何都不知道在哪里发送消息。
鼠标点击事件发生的地方是否有我遗漏的东西?
答案 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
}
}
处理程序完成了我们所需的大多数功能,但有细微的差别。例如,您不能在编辑控件中拖动选择文本。