用c++做一个小按钮

· · 个人记录

用C++做一个珂爱的小按钮并点击

注意:本文的大前提是窗口位置固定不变,否则无效

按钮的制作

这个很简单,只需要如下,输出一行又一行的字符画(这个是可以自定义的),一个按钮就做好了

#include<bits/stdc++.h>
using namespace std;
int main(){
   cout<<"    -------   "<<endl;
   cout<<"   | 走人   |  "<<endl;
   cout<<"    -------    "<<endl;
   return 0;
}

按钮的交互

我们的按钮只是一个字符画,能有什么办法监测鼠标和它之间的交互呢?这个问题本蒟蒻也曾经提过,得到的回答是:

很简单,只要在鼠标按下时判断是否在按钮之内就行了 --某位大佬

那一刻,一个清晰的思维导图在我脑中闪过

画外音:明明是想了三天还问了人

  1. 判断鼠标按下
  2. 获取鼠标按下时的坐标
  3. 获取按钮覆盖范围坐标
  4. 将鼠标坐标和按钮覆盖范围坐标进行判断

判断鼠标按下

这需要用到一条指令,由于太过复杂,只需要知道作用和用法即可 实际上是我也不会

对了,使用这条指令,我们需要加上头文件<windows.h>,为了使用方便,我们需要定义一个宏

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

作用:判断一个键是否按下,一般都套在if

用法:KEY_DOWN(按键的值)

更多用法和按键值,请看这篇博客

一个例子:

#include<bits/stdc++.h>
#include<windows.h> //KET_DOWN所需头文件 
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int main() {
       while(1)
      {
           if(KEY_DOWN(VK_SPACE)) //如果按下空格 
          {
            cout<<"你摸了摸空格的头";
            Sleep(20)//等待20毫秒,减少CPU占用,可以去掉 
          }     
       }

       return 0;
}

获取鼠标坐标

实现这个效果前,需要定义一个变量POINT p;(如果POINT没有高亮,不要怀疑,这是正确的)

p是变量名,你可以随意更改,但下面默认为p,如果你更改了,请自动把下面的变量p转化为你设定的

接下来我们可以调用指令GetCursorPos(&p);,一样要提前加上头文件<windows.h>

作用:获取当前鼠标的坐标

格式:采用xy坐标显示,用p.x表示X坐标,p.y表示Y坐标

用法:先直接调用指令,然后调用p.x和p.y进行操作

更多用法请看这

一个例子:

#include<bits/stdc++.h>
#include<windows.h> //所需头文件 
using namespace std;
POINT p;
int main() {
    while(1)
    {
         GetCursorPos(&p);
         printf("x=%d y=%d",&p.x,&p.y);
         Sleep(500);//等待500毫秒,减少占用,可去掉  
    }
    return 0;
}

获取鼠标按下时的坐标

这个更简单,前提是你理解了以上两条,只需要先判断鼠标是否按下,如果是,则获取坐标

例子:

#include<bits/stdc++.h>
#include<windows.h> //所需头文件 
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) 
using namespace std;
POINT p;
int main() {
    while(1)
    {
        if(KEY_DOWN(VK_LBUTTON))
        {
           GetCursorPos(&p);
           printf("x=%d y=%d",&p.x,&p.y);
           Sleep(500);//等待500毫秒,减少占用,可去掉    
        }

    }
    return 0;
}

获取按钮覆盖范围坐标

一个字符画的坐标,我们该如何获取呢,其实我们可以移动鼠标,在按钮范围中乱按,然后将获取的鼠标坐标收集起来就可以了(按多几下尽量将按钮各个地方都点到)

判断鼠标按下按钮

难道我们要把收集的多个坐标一个个和鼠标对比吗?这也太费功夫了吧,设想一下,按钮就是一张地毯,鼠标就是自己,当自己在地毯中按钮将触发,离开地毯一点点都不行,这可以看出,判断具有单调性 ,只需要计算出按钮坐标的最大值最小值,在看鼠标是否在这个范围中即可

本人由于太蒻,刚开始是写纸上然后手算的,写这个文章时才想到,可以写代码

    while(1) {                              
        if(KEY_DOWN(VK_LBUTTON)) 
        {       
            GetCursorPos(&p);                   
            a[i]=p.x;
            b[i]=p.y;
            i++;
        }
        if(KEY_DOWN(VK_SPACE))//如果认为数据够了,按下空格开始求最大最小值
        {
            break;
        }
        Sleep(100);                             
    }
    sort(a,a+i);
    sort(b,b+i);
    cout<<"x="<<a[i-1]<<" "<<"x2="<<a[0]<<endl;//x,x2分别为x坐标的最大,最小值
    cout<<"y="<<b[i-1]<<" "<<"y2="<<b[0]<<endl;//同上

直接上代码

    bool sbpd(int x,int x2,int y,int y2)//判断鼠标坐标,x=最大,x2=最小,y同 
    {
        Sleep(10);
        GetCursorPos(&p);
        if(KEY_DOWN(VK_LBUTTON))
        {
          if(p.x<=x&&p.x>=x2&&p.y<=y&&p.y>=y2)return true;
          else return false;
        }

    }

END.

QVQ