c++ - 如果我单击对话框中的项目(列表框、复选框等),则不会触发 OnLButtonDown(),但如果单击背景或静态文本,则可以正常触发

标签 c++ mfc

如果我单击对话框窗口上的任意位置,例如“背景”或静态文本,则会触发 OnLButtonDown() 函数。但是,如果我单击列表框/编辑框/组合/日历/复选框等,则不会触发。 我认为这是因为它们附加了控制变量,而静态文本则没有。但是在我的对话框中添加一个新的列表框并进行测试,我发现它也没有触发,所以现在我很困惑......

我使用类向导添加了 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 应用程序 - 基于对话框的项目。

如果单击列表框/组合/等,如何捕获此鼠标按下事件?

长话短说,我实际上正在尝试解决这个问题: 我有两个列表框(可以说),我想同步滚动它们,当用户滚动其中一个时,其他列表框必须滚动相同(或在下一刻更新)。我想到使用鼠标按下来跟踪每个列表框的位置(使用 GetTopIndex),并在鼠标松开时再次使用 GetTopIndex 并与之前的进行比较。如果进行了更改,则滚动列表框,然后使用 SetTopIndex 更新所有列表框。对于用户来说不友好的解决方案,但对我来说更简单,是单击一个执行此验证/更新的按钮,但它一点也不优雅,它只能将它们设置在同一级别,但无法确定哪个是上次滚动。列表框的这种自动滚动应该只是为了显示,列表框中的选择并不重要。我尝试在列表框中使用“添加事件处理程序”中的消息类型,但显示的消息类型均无法解决我的问题,KillFocus 和 SetFocus 在拖动滚动条时不会触发,只有在单击列表框中的项目时才会触发。 ..并且我在添加事件处理程序中的其他消息类型上也没有成功。

最佳答案

一旦一个窗口处理了一条消息,它就停止发送到它下面的其他窗口。静态窗口不处理鼠标按下,因此它会转到对话框。其他控件都以某种方式处理它(至少设置焦点),因此它永远不会进入对话框。

一旦它们在基类中完成了默认处理,您就可以重写每个控件中的 OnLButtonDown 处理程序来执行其他操作。您还可能会在对话框的 PreTranslateMessage 方法中看到该消息。

关于c++ - 如果我单击对话框中的项目(列表框、复选框等),则不会触发 OnLButtonDown(),但如果单击背景或静态文本,则可以正常触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679000/

相关文章:

c++ - 如何确保 mount 命令在 qt 进程中实际完成

c++ - 严格的混叠和对齐

c# - C# 中的 C++ CString 等价物

c++ - 正确实现 libspotify get_audio_buffer_stats 回调

c++ - 你能在 C++ 的构造函数中放置一个 if 语句来以特定的方式设置一个对象吗?

c++ - 在 C++ 中轮询原子变量(bool)?

c++ - 是否有任何用 C/C++ 编码的回归测试来测试 CString (ATL/MFC) 的所有功能?

c++ - 如何准备 ActiveX 控件以通过 Web 交付

winapi - Win32 在父窗口中捕获子窗口消息

mfc - C编辑,WM_​​PASTE