自定义Button按钮

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();
    }
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值