简单的自动重复(火控)按钮控制

介绍 我需要一个普通的按钮,它可以像鼠标按钮一样被不断地点击 下举行。听起来很简单。我在游戏和XWindows项目中看到过这种情况 所有地方都有这样做的小部件。但是我找不到。他! 我确实发现了一些简洁的代码,可以进行“鼠标重复”,听起来好像可以完成任务,尽管效果更差 干净。这只是重复鼠标左键按下的消息,只要按钮是按下的。酷。但按钮 当鼠标按钮上升时,控件只向所属对话框发送BN_CLICKED消息 (BN_CLICKED消息是您处理的典型消息,并且vc++在其资源中支持该消息 编辑器)! 看起来我需要子类化标准的CButton控件 拦截消息到一个控件,是一个Windows的东西,而不是一个c++的东西)。Windows子类化是I 从来没有做过。幸运的是,在CodeProject上有一些很好的关于子类化的文章。 它所做的 新的button类CRepeatButton捕获LButtonDown、LButtonUp和计时器消息。 当鼠标左键按下时,设置计时器,时间与键盘自动重复相同。 同样,初始的BN_CLICKED消息被发布到控件的父控件。当计时器第一次触发时,在自动重复期间,计时器被重置为单击之间的间隔。 另一个BN_CLICKED消息被发送到父节点。每次计时器在此之后关闭时,都会发布BN_CLICKED消息。 如果鼠标离开控件的矩形或者鼠标按钮被抬起,定时器就会被取消 进一步的消息被张贴到父。 到目前为止,还不算太坏。然而,由于这个按钮有点奇怪,我觉得给予很重要 某种视觉和听觉线索。所以当在自动重复模式下(经过初始延时后),背景色 按钮的颜色变为黄色。这涉及到可怕的DrawItem函数和打开所有者 画画。但我从别人那里获取了这个代码,所以一点都不疼。 每次发布BN_CLICKED消息时,就会播放一个“click”wav图像。 由于这可能会惹恼一些人,我在这里添加了许多关于删除这些特性的评论。 我是怎么做到的 基本上,我偷用了一些代码,我在这里找到CodeProject: 子类DemoMouse重复 我如何在我的项目中得到它? 可能还有更好、更干净、更优雅的方法来做这件事,但是这个方法确实有效而且非常简单。 首先,我需要让vc++知道这个新类,所以我使用类向导来创建一个基于它的新类 CButton称为CRepeatButton。类向导创建RepeatButton.h和RepeatButton.cpp 然后在我自己的RepeatButton.h和RepeatButton.cpp文件中复制。 然后我重新构建了这个项目,基本原则是太快地做太多的修改会混淆vc++。 回到资源编辑器来添加新按钮:在对话框中添加一个普通按钮并更改资源id 根据需要。对于这里包含的演示项目,我将其命名为IDC_BUTTON1。令人惊讶的是,这就是它的名字 资源编辑器分配了它! 现在使用类向导向对话框添加一个成员变量。可变类别是控制(并不是说有很多) 选择的)。变量类型是CRepeatButton(而不是CButton)。 就是这样!普通的CButton被劫持了,现在是一个有效的CRepeatButton。 我用vc++ 6.0 (MFC 4.2)构建了这个,但我不认为它是完全特定于版本的。 有一点奇怪的是,WAV声音既不是文件,也不是资源。它是如此的小(10毫秒)以至于我不能 承受每次通过循环搜索它的开销。因此我将文件转换为数组 字符并将地址发送给sndPlaySound()函数。但这可能会惹恼一些人,所以我加上了评论 撤销这…… 本文转载于:http://www.diyabc.com/frontweb/news1002.html

原文地址:https://www.cnblogs.com/Dincat/p/13456201.html