使用EasyX绘制一个按钮


这是一篇笔记,用于记录关于用Easy X绘制一个按钮得简单程序,本程序由网络上的 代码整理出。

文件

Widget.h

#pragma once

#include <graphics.h>

// 部件抽象基类
class Widget
{
public:
    Widget(int x = 0, int y = 0, int width = 100, int height = 60);
    void setRect(int x, int y, int width, int height);  // 设置控件矩形
    virtual void show() const = 0;                                                  // 显示函数
    int getX() const;
    int getY() const;
    int getWidth() const;
    int getHeight() const;
    void setX(int x);
    void setY(int y);
    void setWidth(int width);
    void setHeight(int height);

protected:
    int x;        // X 坐标
    int y;        // Y 坐标
    int width;    // 宽度
    int height;   // 高度
};

Widget.cpp

#include "Widget.h"

Widget::Widget(int x, int y, int width, int height) : x(x), y(y), width(width), height(height)
{
}

int Widget::getX() const
{
	// TODO: 在此处插入 return 语句
	return x;
}

int Widget::getY() const
{
	// TODO: 在此处插入 return 语句
	return y;
}

int Widget::getWidth() const
{
	// TODO: 在此处插入 return 语句
	return width;
}

int Widget::getHeight() const
{
	// TODO: 在此处插入 return 语句
	return height;
}

void Widget::setX(int x)
{
	this->x = x;
	show();
}

void Widget::setY(int y)
{
	this->y = y;
	show();
}

void Widget::setWidth(int width)
{
	this->width = width;
	show();
}

void Widget::setHeight(int height)
{
	this->height = height;
	show();
}

void Widget::setRect(int x, int y, int width, int height)
{
	this->x = x;
	this->y = y;
	this->width = width;
	this->height = height;
	show();
}

Button.h

#pragma once
#include "Widget.h"
#include <string>

// 按钮类
class Button :
    public Widget
{
public:
    Button(int x = 0, int y = 0, int width = 100, int height = 60, const std::wstring& text = L"按钮");
    void show() const;                      // 显示按钮
    bool state(const ExMessage& msg);       // 按钮状态,true 表示按钮按下
    const std::wstring& getText() const;    // 获取按钮文本
    void setText(const std::wstring& text); // 设置按钮文本

protected:
    bool isIn(const ExMessage& msg) const;  // 判断鼠标是否在按钮里面
    std::wstring text;                      // 按钮文本
    bool isChange;     // 按钮状态是否改变

public:
    //  关于按钮设计的一些变量
    int linestyle = PS_SOLID;        //线条样式
    int button_color = CYAN;        //按钮颜色
    int in_color = LIGHTBLUE;       //当鼠标在按钮上的颜色
    int click_clolor = LIGHTBLUE;  //当按下按钮时按钮的颜色
};

Button.cpp

#include "Button.h"

// 声明为外部变量,需要在其他源文件中定义
extern int linestyle;  
extern int button_color;
extern int in_color;
extern int click_clolor; 

Button::Button(int x, int y, int width, int height, const std::wstring& text) : Widget(x, y, width, height), text(text), isChange(false)
{
}

