button.h
#include <functional>
#include <iostream>
#include <map>
using namespace std;
struct Position {
int x;
int y;
};
// 定义Button类,表示一个按钮
class Button
{
public:
// 定义回调接口
using ClickListener = std::function<void()>;
using CallBack = std::function<void()>;
Button(int x, int y, int width, int height, const string& text);
// 析构函数声明
~Button();
//实时检查
void upDate();
//按钮状态
enum class State
{
Active,//可选
Passive,//未选
Selected//选中中
};
//按钮事件类型
enum class EventType {
LongClick,//长按 osg
Click,//点击
Hover,//悬停
MouseDown,//按下
MouseUp//抬起
};
State getState() const;
void setState(State state);
bool isInsideButton(Position value);//坐标是否在按钮范围内
//点击按钮操作
void onClick();
//注册事件处理函数
void registerEventHandler(EventType eventType, const ClickListener& CallBack);
//分发事件
void dispatchEvent(EventType eventType);
bool checkMouseOver(Position value);
Position getMousePosition();
void setMousePosition(Position value);
void setPressed(bool pressed);//设置按下按钮
bool getPressed();
void setHidden(bool value);//设置是否隐藏按钮
bool getHidden();
void setEnabled(bool value);//启用或禁用按钮
bool getEnabled();
bool checkLeave(Position value);
void draw();//绘制这个按钮
string getText();
void setText(string text);
Position getPosition() const;
void setPosition(Position value);
int getBackgroundColor();
void setBackgroundColor(int color);
string getBackgroundImage();
void setBackgroundImage(string image);
int getTextColor();
void setTextColor(int color);
float getTextSize();
void setTextSize(float size);
private:
Position point;
int width; // 按钮宽度
int height; // 按钮高度
string text; //按钮的文本
float scale; // 缩放比例,用于实现鼠标悬停效果
bool isMouseOver; // 鼠标是否在按钮上方
bool isClicked; // 是否点击按钮
bool isPressed;//按钮是否被按下。
bool isFocused;//按钮是否获得焦点。
bool hidden;//按钮是否可见
bool enabled;//按钮是否可用
bool isClick;//是否点击按钮
bool isLeave;//鼠标离开按钮
float textSize;//文本大小
int textColor;//文本颜色
string backgroundImage;//背景图片
int backgroundColor;//背景颜色
ClickListener clickListener;//点击回调接口
// map<EventType, EventHandler> eventHandlers;
map<EventType, function<void()>> eventHandlers;
};
button.cpp
#include "button.h"
#include <iostream>
Button::Button(int x, int y, int width, int height, const string& text)
: point{x,y}, width(width), height(height), text(text), scale(1.0f), isMouseOver(false), isClicked(false){
}
Button::~Button(){
cout << "Person的析构函数调用" << endl;
}
//获取按钮状态
Button::State Button::getState() const {
if (isClicked) {
return State::Selected;
}
else if (isMouseOver) {
return State::Active;
}
else {
return State::Passive;
}
}
//设置按钮状态
void Button::setState(State f_state) {
switch (f_state) {
case State::Active:
isClicked = false; // 按钮处于激活状态,不被选择
isMouseOver = true; // 假设鼠标悬停于按钮上
break;
case State::Selected:
isClicked = true; // 按钮被选择
isMouseOver = false; // 按钮不再悬停于鼠标上
break;
case State::Passive:
isClicked = false; // 按钮处于被动状态,不被选择
isMouseOver = false; // 按钮不悬停于鼠标上
break;
default:
break;
}
}
//检查是否在按钮的范围之内
bool Button::isInsideButton(Position value) {
return (value.x >= point.x && value.x <= point.x + width && value.y >= point.y && value.y <= point.y + height);
}
//点击按钮操作
void Button::onClick() {
//如果在按钮上方,泽聚焦
if (isMouseOver) {
isMouseOver = false; // 事件已经处理完毕,不再处于按钮上方或鼠标悬停状态
scale = 1.0f;
if(clickListener){
clickListener();
}
}
}
// 检查鼠标是否在按钮上方,在上方就聚焦
bool Button::checkMouseOver(Position position) {
isMouseOver =isInsideButton(position);
if (isMouseOver) {
scale = 0.9f; // 时缩放按钮
}
else {
scale = 1.0f; // 恢复按钮原始大小
}
return isMouseOver;
}
//
bool Button::checkLeave(Position value){
isMouseOver = isInsideButton(value);
if (isMouseOver) {
scale = 0.9f; // 时缩放按钮
}
else {
scale = 1.0f; // 恢复按钮原始大小
}
return isMouseOver;
}
// 注册函数事件
void Button::registerEventHandler(EventType eventType, const CallBack& listener) {
eventHandlers[eventType] =listener;
}
// 派发事件
void Button::dispatchEvent(EventType eventType) {
if (eventHandlers.find(eventType) != eventHandlers.end()) {
eventHandlers[eventType]();
}
}
//设置按钮是否按下
void Button::setPressed(bool pressed){
isPressed = pressed;
}
//获取按钮是否按下
bool Button::getPressed(){
return isPressed;
}
//设置按钮是否展示
void Button::setHidden(bool value){
hidden = value;
}
bool Button::getHidden(){
return hidden;
}
//设置按钮是否可用
void Button::setEnabled(bool value){
enabled = value;
}
bool Button::getEnabled(){
return enabled;
}
//设置按钮文本
void Button::setText(string text){
Button::text = text;
}
string Button::getText(){
return text;
}
//设置按钮位置
void Button::setPosition(Position value){
Button::point.x = value.x;
Button::point.y = value.y;
}
Position Button::getPosition() const{
return Button::point;
}
//设置背景颜色
void Button::setBackgroundColor(int color){
Button::backgroundColor = color;
}
int Button::getBackgroundColor(){
return backgroundColor;
}
//设置背景图片
void Button::setBackgroundImage(string image){
Button:backgroundImage = image;
}
string Button::getBackgroundImage(){
return backgroundImage;
}
// 设置文本颜色
void Button::setTextColor(int textColor){
Button::textColor = textColor;
}
int Button::getTextColor(){
return textColor;
}
//设置字体大小
float Button::getTextSize(){
return textSize;
}
void Button::setTextSize(float size){
textSize = size;
}
//使用绘图函数(如GDI或OpenGL等)来绘制按钮的外观,包括按钮的边框、填充颜色、文本等
void Button::draw() {
int scaledWidth = width * scale; // 缩放后的按钮宽度
int scaledHeight = height * scale; // 缩放后的按钮高度
int scaledX = point.x + (width - scaledWidth) / 2; // 缩放后的按钮x坐标
int scaledY = point.y + (height - scaledHeight) / 2; // 缩放后的按钮y坐标
cout << "绘制" << endl;
if (isMouseOver) {
// 鼠标悬停时按钮边框颜色
// 鼠标悬停时按钮填充颜色
}
else {
// 按钮边框颜色
// 按钮填充颜色
}
}
Position Button::getMousePosition(){
Position position ;
position.x=10;
position.y=9;
return position;
}
void setMousePosition(Position value){
}
//这个函数一直被循环更新
void Button::upDate() {
//获取鼠标位置
Button:Position position;
position = getMousePosition();
cout << "鼠标位置x"<<position.x<<"鼠标位置y"<<position.y << endl;
//更新鼠标位置
// setMousePosition(position);
// 检测鼠标悬浮
// checkMouseOver(position);
//检测鼠标按下
draw();
}
main.cpp
#include "main.h"
#include "button.cpp"
void onClick() {
std::wcout << L"Button clicked!" << std::endl;
}
void onHover() {
std::wcout << L"Button Hover!" << std::endl;
}
void onMouseDown() {
std::wcout << L"Button MouseDown!" << std::endl;
}
void onMouseUp() {
std::wcout << L"Button MouseUp!" << std::endl;
}
void LongClick() {
std::wcout << L"Button LongClicked!" << std::endl;
}
int main() {
Button myButton(10, 10, 100, 30, "Click Me");
// 注册 MouseUp 事件
myButton.registerEventHandler(Button::EventType::MouseUp,onMouseUp );
// 注册 MouseUp 事件
myButton.registerEventHandler(Button::EventType::Hover,onHover);
// 注册 MouseUp 事件
myButton.registerEventHandler(Button::EventType::MouseDown, onMouseDown);
// 注册 MouseUp 事件
myButton.registerEventHandler(Button::EventType::Click,onClick);
// 注册 MouseUp 事件
myButton.registerEventHandler(Button::EventType::LongClick,LongClick);
myButton.getPosition();
Position position;
position.x = 15;
position.y = 15;
if (myButton.checkMouseOver(position)) {
myButton.dispatchEvent(Button::EventType::MouseUp);
myButton.dispatchEvent(Button::EventType::LongClick);
myButton.dispatchEvent(Button::EventType::Click);
myButton.dispatchEvent(Button::EventType::Hover);
myButton.dispatchEvent(Button::EventType::MouseDown);
}
return 0;
for (int i = 0; i < 10; i++)
{
myButton.upDate();
}
}