使用 EasyX 实现 UI 原理教程(章三 基础 UI 程序的结构与基础按钮)

返回:本文目录

正文

在开始第三章的学习之前,我们先来理解几个概念:

1. 父与子

如上图所示,Form 1 窗口下有一 LineText 3 控件与 Button 2 控件,假设 LineText 3 与 Button 2 是 Form1 下一控件,那么我们便说 Form 1 是 LineText 3 与 Button 2 的“父亲”,相对的 LineText 3 与 Button 2 我们叫做“儿子”,专业点说 LineText 3 与 Button 2 是 Form 1 的子控件,Form 1 是 Button 2 与 LineText 3 的父窗口。

2. 事件(Event)

如果你有略微接触过 Win32 Api 的话,你肯定知道“事件”的概念,事件,简单来说就是用户的任意交互(例如:点击鼠标,移动鼠标,按下键盘)

...

使用 EasyX 实现 UI 原理教程(章二 绘图单元)

返回:本文目录

布局在一个界面上的形形色色的控件我们都可以叫他为一个单元 ( cell )。

如上图所示,任意一个控件(不论它是否能与用户发生交互,图形规律与否)都是一个单元, 上一篇文章 我们已经学会了触发器以及相关实现,那么,我们将一个控件比作一个动物细胞,我们可以说触发器是细胞核,而绘图单元则是细胞膜,两者缺一不可,触发器负责处理用户点击,而绘图单元则负责展示画面。

接下来,我们将上一篇文章所写的触发器封装为 “trigger.h”(文件内容上一章已标注),然后再来开始今天的代码学习,由刚刚的介绍我们知道,绘图单元是负责将控件画出来的,所以不同的控件要拥有不同的绘图单元,那么我们首先创建一个根据图形贴图的绘图单元,因为绘图单元和触发器缺一不可,所以我们的绘图单元要派生于异形触发器 "geometry_trigger" 类。

接下来,我们来大概设计一下一个基础的贴图绘图单元:

这边解释

...

使用 EasyX 实现 UI 原理教程(章一 触发器)

返回:本文目录

触发器是判断鼠标是否浮动到控件上的判断器,分为两大类:

1. 异形触发器。

2. 矩形触发器。

先说矩形触发器吧。

如上图,这是一个使用 fillreactangle 函数画出来的矩形,这个时候让你想办法判断鼠标是否点击了该矩形,你一定会想到,用鼠标 x、y 坐标与矩形 x、y 坐标和长、宽来解决,确实这是一个方法,这里放一下伪代码:

// 伪代码
如果 (鼠标_x >= 矩形_x && 鼠标_x <= 矩形_x + 矩形长 &&
	  鼠标_y >= 矩形_y && 鼠标_y <= 矩形_y + 矩形宽)
{
	鼠标点击处理();
}

基于上面的逻辑,我们尝试在 C++ 中把他封装成类:

...

使用 EasyX 实现 UI 原理教程

前言

关于 EasyX 实现控件,已经有很多人给出过了大概实例甚至是一个完整的控件库,但是很少有人能接触到这部分底层UI原理。

本文主意在于让大家了解自绘 UI 控件的原理和大概实现过程,其余过多细节不做过多赘述,若有同学有兴趣写一个基于 EasyX 的控件库本文章或许会有帮助。

本文也会将在 EasyX 中写控件库项目的坑与细节指出,避免各位走过多的弯路~

目录

第一章 触发器

第二章 绘图单元

第三章 基础 UI 程序的结构与基础按钮

未完待续...

在 Dev-C++ 或 Code::Blocks 下面配置 EasyX

前言

EasyX 虽然挺好用,但是目前官方只发布了针对 VC 的使用方法。本文介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 里面,并提供相关的库。

平时我工作忙,有问题直接在后面留言,我会尽力修改。

注:版本太老的 mingw 无法支持。

库下载

点这里下载 easyx4mingw_20211002

配置说明

Code::Blocks 配置 EasyX 的详细说明

以下配置说明仅以官方原版 Code::Blocks 20.03(64 位)为例,下载地址:https://appzip.cn/codeblocks/w ,假设 Code::Blocks 的安装路径为 D:\App\CodeBlocks。

安装

1. 下载 easyx4mingw_20211002.zip 后,解压缩。

...

解决编译错误:C4996:'GetMouseMsg': This function is deprecated.

问题概述

EasyX 提供了两个头文件:

  • graphics.h
  • easyx.h

easyx.h 包含最新的函数,并且删掉了旧函数。graphics.h 引用了 easyx.h,同时提供了对旧函数的支持。使用 graphics.h 里面提供的旧函数时,会收到一个 Warning C4996,例如使用旧函数 GetMouseMsg,会收到编译提醒:

C4996:'GetMouseMsg': This function is deprecated. Instead, use this new function: getmessage. See https://docs.easyx.cn/getmessage for details.

在过去,Visual&nb

...

VS 中的生成事件

简介

VS的项目中有一个 生成事件 的选项,即在执行相关操作时运行的一些命令行,只要能运用好这一功能可以很好地编程提升效率。


生成事件具体位置

命令行的命令可通过 cmd 中的 help 命令查询,这里便不再赘述。

实例1:根据 x86/x64 环境,将对应的 dll 文件移到项目文件夹下

在使用外部的库时,常有 x86/x64 两种不同的版本的 dll ,若改变编译环境,就要手动移动相应的 dll 文件,十分麻烦,因此可以利用生成前命令(此处以 fmod 为例),在编译前将相应的 dll 移动到项目文件夹中。

具体步骤:

1.打开项目属性页

2.选择平台 x64 选择配置 所有配置

3.点击生成事件页

