用c++做一个小按钮
用C++做一个珂爱的小按钮并点击
注意:本文的大前提是窗口位置固定不变,否则无效
按钮的制作
这个很简单,只需要如下,输出一行又一行的字符画(这个是可以自定义的),一个按钮就做好了
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<" ------- "<<endl;
cout<<" | 走人 | "<<endl;
cout<<" ------- "<<endl;
return 0;
}
按钮的交互
我们的按钮只是一个字符画,能有什么办法监测鼠标和它之间的交互呢?这个问题本蒟蒻也曾经提过,得到的回答是:
很简单,只要在鼠标按下时判断是否在按钮之内就行了 --某位大佬
那一刻,一个清晰的思维导图在我脑中闪过
画外音:明明是想了三天还问了人
- 判断鼠标按下
- 获取鼠标按下时的坐标
- 获取按钮覆盖范围坐标
- 将鼠标坐标和按钮覆盖范围坐标进行判断
判断鼠标按下
这需要用到一条指令,由于太过复杂,只需要知道作用和用法即可 实际上是我也不会
对了,使用这条指令,我们需要加上头文件<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