void Button::show() const
{
	// 设置样式
	setlinestyle(linestyle, 2);	//PS_SOLID是指一条由特定颜色的实线,该线的宽度由调用GDI API的参数所指定的宽度决定。
	//PS_SOLID通常用于创建线框,边框或其他需要绘制线条的图形元素
	setfillcolor(button_color);	//按钮的颜色
	settextstyle(25, 0, L"微软雅黑");

	// 绘制按钮
	fillrectangle(x, y, x + width, y + height);

	// 绘制文本
	RECT rect = { x, y, x + width, y + height };
	drawtext(text.c_str(), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

bool Button::state(const ExMessage& msg)
{
	if (msg.message == WM_MOUSEMOVE && isIn(msg))	// 按钮悬浮
	{
		// 设置样式
		setlinestyle(linestyle, 2);
		setfillcolor(in_color);	// 鼠标放上后按钮的颜色
		settextstyle(25, 0, L"微软雅黑");

		// 绘制按钮
		fillrectangle(x, y, x + width, y + height);

		// 绘制文本
		RECT rect = { x, y, x + width, y + height };
		drawtext(text.c_str(), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

		isChange = true;
		return false;
	}
	else if ((msg.message == WM_LBUTTONDOWN || msg.message == WM_LBUTTONUP) && isIn(msg))	// 按钮被点击
	{
		// 设置样式
		setlinestyle(linestyle, 2);
		setfillcolor(click_clolor);	// 鼠标按下后按钮的颜色
		settextstyle(25, 0, L"微软雅黑");

		// 绘制按钮
		fillrectangle(x, y, x + width, y + height);

		// 绘制文本
		RECT rect = { x, y, x + width, y + height };
		drawtext(text.c_str(), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

		isChange = true;
		return true;
	}
	else	// 在按钮状态改变的时候,恢复按钮原来的状态,防止屏闪
	{
		if (isChange)
		{
			show();
			isChange = false;
		}
		return false;
	}
}

const std::wstring& Button::getText() const
{
	// TODO: 在此处插入 return 语句
	return text;
}

void Button::setText(const std::wstring& text)
{
	this->text = text;
}

bool Button::isIn(const ExMessage& msg) const
{
	if (msg.x >= this->x && msg.x <= this->x + width && msg.y >= this->y && msg.y <= this->y + height)
	{
		return true;
	}
	return false;
}

示例

把以上文件包含在工程中就可以愉快地使用啦,以下是一个使用示例代码:
main.cpp

#include <conio.h>
#include "Button.h"

//按钮大小
#define W 150
#define H 40

Button* begin;
Button* end;
Button* exi;


int main() {

	//以下是一些基础设置
	initgraph(600, 400, EW_SHOWCONSOLE);//创建窗口并显示控制台
	setbkcolor(WHITE);//设置背景颜色
	setbkmode(TRANSPARENT);//处理字体背景
	setfillcolor(CYAN);//设置填充色,这里是浅青色
	setlinecolor(BLACK); //设置当前线条的颜色为黑色
	cleardevice();//显示背景颜色

	begin = new Button(200, 100, W, H, L"开始");
	end = new Button(200, 150, W, H, L"结束");
	exi = new Button(200, 200, W, H, L"退出");

	begin->show();
	end->show();
	exi->show();

	ExMessage msg;
	bool on = 1;
	while (on)
	{
		msg = getmessage();

		if (begin->state(msg))		// 查看学生
		{
			printf("Begin\n");
		}
		if (end->state(msg))		// 查看学生
		{
			printf("End\n");
		}
		if (exi->state(msg))		// 查看学生
		{
			exit(0);
		}
	}

	_getch();

	return 0;
}


效果图:

在这里插入图片描述
描述:当鼠标放在按钮上时会变色,按“开始”黑窗口上会输出begin,按“结束”会输出end,按“退出”会退出这个窗口,只剩下黑窗口(也可以在main.cpp中把initgraph()中的EW_SHOWCONSOLE去掉,这样就不会有黑窗口了)。

代码解释

1.Button(int x, int y, int width, int height, const std::wstring& text):类的构造函数,初始化按钮的位置和文本内容

2.vodi show() const override:重写了Widget类中的show()函数,用于绘制按钮;

3.bool state(const ExMessage& msg) override:重写了Widget类中的state()函数,用于处理按钮的状态和呈现效果;
4.const std::wstring& getText() const:返回按钮的文本内容;
5.void setText(const std::wstring& text):设置按钮的文本内容;
6.bool isIn(const ExMessage& msg) const:判断鼠标事件是否在该按钮中发生。

自定义按钮样式

Button.h中的:

//  关于按钮设计的一些变量
int linestyle = PS_SOLID;        //线条样式
int button_color = CYAN;        //按钮颜色
int in_color = LIGHTBLUE;       //当鼠标在按钮上的颜色
int click_clolor = LIGHTBLUE;  //当按下按钮时按钮的颜色

可以修改以上变量制作一个适合的按钮。
线条样式:

常量线条样式
PS_SOLID实线
PS_DASH短划线
PS_DOT点线
PS_DASHDOT短划线加点线
PS_DASHDOTDOT短划线加两个点线
PS_NULL没有线条相当于透明
PS_INSIDEFRAME在矩形框内画线,而不是在边缘上
PS_USERSTYLE使用自定义的线形样式
PS_ALTERNATE交替线

颜色:

常量颜色
BLACK
BLUE
GREEN绿
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY浅灰
DARKGRAY深灰
LIGHTBLUE亮蓝
LIGHTGREEN亮绿
LIGHTCYAN亮青
LIGHTRED亮红
LIGHTMAGENTA亮紫
YELLOW
WHITE
  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: C语言可以使用EasyX库来编写一个简单的登录界面。首先,需要在程序中引入EasyX库,并使用initgraph函数初始化绘图窗口。之后,可以使用line、rectangle等函数来绘制各种界面元素,并通过setbkcolor、settextstyle等函数设置背景颜色、文本样式等。 登录界面一般包括用户名、密码的输入框,以及登录按钮。可以使用outtextxy函数在指定位置输出文本,用inputbox函数获取用户输入的内容。 首先,需要绘制一个矩形作为登录框,可以使用rectangle函数绘制,然后使用outtextxy输出提示文字,使用inputbox获取用户输入的用户名和密码。 接下来,绘制登录按钮,可以使用rectangle函数绘制矩形按钮,并在按钮中间输出"登录"文字,设置按钮的点击事件。 在点击登录按钮之后,可以使用strcmp函数判断输入的用户名和密码是否正确,如果正确,则显示登录成功的弹窗,可以使用MessageBox函数实现,否则显示登录失败的弹窗。 最后,可以使用closegraph函数关闭绘图窗口,完成登录界面的编写。 需要注意的是,EasyX库的使用需要在支持BGI图形库的编译器下进行,例如Dev-C++、Code::Blocks等。而且,此方法只是实现了简单的登录界面,如需实现更完整、实用的登录功能,还需要结合数据库等相关知识进行设计和开发。 ### 回答2: 使用C语言编写一个登录界面,可以结合EasyX图形库实现图形化界面。以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <graphics.h> #include <conio.h> #include <string.h> #define MAX_USERNAME 20 // 最大用户名长度 #define MAX_PASSWORD 20 // 最大密码长度 // 用于存储输入的用户名和密码 char username[MAX_USERNAME]; char password[MAX_PASSWORD]; // 验证用户名和密码是否正确的函数 int verifyLogin(char *username, char *password) { // 这里可以根据实际需求编写验证逻辑,比如判断用户名密码是否匹配 // 返回1表示验证通过,0表示验证失败 // 示例代码直接将用户名和密码都设置为admin if (strcmp(username, "admin") == 0 && strcmp(password, "admin") == 0) { return 1; } else { return 0; } } int main() { // 初始化图形界面 initgraph(400, 300); // 设置图形窗口大小 // 绘制登录界面 setbkcolor(WHITE); // 设置背景色为白色 cleardevice(); // 清屏 // 绘制输入框 setfillcolor(LIGHTGRAY); // 设置输入框背景色为浅灰色 bar(100, 100, 300, 130); // 绘制输入框矩形 rectangle(100, 100, 300, 130); // 绘制输入框边框 // 绘制登录按钮 setfillcolor(LIGHTBLUE); // 设置按钮颜色为浅蓝色 bar(140, 160, 260, 190); // 绘制按钮矩形 rectangle(140, 160, 260, 190); // 绘制按钮边框 settextcolor(BLACK); // 设置文字颜色为黑色 outtextxy(190, 170, "登录"); // 绘制按钮上的文字 // 循环接受用户的输入 while (1) { // 检查鼠标是否点击了登录按钮 if (MouseHit()) { MOUSEMSG msg = GetMouseMsg(); if (msg.x >= 140 && msg.x <= 260 && msg.y >= 160 && msg.y <= 190) { // 用户点击了登录按钮,则进行验证 if (verifyLogin(username, password)) { // 验证通过,提示登录成功并退出循环 outtextxy(150, 220, "登录成功!"); break; } else { // 验证失败,提示登录失败 outtextxy(150, 220, "登录失败,请重新输入!"); } } } // 读取键盘输入的用户名和密码 if (_kbhit()) { char ch = _getch(); if (ch == '\r') { // 用户输入回车表示输入结束 break; } else if (ch == '\b') { // 用户输入退格删除上一个字符 if (strlen(username) > 0) { username[strlen(username) - 1] = '\0'; // 清除输入框 setfillcolor(WHITE); bar(101, 101, 299, 129); } } else if (strlen(username) < MAX_USERNAME - 1) { strncat(username, &ch, 1); // 显示输入的字符到输入框上 settextcolor(BLACK); outtextxy(110 + 8 * strlen(username), 110, "*"); } } } // 关闭图形界面 closegraph(); return 0; } ``` 这个示例代码实现了一个简单的登录界面,用户可以点击登录按钮进行验证,用户名和密码默认设置为"admin"。 ### 回答3: C语言使用EasyX编写一个登录界面可以通过以下步骤实现: 1. 首先,自行安装EasyX图形库,并在代码中引入EasyX的头文件。 2. 在主函数main()中,设置窗口的大小、标题等属性,并调用initgraph()函数初始化绘图环境。 3. 在窗口上绘制登录界面的各个元素,例如用户名、密码文本框、登录按钮等。可以使用图形库提供的绘图函数,如outtext()、rectangle()等。 4. 使用inputbox()函数获取用户输入的用户名和密码。该函数可以在登录界面中的文本框处显示一个输入框,用户输入的内容即为返回值。 5. 给登录按钮添加鼠标点击事件的监听器,当用户点击登录按钮时,触发相应的事件处理函数。 6. 在事件处理函数中,可以进行用户名和密码的验证。可以使用strcmp()函数比较输入的用户名和密码与预设的正确值是否一致,或者将用户输入的用户名密码与数据库中的值进行对比。 7. 根据验证的结果,可以在界面上显示相应的提示信息,例如登录成功或者登录失败。 8. 最后,使用closegraph()函数关闭图形绘制环境,释放资源。 需要注意的是,由于C语言本身对图形操作的支持有限,使用EasyX的图形库能够更加方便地实现图形界面的绘制和交互,使得界面更加美观和友好。同时,登录界面的实现还涉及到用户输入的获取、事件处理等细节,需要细心设计和编写

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值