4.点击生成前事件

5.在命令行一栏添加以下命令

copy /Y lib\x64\fmod.dll

...

C 语言天罡三十六题 - 基础九题(2021-4-10)

许多同学在学完 C 语言之后,感觉会比较迷茫,不知道该怎样进行下一步练习。接着学《数据结构》像听天书一样,无论怎么努力都学不通透。这都是因为缺少足够的练习所致。本文总结出有限的 36 个练习程序,能独立完成这些程序,再学《数据结构》,会让你有醍醐灌顶的感觉。

这些题目的难度是递增的。如果觉得前面的题目比较简单,可以直接跳过。练习的目标,是可以独立写出代码量超过 2000 行的项目。在这个基础上,再学习数据结构、面向对象等进阶内容,才能真正理解其意义。

很遗憾,天罡36题没有标准答案。每个题目都可以根据自己的理解来完成,完成后可以和其他人交换代码相互学习,以期提高。

这 36 个练习程序我会根据大家的反馈逐步完善,标题中的日期就是当前文档的最后更新日期,希望大家根据最新版本练习。

题目分为四组:

  • 基础九题 https://codebus.cn/yangw/36-tasks-g1 (本篇)
  • 进阶九题&nb
...

第11章 樱花树

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将绘制一些漂亮的樱花树,如图所示。鼠标位置设定樱花树的高度和分散程度,鼠标右键点击设置是否显示过程动画,鼠标左键点击开始绘制。

首先学习递归的概念,实现汉诺塔问题的求解;然后学习分形的概念,并利用递归调用绘制一棵分形树;最后修改分形树的生成与绘制参数,实现了随机樱花树的绘制。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define  PI 3.1415926
#define  WIDTH 800   // 画面宽度
#define  HEIGHT 600  // 画面高度度

float offsetAn
...

第10章 十字消除

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写十字消除游戏,用户点击空白方块,沿其上下左右方向寻找第一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关,效果如图所示。

首先实现随机颜色方块的表示与绘制,鼠标点击与十字消除算法;然后绘制了提示框,绘制倒计时进度条;接着进行了得分计算、胜负判断、多关卡功能的开发;学习了地址与指针的概念,并利用地址传递使得程序更加模块化;最后学习了指针和数组的知识,应用动态数组实现了游戏尺寸的动态大小调整。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

# def
...

第9章 推箱子

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写推箱子游戏,玩家键盘控制游戏角色将所有黄色箱子推到白色方块处,效果如图所示。

首先学习字符串与字符数组的概念,并应用字符数组初始化关卡数据;然后利用键盘控制游戏角色移动,实现地图元素更新和游戏胜利的判断;接着利用三维字符数组,实现多关卡的游戏;最后学习基于文件的关卡数据读取,利用枚举类型改进游戏代码。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#define B_SIZE 60 // 方块大小
#define B_NUM 8 // 方块个数,一共8*8个方块

struct Player // 结构体,用于记录玩家位置
{
	int i;
	int j;
};
Player player; //
...

第8章 十步万度

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写十步万度游戏,效果如图所示。鼠标点击任意一个小圆圈,其指针顺时针旋转90度,后续被指向的圆圈指针也依次旋转,所有圆圈的旋转度数累积。玩家点击10次,尝试得到尽量高的旋转度数。

首先学习结构体的概念,并利用结构体数组存储所有小圆圈信息;然后学习鼠标交互的方法,实现鼠标点中小圆圈的旋转;接着学习数组作为函数的参数,实现旋转的迭代传播;最后进行操作步数、旋转度数的统计与显示。

源码:

#include <graphics.h>  
#include <conio.h>
#include <math.h>
#define PI 3.14159 // PI宏定义

struct Round // 定义结构体,用来表示带角度指示的小圆圈
{
	float x,y; // 小圆的圆心坐标
	flo
...

第7章 贪吃蛇

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写贪吃蛇游戏,效果如图所示。键盘控制小蛇上下左右移动,吃到食物后长度加一;蛇头碰到自身或窗口边缘,游戏失败。

首先利用全局变量和函数的知识,设计了一个游戏开发框架;然后学习二维数组的知识,构造了地图和小蛇,实现了小蛇向四个方向移动;接着学习了静态变量的概念,进行了时间控制的改进;最后实现了失败判断与显示、吃食物增加长度的功能。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#define BLOCK_SIZE 20 // 每个小格子的长宽大小 
#define HEIGHT 30 // 高度上一共30个小格子
#define WIDTH 40 //  宽度上一共40个小格子 

// 全局变量定义
i
...

第6章 见缝插圆

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将绘制一些漂亮的随机图案,如图所示,随机生成的圆互不相交且尽量填满画布,按空格键可以切换不同的绘制模式。

首先利用数组实现多个圆的生成和绘制,并使得圆和圆之间不相交;然后学习函数的概念,并应用函数改进代码,添加了新圆半径最大化的功能;最后利用函数封装了多种绘制模式,并通过键盘按键进行互动。

  

 

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

// 求解两个点之间的距离
float Dist2Points(float x1,float 
...

第5章 见缝插针

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将实现一个见缝插针的游戏。按下空格键后发射一根针到圆盘上,所有针逆时针方向转动;如果新发射的针碰到已有的针,游戏结束。

首先进行了圆盘与针的绘制,利用三角函数实现了针的旋转;然后学习了一维数组的概念,并利用数组实现了多根针的效果;利用批量绘制函数改进了绘制效果;最后实现了针的发射与增加、游戏失败判断、得分与显示效果的改进。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <math.h>
int main()
{
	const float Pi = 3.1415926; // Pi常量
	int width = 800; // 画面宽度
	int height = 600; /
...