(水一期)
#ifndef BUTTON_H
#define BUTTON_H
#include
#include
#include
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
namespace All{
namespace Button{
void noedit(){
HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin,&mode);
mode&=~ENABLE_QUICK_EDIT_MODE;
mode&=~ENABLE_INSERT_MODE;
mode&=~ENABLE_MOUSE_INPUT;
SetConsoleMode(hStdin,mode);
}
namespace ColorTable{
const int BULE=1;const int GREEN=2;
const int SBULE=3;const int RED=4;
const int PURPLE=5;const int YELLO=6;
const int WHITE=7;const int ASH=8;
const int SBBULE=9;const int BGREEN=10;
const int BBULE=11;const int SRED=12;
const int SPURPLE=13;const int BYELLO=14;
const int BWHITE=15;const int BLACK=16;
}
class Button{
int x;int y;int c;const char *n;int pc=-1;int pc_=-1;
void GetPos(POINT &pt){
HWND hwnd=GetForegroundWindow();
GetCursorPos(&pt);
ScreenToClient(hwnd,&pt);
pt.y=pt.y/16,pt.x=pt.x/16;
}
void gto(int x,int y){
COORD pos;pos.X=y*2;pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int ForgC, int BackC){
WORD wColor=((BackC&0x0F)<<4)+(ForgC&0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
}
public:
Button(){}
Button(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
}
void New(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
gto(x,y);
for(int i=0;i<(int)strlen(n);i++)
printf(" ");
x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
}
bool press(int q,int h){
POINT pt;
GetPos(pt);
if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)&&kd(VK_LBUTTON)){
gto(x,y);
color(c,pc);
std::printf("%s",n);
color(q,h);
return 1;
}
return 0;
}
bool touch(int q,int h){
POINT pt;
GetPos(pt);
if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)){
gto(x,y);
color(c,pc_);
std::printf("%s",n);
color(q,h);
return 1;
}
return 0;
}
void out(){
gto(x,y);
color(c,ColorTable::BLACK);
printf("%s",n);
}
};
}
}
#endif
让我们慢慢看......
#ifndef BUTTON_H
#define BUTTON_H
#include
#include
#include
1~2行是一个只让头文件包含一次的方法之一,详情见c++游戏小技巧4:可用鼠标点击的按钮_L('ω')┘脏脏包└('ω')」的博客-CSDN博客
看看就好,它的文章好是好,就是太水了,它的三篇=我的一篇
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
这里是多余的,(是故意的)。
namespace All{
namespace Button{
定义了两个命名空间(All和Button)
有时候程序会卡住,必须要按回车程序才会输出,
其实这是由于命令行窗口的快速编辑模式导致
void noedit(){
HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin,&mode);
mode&=~ENABLE_QUICK_EDIT_MODE;
mode&=~ENABLE_INSERT_MODE;
mode&=~ENABLE_MOUSE_INPUT;
SetConsoleMode(hStdin,mode);
}
创造了一个函数,作用是关掉快速编辑模式。(不然会有Bug)
namespace ColorTable{
const int BULE=1;const int GREEN=2;
const int SBULE=3;const int RED=4;
const int PURPLE=5;const int YELLO=6;
const int WHITE=7;const int ASH=8;
const int SBBULE=9;const int BGREEN=10;
const int BBULE=11;const int SRED=12;
const int SPURPLE=13;const int BYELLO=14;
const int BWHITE=15;const int BLACK=16;
}
定义了一个命名空间ColorTable,里面是一些值(颜色)。
class Button{
int x;int y;int c;const char *n;int pc=-1;int pc_=-1;
定义了一个类(Button),有一系列成员:
x//x,y//y
c//字的颜色
n//字的内容
pc//按下的颜色
pc_//碰到的颜色
void GetPos(POINT &pt){
HWND hwnd=GetForegroundWindow();
GetCursorPos(&pt);
ScreenToClient(hwnd,&pt);
pt.y=pt.y/16,pt.x=pt.x/16;
}
获取鼠标相对于窗口的位置(想不明白为什么/16就去掉试试)
void gto(int x,int y){
COORD pos;pos.X=y*2;pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
移动到y+1行x+1列,(不要问为什么)
void color(int ForgC, int BackC){
WORD wColor=((BackC&0x0F)<<4)+(ForgC&0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
}
设置颜色,ForgC是字体色,BackC是背景色。
public:
Button(){}
Button(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
}
55行是一个关健字,不知道的可以去搜搜。
56行是一个构造函数,(防止不构造报错)。
57行还是一个构造函数,是初始化变量的。
void New(int x_,int y_,int color,const char *neiron,int pcolor=-1,int tcolor=-1){
gto(x,y);
for(int i=0;i<(int)strlen(n);i++)
printf(" ");
x=x_,y=y_,c=color,pc=pcolor;n=neiron;pc_=tcolor;
}
就重新构造了一遍吗,很简单。
bool press(int q,int h){
POINT pt;
GetPos(pt);
if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)&&kd(VK_LBUTTON)){
gto(x,y);
color(c,pc);
std::printf("%s",n);
color(q,h);
return 1;
}
return 0;
}
bool touch(int q,int h){
POINT pt;
GetPos(pt);
if(pt.y==x&&(pt.x>=y&&pt.x<=(int)y+(int)strlen(n)/2)){
gto(x,y);
color(c,pc_);
std::printf("%s",n);
color(q,h);
return 1;
}
return 0;
}
press是检测是否按下按钮,touch是检查是否碰到按钮。
void out(){
gto(x,y);
color(c,ColorTable::BLACK);
printf("%s",n);
}
输出按钮。
};
}
}
#endif
为了对印上面的括号。
c++游戏小技巧4:可用鼠标点击的按钮_L('ω')┘脏脏包└('ω')」的博客-CSDN博客
哎,废了这么大劲,您能给我点个赞吗?
(如有疑惑评论或私信,大家一起学习!)
@L('ω')┘脏脏包└('ω')」(不错)