如何实现 WM_LBUTTONCLICK 事件处理程序

Posted

技术标签:

【中文标题】如何实现 WM_LBUTTONCLICK 事件处理程序【英文标题】:How to implement a WM_LBUTTONCLICK event handler 【发布时间】:2013-08-26 08:48:23 【问题描述】:

假设我有 the COpenGLControl class derived from CWnd,并且我正在为自己的目的对其进行自定义。 我想做这样的事情:1- 在我的对话框顶部添加一个缩放工具工具栏按钮。 2- 按下提到的工具栏按钮后,下面解释的功能将启用。 3- 如果用户单击鼠标左键,我们将放大两倍并 glTranslate 到用户单击的位置。 4-如果用户单击鼠标右键,我们将缩小 0.5 倍并 glTranslate 到用户单击的位置。 5-如果用户单击另一个工具栏按钮,上述两个步骤中说明的功能将被禁用。

你知道我想在Global Mapper 中实现类似Zoom Tool 的东西。

我在实现glScaleglTranslate 时没有问题。 只是 MFC 部分有问题。 搜索默认消息处理程序,我发现我们有 WM_LBUTTONDBLCLK,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDBLCLK,WM_RBUTTONDOWN,WM_RBUTTONUP 但不是 WM_LBUTTONCLKWM_RBUTTONCLK

即使我们有WM_LBUTTONCLKWM_RBUTTONCLK,这些事件处理程序也会在创建窗口后一直启用并处于活动状态,直到关闭它,但我希望它们仅在特定时间处于活动状态(在单击缩放工具之后和之前单击另一个工具) 我从here 知道,也许我需要在用户定义的消息处理程序中实现这些功能,但我不知道,因为我是 MFC 的新手。 你能帮我给出真正的想法吗?

【问题讨论】:

在您提供的link 中没有提到“用户定义的”消息处理程序。只需实现一个ON_LBUTTONDOWN 处理程序并在处理程序中根据您的软件状态决定您要做什么。 ok @Michael Walz 在发布问题后,我实现了 ON_LBUTTONDOWN 处理程序。它按我的预期工作。但问题是这个处理程序始终处于活动状态,每当我进入 opengl 窗口并左键单击 glScale 并运行 glTranslate 时。但我告诉过,我希望处理程序在某个时间处于活动状态(在单击对话框顶部的zoom tool 工具栏按钮之后以及在单击其他工具栏按钮之前)。事实上,我问过如何让鼠标事件处理程序在特定时间处于活动状态?我不知道! 或者我怎样才能让鼠标 WM_LBUTTONDOWN 消息只在特定时间发送? 不知道是否需要实现用户自定义的消息处理程序,然后在我的程序的某些部分发送相应的消息? 请帮我提供任何合适的想法如何使默认的 MFC CWnd 事件处理程序在特定时间处于活动状态或如何实现用户定义的事件处理程序以在特定时间捕获相应的消息? 【参考方案1】:

尝试类似的方法:

void COpenGLControl::OnLButtonDown(UINT nFlags, CPoint point)

    if (zoom_tool_has_been_clicked)
    
        // do zoom stuff here

        return ;
    

    CWnd::OnLButtonDown(nFlags, point);

只是给你一个想法。

【讨论】:

哦,你是对的。事实上it is like datenwolf's suggestion to define a mode for my class 但我不知道为什么我不明白他的目的。似乎我一直在寻找困难的解决方案。我太傻了。 但是@Michael Walz 您能否在回答中解释一下在哪里使用用户定义的消息更好?在什么情况下使用它们? 只是稍微熟悉一下它们的使用情况?如果我熟悉这些情况,我会更多地搜索自定义消息,以防遇到这种情况。感谢您的关注! 用户定义的消息仅在您想发送标准 WM_* 消息之一的其他内容时才有用。在您的情况下,您想要处理 WM_LBUTTONDOWN 消息,因此无需使用用户定义的消息。 你能给我一个可能需要处理的非标准事件的例子吗?谢谢@Michael Walz 这个答案是错误的。最好在鼠标向上而不是鼠标向下时“触发”点击事件。当您单击鼠标时捕获鼠标,然后在鼠标向上时进行缩放或不进行缩放。如果您不捕获鼠标,则如果鼠标光标位于您的控制区域之外,则可以忽略向上。如果用户之前在该区域内按下鼠标,则这允许用户通过将鼠标移到该区域之外来“取消”点击。

以上是关于如何实现 WM_LBUTTONCLICK 事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

如何实现异步的点赞和评论的

Flink 如何实现新的流处理应用第二部分:版本化状态

Flink 如何实现新的流处理应用第二部分:版本化状态

什么是Java的接口,如何运用接口实现事件监听

如何实现一个可以处理其子组件中所有事件的React容器?

如何实现Application event,观察者模式