【问题标题】:Find out where was mouse clicked on CDialogBar找出鼠标在 CDialogBar 上单击的位置
【发布时间】:2012-03-19 20:26:15
【问题描述】:

我有控制,从 CDialogBar 子类化,它有一些按钮(如工具栏上)。当我在 CDialogBar 类中捕获 WM_LBUTTONDOWN 时,是否可以通过一种简单的方法来了解是否在控件上的某个按钮上单击了鼠标?

【问题讨论】:

    标签: winapi user-interface mfc mouseevent coordinates


    【解决方案1】:

    CDialogBar 类通常承载常规窗口控件,因此当在那里单击按钮时,WM_LBUTTONDOWN 消息将发送到此控件窗口,而不是对话框窗口类。所以如果你想拦截这些消息(如果你真的这样做的话),你需要子类化窗口并处理它们的消息,或者安装一个消息挂钩。

    您还可以使用Spy++ 工具查看哪些消息有效地到达了您感兴趣的CDialogBar 窗口,看看处理它们是否可以解决您的挑战。

    【讨论】:

    • 是的,我是 CDialogBar 的子类,它们捕获了 WM_LBUTTONDOWN,但是当用户单击控件上的按钮时,我想要不同的行为
    • 如果您将控件子类化(要清楚 - 没有对话栏本身),当您将消息接收到 WndProc 时,您绝对可以覆盖它们的行为,并且您可以转发消息或自己处理。按钮由对话框栏托管在这里甚至无关紧要 - 重要的是通过子类化您拦截消息处理。
    • 是的,我知道我可以,我也可以。你不明白这个问题,这是因为我的英语不好:(我确实抓住了 WM_LBUTTONDOWN 事件并处理了它。我覆盖了 PreTranslateMessage。问题是如果用户点击了控件中的一个按钮,我该怎么办,或者只是在控件的表面。实际上,如果用户单击按钮,我想将此消息转发给 CDialogBar::PreTranslateMessage,如果他单击的不是按钮而是控件,则只执行我的代码,没有标准表面
    • 用户点击一个按钮,WM_LBUTTONDOWN 被发送,你在你的子类化处理程序中看到它,你 SendMessage(或 PostMessage 以便它通过消息队列到达你的 PreTranslateMessage)它到你的CDialogBar。据你说,你已经拥有了一切。
    • 是的,我有这一切。如何检测用户是否点击了按钮,而不仅仅是表面上?就像在 this image imahine 上一样,这是我的控制,我如何在我的 WM_LBUTTONDOWN 处理程序中检测到用户单击了其中一个按钮?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多