支持 Alpha 信息图片旋转(旋转后自动适应大小)

需要使用配置文件的场景很多,例如:
配置文件一般以 .ini 为扩展名,编码为 ANSI 或 Unicode(即 UTF-16 LE)。例如在 \windows 文件夹里面可以找到很多 .ini 文件。.ini 文件的内容是纯文本的,可以直接双击打开编辑。举一个实际例子,下面是一个标准的 .ini 配置文件的内容:
; EasyX 范例
[Ball]
x=10
y=37
r=20
[Wall]
width=
...
现在的屏幕分辨率都比较高,为了使屏幕字体不至于太小,通常在 Win10 的显示设置里面设为放大 125% 或 150% 或更大,这样就会导致像素实际上被放大了。
如果你的程序不希望受系统缩放设置影响,你需要使用一个新的 API 函数:SetProcessDpiAwareness
注意这个 API 函数的使用条件:
以下是一个完整的范例程序,该范例创建一个不受系统缩放设置影响的绘图窗口,并画一个圆:
// 编译环境:Win10 + VS2019 + EasyX_20200727
//
// 设定操作系统版本为 Win10(需要放到 #include <graphics.h> 前面)
#define WINVER 0x0A00
#define _WIN32_WINNT 0x0A00
...
加载图片、音乐等各种文件的时候,都要指定文件路径。通常,可以用绝对路径和相对路径两种方式来指定文件。
先解释一下概念:
从功能上讲:
以下用 VC2010 的项目来说明绝对路径和相对路径如何使用。
...有网友反馈说,鼠标左键按下并拖动后,会相当于一次键盘按键,使 _getch() 触发。鼠标双击也会使 _getch() 触发。经过排查后,发现该问题是某些翻译软件的划词翻译功能引起的。
解决方法:关掉翻译软件的划词翻译功能(比如有道词典就有这个功能)。
或者,使用 getmessage(EM_CHAR) 替代 _getch() 实现按任意键继续。
EasyX 自带的 putpixel 函数源自 Windows GDI 函数 SetPixel,由于要考虑裁剪区、缩放、原点坐标、坐标方向等等诸多因素,所以性能很低,在一些只要求速度的场合很不实用。这篇文章就教你写一个自己的画点函数。
总的思想,是通过直接操作显示缓冲区来避免额外的运算。
在 EasyX 绘图窗口的显示缓冲区中,每个点占用 4 个字节,用 DWORD 指针指向显示缓冲区就可以像一维数组一样访问了。然后就是将二维坐标 (x, y) 映射到一维数组中,很简单,y * 640 + x 就是。另外需要注意的是,显示缓冲区中颜色的保存和 COLORREF 相比,蓝色和红色是相反的,需要用 BGR 宏转换一下(BGR 宏执行两次就会还原为原值)。
然后,我们整理出画点和读点的函数:
(记得要获取显示缓冲区指针并保存为全局变量)
DWORD* g_pBuf;
// 在 main 函数中
g_pBuf = GetImageBuffer();
void
...
常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 640 x 480,当初为什么这么设计?
因为这个分辨率运算速度比较快,人也相对比较好记。
大家知道,屏幕上的每一个点,都会对应内存中的一个位置。比如 640x480@256色,表示每个点占用一个字节,整个屏幕有 640 x 480 = 300k 个点,占用 300KB 内存。屏幕的每一个像素的保存,在内存中是线性存储结构。在屏幕上的坐标 (x, y) 画一个点,就相当于在对应内存偏移 y * 640 + x 的位置赋值。
PS:在这篇文章中有一段代码,可以实践一下通过内存赋值来直接画点:https://codebus.cn/yangw/fast-putpixel
每绘制一个点,都需要执行一次乘法和一次加法运算。所有的绘图操作都需要调用画点函数,因此提高画点的效率,将会提升所有绘图操作的速度。
现在我们将计算内存偏移量的算法修改一下:
d = y * 640 +
...
有些同学遇到这样的问题,打开 EasyX 的帮助文档 EasyX_Help.chm 之后,发现所有的内容点击后都是空白的,就像下面这样:
这是由于 Windows 的安全机制造成的,当你从网上直接下载一个 chm 文件,或者用 Windows 资源管理器从压缩包里面解压出来 chm 文件,都会被 Windows 认为目标文件不够安全,然后默认被锁定。
所以,只需要简单解锁就可以了。
这样做:右击 EasyX_Help.chm 文件,在属性页中,会看到底部的“安全”一项,“解除锁定”没有勾选,如下图:
只需要简单的勾选“解除锁定”,然后点击确定,就可以正常浏览 chm 文件了。
有时候程序中会需要一个弹出窗口显示信息,还有些小游戏结束的时候,会简单的弹出一个对话框询问用户是否要重新来一句,如下图:
这篇文章就简单讲解一下这个功能如何实现。
首先,我们需要使用一个 Windows API 函数:MessageBox。该函数原型如下:
int MessageBox(
HWND hWnd, // handle to owner window
LPCTSTR lpText, // text in message box
LPCTSTR lpCaption, // message box title
UINT uType // message box style
);
第一个参数 hWnd 是指向父窗口的句柄,可以通过 EasyX 的函数 GetHWnd() 得到绘图窗口的句柄;
第二个参数 lpText 是要显示的字符串;
第三个参数
...平时常用的图片格式有 bmp、jpg(jpeg)、gif、png 等。其中,bmp 是无损压缩,文件体积比较大,通常都会用其他格式来代替 bmp。所以本文着重讲 jpg、gif、png 三种格式。
首先必须要提到的是:修改图片扩展名并不会修改图片格式。图片格式,是图片各像素点的组织方式,不同的格式有不同的文件头和压缩算法等。而扩展名,仅仅是一个格式的标识,方便人们辨识格式。只修改扩展名,会造成图片文件的标识与内容不符,影响图片加载。因此,必须通过绘图软件将图片保存为相应格式。
jpg 适合保存照片这类颜色丰富、图案复杂的图像,使用有损压缩。尤其在保存简单颜色的图像时,有损压缩会使颜色边缘出现“不干净”的问题。
gif 适合保存颜色简单、内容简单的图像,使用无损
...通常来说,_getch() 可以返回用户键入的字符。对于一些小游戏,希望用方向键控制的时候,怎么做呢?
先看看 MSDN 的解释:
When reading a function key or an arrow key, _getch and _getche must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.
简单来说,当 _getch() 返回 0 或 0xE0 时,就表示用户按了功能键,这时候需要再调用一次 _getch(),第二次 _getch() 返回的值表示功能键的键码,比如:
更多的键码,可以自己试验得出。
具体到程序中的应用,请参考“俄罗斯方块”的源代码:https://codebus.
...本文讲解 Visual C++ 的项目文件组成,以及如何正确的创建及管理项目。
本文所设计的内容是初学者必须要掌握的。不能正确的管理项目,就不能进一步写有规模的程序。
扩展名为 .cpp、.c、.h 等。
通常情况下,项目会由多个代码文件和头文件组成,每个文件实现不同的功能。
扩展名为 .rc 。
资源文件中定义了项目中所需的各种资源,例如图片、图标、对话框、声音等。项目中的资源引用情况均会记录在其中。有些资源会完整的记录在 .rc 里面,有些资源仅仅在 .rc 里面记录一个链接。
扩展名在不同版本的 VC 下有区别:VC6 为 .dsp,VC2008 / VC2010 为 .vcproj,VC2012 为 .vcxproj 。
项目管理文件管理所有代码、资源文件以及项目设置。
EasyX 从 2011-2-24 开始,支持了直接操作显示缓冲区的功能。本文介绍一下在 EasyX 中怎样使用“显示缓冲区”。
比如画点,传统的画点函数会受坐标系、缩放、裁剪区等因素影响,导致性能较差。为了实现高速绘图,需要更直接的方法,这就是直接操作显示缓冲区的目的。
在 EasyX 中,每个点用 4 个字节表示。对于 640 x 480 的绘图窗口,显示缓冲区的大小为 640 x 480 x 4 = 307,200 x 4 = 1,228,800 字节。
一个 DWORD 类型为四个字节,如果是 DWORD 类型的指针指向显示缓冲区,那么用数组的形式,数组的下标范围是 0~307,199。
关于颜色需要注意:平时用 COLORREF 表示颜色,但是显示缓冲区中的颜色是 RGBTRIPLE 结构体格式(该结构体的定义请参考 MSDN)。RGBTRIPLE 在内存中的表示形式为:0xrrggbb (bb=蓝,gg=绿,rr=红),而 COLORREF 在内存中的表示形式为
...