我有一个应用程序,使用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
}
}
处理程序完成了我们所需的大部分功能,只有一些小的区别。例如,不能在编辑控件中拖选文本。