热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C++】基于Easyx的UI库(2022821V1)

【C++】基于Easyx的UI库(20

系列文章目录

【C++】基于Easyx的UI库(2022-8-14 V1)

【C++】基于Easyx的UI库(2022-8-14 V2)


简介

实现语言:C++

项目名称:UI.h

项目类型:控制台应用

项目版本:2022-8-21 V1

开发环境:Visual Studio 2022 Community 17.3.1  &  Easyx 2022-6-10


这里就不再写项目介绍了(因为根本就没啥好写的)。


更新历史
  • 2022-8-21 增加文本框(Text Box)
  • 2022-8-18 优化已有的控件
  • 2022-8-14 优化已有的控件,将init()初始化函数改为构造函数;增加复选框(Checked List Box)
  • 2022-8-13 增加单选框(Check Box),优化按钮(Button)和文本(Label)
  • 2022-8-7 完成按钮(Button)和文本(Label)
  • 2022-8-5 创建UI.h

代码

UI.h

/*************************************************************** * * * UI.h * * UI Library for C++ Base on Easyx. * * Version : 2022-8-21 V1 * * https://easyx.cn * * https://blog.csdn.net/qq_43546083?spm=1000.2115.3001.5343 * * * ***************************************************************/ #pragma once #if __has_include() #include namespace UI { /**** 按钮 ****/ class Button { private: int width = 0, height = 0; public: /**** 控件左上角的x坐标 ****/ int x = 0, /**** 控件左上角的y坐标 ****/ y = 0; /**** 控件所显示的文本 ****/ LPTSTR text = new wchar_t[1024]; /**** 控件显示的文本高度 ****/ int size = 16; /**** 控件是否可见,可见为true,否则为false ****/ bool visible = false; /**** 构造函数,初始化控件左上角的坐标、宽度、高度、显示的文本与文本的高度(默认为16) ****/ Button(int x, int y, int width, int height, LPCTSTR text, int size = 16) { this->x = x; this->y = y; this->width = width; this->height = height; lstrcpy(this->text, text); this->size = size; return; } /**** 显示控件,成功返回true,出现异常返回false ****/ bool show() { if (visible) { //当前控件可见 return false; } int temp = getbkmode(); setbkmode(TRANSPARENT); LOGFONT* temp1 = new LOGFONT(); LOGFONT* temp2 = new LOGFONT(); gettextstyle(temp1); gettextstyle(temp2); temp2->lfHeight = size; settextstyle(temp2); if (width - textwidth(text) <= 0 || height - textheight(text) <= 0) { //文字过大 settextstyle(temp1); return false; } fillrectangle(x, y, x + width - 1, y + height - 1); outtextxy(x + (width - textwidth(text)) / 2, y + (height - textheight(text)) / 2, text); settextstyle(temp1); setbkmode(temp); delete temp1; delete temp2; visible = true; return true; } /**** 隐藏控件 ****/ void hide() { clearrectangle(x, y, x + width - 1, y + height - 1); visible = false; return; } /**** 判断按钮是否被按下,被按下返回true,没有按下或出现异常返回false ****/ bool click(ExMessage m) { if (!visible) { //当前控件不可见 return false; } return m.message == WM_LBUTTONDOWN && (m.x >= x && m.x <= x + width - 1) && (m.y >= y && m.y <= y + height - 1); } /**** 刷新插件(显示状态下) ****/ void reload() { visible = false; show(); return; } ~Button() { text = nullptr; delete[] text; return; } }; /**** 文本(该控件为自动调整大小) ****/ class Label { private: int width, height; public: /**** 控件左上角的x坐标 ****/ int x = 0, /**** 控件左上角的y坐标 ****/ y = 0; /**** 控件所显示的文本 ****/ LPTSTR text = new wchar_t[1024]; /**** 控件显示的文本高度 ****/ int size = 16; /**** 控件是否可见,可见为true,否则为false ****/ bool visible = false; /**** 构造函数,初始化控件左上角的坐标、显示的文本与文本的高度(默认为16) ****/ Label(int x, int y, LPCTSTR text, int size = 16) { this->x = x; this->y = y; lstrcpy(this->text, text); this->size = size; width = 0; height = 0; return; } /**** 显示控件,成功返回true,出现异常返回false ****/ bool show() { if (visible) { //当前控件可见 return false; } int temp = getbkmode(); setbkmode(TRANSPARENT); LOGFONT* temp1 = new LOGFONT(); LOGFONT* temp2 = new LOGFONT(); gettextstyle(temp1); gettextstyle(temp2); temp2->lfHeight = size; settextstyle(temp2); outtextxy(x, y, text); width = textwidth(text); height = textheight(text); settextstyle(temp1); delete temp1; delete temp2; setbkmode(temp); visible = true; return true; } /**** 隐藏控件 ****/ void hide() { clearrectangle(x, y, x + width - 1, y + height - 1); visible = false; return; } /**** 刷新插件(显示状态下) ****/ void reload() { visible = false; show(); return; } ~Label() { text = nullptr; delete[] text; return; } }; /**** 勾选框(该控件为自动大小) ****/ class CheckBox { private: //勾选框=按钮+文本 Button* button; Label* label; public: /**** 控件左上角的x坐标 ****/ int x = 0, /**** 控件左上角的y坐标 ****/ y = 0; /**** 控件所显示的文本 ****/ LPTSTR text = new wchar_t[1024]; /**** 是否已被勾选 ****/ bool state = false; /**** 构造函数,初始化控件左上角的坐标与显示的文本 ****/ CheckBox(int x, int y, LPCTSTR text) { this->x = x; this->y = y; lstrcpy(this->text, text); button = new Button(x, y, 18, 18, L""); label = new Label(x + 20, y, text, 18); return; } /**** 显示控件,成功返回true,出现异常返回false ****/ bool show() { if (!button->show() || !label->show()) { //当前控件可能可见 hide(); return false; } return true; } /**** 隐藏控件 ****/ void hide() { button->hide(); label->hide(); return; } /**** 控件是否被勾选,按下则切换效果,出现异常返回false ****/ bool check(ExMessage m) { if (!(button->visible && label->visible)) { //当前控件不可见 return false; } if (button->click(m)) { state = !state; state ? lstrcpy(button->text, L"√") : lstrcpy(button->text, L""); reload(); } return true; } /**** 刷新插件(显示状态下) ****/ void reload() { button->reload(); label->reload(); return; } ~CheckBox() { text = nullptr; button = nullptr; label = nullptr; delete[] text; delete button; delete label; return; } }; /**** 复选框(最多15项,该控件为自动大小) ****/ class CheckedListBox { private: int num = 0; public: //复选框=多个勾选框 CheckBox* checkbox[15] = { nullptr }; /**** 控件左上角的x坐标 ****/ int x = 0, /**** 控件左上角的y坐标 ****/ y = 0; /**** 构造函数,初始化控件左上角的坐标与显示的文本 ****/ CheckedListBox(int x, int y, int num, LPCTSTR text[]) { this->x = x; this->y = y; if (num > 15) { MessageBox(0, L"项数过多!", L"UI.h", MB_OK | MB_ICONSTOP); return; } this->num = num; for (int i = 0; i x = checkbox[0].x - 5; this->y = checkbox[0].y - 5; if (num > 15) { MessageBox(0, L"项数过多!", L"UI.h", MB_OK | MB_ICONSTOP); return; } this->num = num; for (int i = 0; i checkbox[i] = &checkbox[i]; } } /**** 显示控件,成功返回true,出现异常返回false ****/ bool show() { int maxlen = 0; for (int i = 0; i text)); if (!checkbox[i]->show()) { for (int j = 0; j hide(); return false; } } } rectangle(x, y, x + maxlen + 30, y + num * 20 + 8); return true; } /**** 隐藏控件 ****/ void hide() { for (int i = 0; i hide(); return; } /**** 控件是否被勾选,按下则切换效果,出现异常返回false ****/ bool check(ExMessage m) { for (int i = 0; i check(m))return false; } return true; } /**** 刷新插件(显示状态下) ****/ void relad() { for (int i = 0; i reload(); return; } ~CheckedListBox() { for (int i = 0; i x = x; this->y = y; this->width = width; this->height = height; lstrcpy(text, L" "); button = new Button(x, y, width, height, L""); label = new Label(x + 5, y + 3, L""); return; } /**** 显示控件,成功返回true,出现异常返回false ****/ bool show() { if (!button->show() || !label->show()) { hide(); return false; } return true; } /**** 隐藏控件 ****/ void hide() { button->hide(); label->hide(); return; } /**** 刷新插件(显示状态下) ****/ void reload() { button->reload(); label->reload(); return; } /**** 输入文本 ****/ void in() { ExMessage m; int count = -1; size_t len = 0; bool state = false; while (true) { m.message = 0; peekmessage(&m, EM_MOUSE | EM_CHAR); if (m.message == WM_LBUTTONDOWN) { if (!button->click(m)) { state = false; goto End; } state = true; } else if (m.message == WM_CHAR && state) { len = wcslen(label->text); switch (m.ch) { case '\b': if (len > 0) { label->text[len - 1] = 0; clearrectangle(x + 1 + textwidth(label->text), y + 3, x + width - 2, y + height - 4); lstrcpy(text, label->text); label->reload(); } break; case '\n': case '\r': state = false; goto End; break; default: label->text[len++] = m.ch; label->text[len] = 0; if (textwidth(label->text) text[--len] = 0; clearrectangle(x + 5 + textwidth(label->text), y + 3, x + 5 + textwidth(label->text), y + height - 4); label->text[len++] = m.ch; lstrcpy(text, label->text); label->reload(); } else { label->text[--len] = 0; } break; } } count = (count + 1) % 64; if (count <32 && state) line(x + 5 + textwidth(label->text), y + 3, x + 5 + textwidth(label->text), y + height - 4); else if (state) clearrectangle(x + 5 + textwidth(label->text), y + 3, x + 5 + textwidth(label->text), y + height - 4); Sleep(10); } End: clearrectangle(x + 5 + textwidth(label->text), y + 3, x + 5 + textwidth(label->text), y + height - 4); return; } ~TextBox() { delete button; delete label; return; } }; } #else #error 请先安装Easyx库,下载地址:https://easyx.cn #endif

今天上一个例子:

text.cpp

#include "UI.h" int main() { initgraph(640, 480); settextcolor(BLACK); setlinecolor(BLACK); setbkcolor(RGB(240, 240, 240)); cleardevice(); UI::TextBox textbox(5, 5, 200); textbox.show(); int width = 0; while (true) { width = textwidth(textbox.text); textbox.in(); clearrectangle(10, 40, 20 + width, 56); outtextxy(10, 40, textbox.text); } }

运行效果:

UI.h 2022-8-21 V1版本 效果


溜了,拜拜!


推荐阅读
  • 点击后defaultEducation的值明明改变了,但props传给子组件却watch不到 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • #include<iostream>usingnamespacestd;intmain(){HereIseperatemynumberbe ... [详细]
  • 我正在尝试将Firebase添加到涉及添加以下内容的现有应用程序中:classpath'com.googl ... [详细]
  • UsingPMA-2.5.2-rc2onPHP-4.1.2andnothavingDROPTABLEprivilege,whenI-sel ... [详细]
  • 前端库Bootstrap框架:「11]使用 span 创建行内元素
    前端库Bootstrap框架:「11]使用 span 创建行内元素 ... [详细]
  • 本篇文章为大家展示了input语句的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML标签 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
author-avatar
123AJAgjt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有