zoukankan      html  css  js  c++  java
  • 简单的自动重复(火控)按钮控制

    介绍 我需要一个普通的按钮,它可以像鼠标按钮一样被不断地点击 下举行。听起来很简单。我在游戏和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

  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/Dincat/p/13456201.html
Copyright © 2011-2022 走看看