基于easyx和C++实现的鼠标交互界面(点击按钮)| 系统设计

这篇具有很好参考价值的文章主要介绍了基于easyx和C++实现的鼠标交互界面(点击按钮)| 系统设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果一览:

鼠标精力界面点击,c++,交互,开发语言,课程设计,用户界面

当鼠标放上去后效果:

鼠标精力界面点击,c++,交互,开发语言,课程设计,用户界面

代码实现及详解:

#include<iostream>
using namespace std;
#include <graphics.h>
#include <windows.h>
#include <conio.h>
#include<string.h>
/*
* 使用easyx 制作的菜单界面
*/

// 定义菜单按钮的宽度和高度
const int BUTTON_WIDTH = 200;
const int BUTTON_HEIGHT = 50;

//总的操作数再加上1
#define operations 11

// 定义按钮的坐标和状态
struct Button {
    int x, y; // 按钮的左上角坐标
    bool isHovered; // 是否被鼠标悬停
};

void Clear_() {
    system("cls");
}

//函数声明
wchar_t* multiByteToWideChar(const string& pKey);
char* wideCharToMultiByte(wchar_t* pWCStrKey);
bool isInButtonArea(Button button, int x, int y);
void drawButton(Button button, string str);
void Show_str_to_PC(int x, int y, string str, int size);

int main() {
    //初始化窗口
    initgraph(640, 660);

    //载入背景图片
    IMAGE bg_image;
    loadimage(&bg_image, _T("schoolmap.jpg"), 640, 660); // 加载背景图片

    //绘制背景图
    putimage(0, 0, &bg_image);

    //操作数组
    string texts[operations - 1] = { "显示景点信息\0","查找景点\0","查找两个景点间的简单路径\0","查找所有路径\0","退出系统\0","添加景点\0","删除景点\0","修改景点信息\0","添加两个景点间的路径\0","删除两个景点间的路径\0" };
  
    //用来指定显示范围的变量
    RECT r;


    // 创建按钮数组
    Button* buttons = new Button[operations - 1];

    //初始化按钮
    for (int i = 0; i < operations - 1; i++) {
        buttons[i].isHovered = false;
        buttons[i].x = 220;
        buttons[i].y = 150 + i * 50;
    }

    //绘制背景图
    putimage(0, 0, &bg_image);

    
    // 循环处理消息
    while (true) {

        // 绘制界面      
        setbkmode(TRANSPARENT);
        settextstyle(45, 0, _T("宋体"), 0, 0, FW_BOLD, 0, 0, 0);
        settextcolor(WHITE);
        r = { 0,60, 639,120 };
        drawtext(_T("校园导游系统"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        r = { 0,100,639,160 };
        settextstyle(20, 0, _T("宋体"), 0, 0, FW_BOLD, 0, 0, 0);
        drawtext(_T("欢迎来到XXXX大学"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

        //遍历 画出按钮
        for (int i = 0; i < operations - 1; i++) {
            drawButton(buttons[i], texts[i]);
        }

        // 循环处理鼠标消息
        if (MouseHit()) {
            MOUSEMSG m = GetMouseMsg();
            switch (m.uMsg) {
            case WM_MOUSEMOVE:
                // 鼠标移动时判断是否在按钮区域内
                for (int i = 0; i < operations - 1; i++) {
                    buttons[i].isHovered = isInButtonArea(buttons[i], m.x, m.y);
                }
                break;
            case WM_LBUTTONUP:
                // 左键抬起时判断是否在按钮区域内
                for (int i = 0; i < operations - 1; i++) {
                    if (isInButtonArea(buttons[i], m.x, m.y)) {
                        switch (i) {//可以在各个case中添加对应的处理函数  
                        case 0:
                            Clear_();
                            cleardevice();//清理屏幕
                            cout << "显示景点信息" << endl;//这里可以用对应的函数绘制二级界面
                            break;
                        case 1:
                            Clear_();
                            cleardevice();
                            cout << "查找景点" << endl;
                            break;
                        case 2:
                            Clear_();
                            cleardevice();
                            cout << "查找两个景点间的简单路径" << endl;
                            break;
                        case 3:
                            Clear_();
                            cleardevice();
                            cout << "查找所有路径" << endl;
                            break;
                        case 4:
                            Clear_();
                            cleardevice();
                            cout << "退出系统" << endl;
                            break;
                        case 5:
                            Clear_();
                            cleardevice();
                            cout << "添加景点" << endl;
                            break;
                        case 6:
                            Clear_();
                            cleardevice();
                            cout << "删除景点" << endl;
                            break;
                        case 7:
                            Clear_();
                            cleardevice();
                            cout << "修改景点" << endl;
                            break;
                        case 8:
                            Clear_();
                            cleardevice();
                            cout << "添加景点路径" << endl;
                            break;
                        case 9:
                            Clear_();
                            cleardevice();
                            cout << "删除景点路径" << endl;
                            break;

                        }
                        putimage(0, 0, &bg_image);//重绘背景图
                    }

                }


            }
        }

        Sleep(10);//刷新频率
    }

    closegraph();
    return 0;
}


//作此界面可能需要的函数

/*wchart 转string 函数*/
char* wideCharToMultiByte(wchar_t* pWCStrKey)
{
    //第一次调用确认转换后单字节字符串的长度,用于开辟空间
    int pSize = WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), NULL, 0, NULL, NULL);
    char* pCStrKey = new char[pSize + 1];
    //第二次调用将双字节字符串转换成单字节字符串
    WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), pCStrKey, pSize, NULL, NULL);
    pCStrKey[pSize] = '\0';
    return pCStrKey;
}

/*string 转 wchar 函数*/
wchar_t* multiByteToWideChar(const string& pKey)
{
    const char* pCStrKey = pKey.c_str();
    //第一次调用返回转换后的字符串长度,用于确认为wchar_t*开辟多大的内存空间
    int pSize = MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, NULL, 0);
    wchar_t* pWCStrKey = new wchar_t[pSize];
    //第二次调用将单字节字符串转换成双字节字符串
    MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, pWCStrKey, pSize);
    return pWCStrKey;
}

// 判断是否在按钮区域内
bool isInButtonArea(Button button, int x, int y) {
    return (x >= button.x && x <= button.x + BUTTON_WIDTH
        && y >= button.y && y <= button.y + BUTTON_HEIGHT);
}

// 绘制按钮
void drawButton(Button button, string str) {
    if (button.isHovered) {
        setfillcolor(WHITE); settextcolor(RGB(59, 90, 166));
    }
    else {
        setfillcolor(RGB(59, 90, 166));
        settextcolor(WHITE);
    }
    fillroundrect(button.x, button.y, button.x + BUTTON_WIDTH, button.y + BUTTON_HEIGHT, 10, 10);
    RECT r = { button.x, button.y, button.x + BUTTON_WIDTH, button.y - 1 + BUTTON_HEIGHT - 1 };
    setbkmode(TRANSPARENT);
    settextstyle(20, 0, _T("微软雅黑"), 0, 0, FW_BOLD, 0, 0, 0);
    drawtext(multiByteToWideChar(str), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

//输出指定字符串到屏幕指定位置
void Show_str_to_PC(int x, int y, string str, int size) {
    setbkmode(TRANSPARENT);
    settextstyle(size, 0, _T("宋体"), 0, 0, FW_BOLD, 0, 0, 0);
    settextcolor(WHITE);
    outtextxy(x, y, multiByteToWideChar(str));
}


欢迎讨论!文章来源地址https://www.toymoban.com/news/detail-859840.html

到了这里,关于基于easyx和C++实现的鼠标交互界面(点击按钮)| 系统设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity手指、鼠标滑动实现物体360度旋转、点击按钮实现物体旋转

    先创建一个ObjectRotation 脚本 之后将该脚本拖动到需要转动的object上 因为如果每次都真机模拟回很麻烦,所以我加入了让鼠标代替手指滑动的脚本来代替手指输入 同样的也是先创建一个MouseRow 脚本 最后我还需要某笔画沿着坐标旋转,代码如下: 里面有我的其他参数,如果读

    2024年02月11日
    浏览(65)
  • 设计界面实现后台按键和鼠标点击操作

    写了一个在窗口后台按键和点击鼠标的界面。 目标功能:绑定窗口后,实现后台的按键和鼠标点击操作,并输出操作记录。 UI界面转换为python文件后的代码: 转换命令: 在cmd界面输入: 接下来,就是让这个界面能够工作。 大致流程是这样的: 先导入必要的模块。 继承UI界面

    2024年02月12日
    浏览(48)
  • 用Devc++与easyx一步一步做游戏[启动界面部分]-之按钮制作

    前面我们介绍了如何为dev c++配置好easyx,至于用easyx能够做一些什么呢?大用处我不敢说,用来学习了解消息机制还是不错的。这我们来实现一个简单的游戏启动界面的设计,主要是按钮的设计。总体设计好的效果如下: GIF截图看不到鼠标移动的效果,实际上这里是随着鼠标

    2024年01月15日
    浏览(48)
  • 【UE4】 通过按钮点击实现摄像机的切换 并通过鼠标控制新摄像机的旋转

    首先创建了4个Actor蓝图类 每个蓝图类内只拥有一个摄像机组件 将每个actor蓝图类摆放到场景的合适位置 在关卡蓝图中创建自定义事件,当该事件触发时切换摄像机 创建一个控件蓝图,在控件蓝图中创建如下5个按钮,并创建点击事件。按钮分别表示车上的4个镜头和车外自由

    2023年04月09日
    浏览(59)
  • unity把公共方法在Inspector 界面上实现一个按钮点击直接调用的最快最方便的方式

    在unity界面用显示的样式如下图: 没有参数的直接是一个按钮,有参数的会在下边加一个参数,点击Invoke按钮可以调用这个方法。 要实现上边的效果需要脚本继承MonoBehaviour,并且引用 using Sirenix.OdinInspector

    2024年02月16日
    浏览(47)
  • 精心打造:使用easyx做界面时,想要鼠标到一个按键时背景颜色发生改变

    我们在用easyx开发小的应用程序时(比如写表白程序doge),感觉很高级,但还要注意一些细节的东西以使我们的程序变得更完美,也让客户(或者你的女朋友)感觉到你的细心以及注意细节,不得不面临一些细节的难题。 这里要说的就是如何使鼠标与界面进行交互,包括以下

    2024年02月09日
    浏览(49)
  • C++实现【获取鼠标位置】以及控制鼠标【打开窗口并点击】

    获取鼠标位置的函数源代码来自:C++【认知系列】实时获取鼠标坐标_c++ 获取鼠标坐标_Zalamp的博客-CSDN博客 鼠标点击操作代码来自: C++控制鼠标移动到指定位置并且左键点击_c++鼠标移动_蜚语77的博客-CSDN博客 在特定程序中实现鼠标点击操作分为两步,第一步就是在任务栏点

    2024年02月12日
    浏览(45)
  • 【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库

                                            食用指南:本文在有C++基础的情况下食用更佳                                           🍀 本文前置知识: C++基础                                        ♈️ 今日夜电波:toge—あよ              

    2024年02月10日
    浏览(50)
  • C++实现贪吃蛇(含源代码)—基于easyx图形库

                                            食用指南:本文在有C++基础的情况下食用更佳                                           🍀 本文前置知识: C++基础                                        ♈️ 今日夜电波:toge—あよ              

    2024年02月09日
    浏览(46)
  • 【前端】element button鼠标点击按钮更改样式

    希望我的分享能够帮助到更多的人,如果觉得我的分享有帮助的话,请大家一键三连支持一下哦~ ❤️原创不易,期待你的关注与支持~ 点赞👍+收藏⭐️+评论✍️ 😊之后我会继续更新前端学习小知识,关注我不迷路~

    2024年03月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包