【发布时间】:2012-07-26 22:31:40
【问题描述】:
如果我单击对话框窗口中的任意位置,例如“背景”或静态文本,则会触发函数 OnLButtonDown()。但是,如果我单击 ListBox/EditBox/Combo/Calendar/Checkbox 等,则不会被触发。 我认为这是因为它们附加了控制变量,而静态文本没有。但是在我的对话框中添加一个新的列表框并进行测试,我发现它也没有触发,所以现在我很困惑......
我用类向导添加了 OnLButtonDown(),它出现在:
BEGIN_MESSAGE_MAP(CMFCTesting2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
// other handlers, etc
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
我的功能:
void CMFCTesting2Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox(CString("BUTTON DOWN"));
CDialogEx::OnLButtonDown(nFlags, point);
}
我尝试在 AfxMessageBox... 之前调用 CDialogEx:: ... 但结果相同。
CListBox 项的 Notify 选项设置为 True,正如我在其他帖子中看到的一些建议。
我怀疑 WM 通知消息被 ListBox 以某种方式捕获,而不是“转发”到我的 CMFCTesting2Dlg,但我知道这应该在 ListBox 上将 Notify 选项设置为 True 时发生,不是吗? (嗯,很明显,不是……)
抱歉,我是新来在 MFC 中处理 WM。
顺便说一句,我使用 Visual Studio 2010 Ultimate,这是一个 Visual C++ - MFC- MFC 应用程序 - 基于对话框的项目。
如果单击列表框/组合/等,我如何捕获此鼠标按下事件?
在 LONG STORY 中,我实际上是在尝试解决这个问题: 我有两个列表框(比如说),我想同步滚动它们,当用户滚动其中一个时,其他的必须滚动相同(或在下一刻更新)。我想用鼠标按下来跟踪每个列表框的位置(使用 GetTopIndex),然后在鼠标向上时,再次使用 GetTopIndex 并与以前的进行比较。如果进行了更改,则滚动列表框,然后使用 SetTopIndex 更新所有列表框。对用户不友好但对我来说更简单的解决方案是单击一个执行此验证/更新的按钮,但它一点也不优雅,它只能将它们设置在同一级别,但无法确定哪个是上次滚动。列表框的这种自动滚动应该只是为了显示,列表框中的选择并不重要。我尝试在列表框的添加事件处理程序中使用消息类型,但是如果拖动滚动条,只有在单击列表框中的项目时,才不会触发针对我的问题显示的任何内容,即 KillFocus 和 SetFocus。 ..我在其他消息类型上也没有成功,来自添加事件处理程序。
【问题讨论】: