慢羊羊的空间

无为,无我,无欲,居下,清虚,自然

创建一个不受系统缩放设置(DPI)影响的绘图窗口 铜牌收录

现在的屏幕分辨率都比较高,为了使屏幕字体不至于太小,通常在 Win10 的显示设置里面设为放大 125% 或 150% 或更大,这样就会导致像素实际上被放大了。

如果你的程序不希望受系统缩放设置影响,你需要使用一个新的 API 函数:SetProcessDpiAwareness

注意这个 API 函数的使用条件:

  • Win8.1 及以上版本
  • 头文件 ShellScalingApi.h
  • 库文件 Shcore.lib

以下是一个完整的范例程序,该范例创建一个不受系统缩放设置影响的绘图窗口,并画一个圆:

// 编译环境:Win10 + VS2019 + EasyX_20200727
//

// 设定操作系统版本为 Win10(需要放到 #include <graphics.h> 前面)
#define WINVER 0x0A00
#define _WIN32_WINNT 0x0A00

...

不用创建项目,直接在 VS 里快速测试 C/C++ 代码 铜牌收录

概述

Visual Studio 强大、方便,但是每次写代码都要先创建新项目,这对于一些简单的代码测试来说有点不方便。

本文介绍一种使用 VS 快速测试代码的方法。

该方法适用任何版本的 VS。“不用创建项目”,是指不用“手工”创建项目,而是通过批处理命令,自动完成相关功能,实现双击图标后就进入代码编写环境。

准备工作

先按照如下步骤进行准备(请根据实际情况调整路径):

1. 建立文件夹 D:\TestCpp\,里面存放用来快速测试代码的项目。

2. 打开 Visual Studio,创建一个 Win32 Console Application 项目作为模版,项目路径 D:\TestCpp\Template\TestCon,其它设置根据自己的习惯来。然后添加代码文件 main.cpp:

#include <stdio.h>

int main()
{
	printf("Hello W
...

彻底卸载 Visual Studio、SQL Server 等微软开发平台的官方工具 铜牌收录

像 Microsoft Visual Studio(Visual C++)、SQL Server 等微软系的开发平台,不仅仅要安装开发环境,还要安装许多相关组件,涉及到的安装位置除了软件的安装文件夹之外,还有好些组件在系统盘以及系统文件夹内,如果不小心改动了某些组件或者删除了某个文件夹,经常会造成无法彻底卸载的问题。除了卸载,有些安装文件夹只有第一次安装的时候才能选择路径,如果不彻底卸载,再次安装的时候就无法重新选择安装路径。

所以这时候,我们需要一个安全的、官方的、有效的、简单的卸载工具。

这个工具微软已经帮我们准备好了:Microsoft Program Install and Uninstall Troubleshooter

【点这里】查看微软对该工具的介绍,里面有微软的官方下载地址。

不想看那么多的,可以直接【点这里】

...

详解透明贴图和三元光栅操作 金牌收录

透明贴图,是指贴图时某些部分是完全透明的或半透明的。

本文介绍多种透明贴图的方案,包括:

  1. 指定透明色贴图(基于 Windows API 函数 TransparentBlt)
  2. 指定透明色贴图(基于直接操作显示缓冲区)
  3. 使用三元光栅操作实现透明贴图
  4. 根据 png 的 alpha 信息实现半透明贴图(基于 Windows API 函数 AlphaBlend)
  5. 根据 png 的 alpha 信息实现半透明贴图(基于直接操作显示缓冲区)

各种方法各有利弊,大家可以根据自己的需求选择。

1. 指定透明色贴图(基于 Windows API 函数 TransparentBlt)

这是最简单的透明贴图方法。

该方法要求图片素材的透明部分为纯色,因此建议使用 gif 或 png 格式的图片素材。如果使用 jpg 格式的图片素材,那么由于 jpg 的有损压缩,会造成边缘颜色有微小差异,与指定的透明色并不完全相同,从而导

...

制作图片素材的必备知识 铜牌收录

平时常用的图片格式有 bmp、jpg(jpeg)、gif、png 等。其中,bmp 是无损压缩,文件体积比较大,通常都会用其他格式来代替 bmp。所以本文着重讲 jpg、gif、png 三种格式。

首先必须要提到的是:修改图片扩展名并不会修改图片格式。图片格式,是图片各像素点的组织方式,不同的格式有不同的文件头和压缩算法等。而扩展名,仅仅是一个格式的标识,方便人们辨识格式。只修改扩展名,会造成图片文件的标识与内容不符,影响图片加载。因此,必须通过绘图软件将图片保存为相应格式。

图片格式的区别

jpg 适合保存照片这类颜色丰富、图案复杂的图像,使用有损压缩。尤其在保存简单颜色的图像时,有损压缩会使颜色边缘出现“不干净”的问题。

gif 适合保存颜色简单、内容简单的图像,使用无损

...

正确实现“按任意键继续”功能 铜牌收录

在大家写程序的时候,经常会遇到“按任意键继续”这样的功能。网上能找到的方法主要有两种:

  1. 使用 _getch() 语句
  2. 使用 system("pause") 语句

现在挨个说说。

_getch()

_getch() 功能是从控制台输入一个字符(控制台不显示该输入),是 conio.h 里面声明的一个函数。
所以 _getch() 很好的实现了“按任意键继续”的功能。

system("pause")

system 的功能是通过控制台执行一个命令,是 stdlib.h 里面声明的一个函数。
该函数需要一个字符串指针参数表示命令。这里,"pause" 就是 system 函数将要执行的命令。

pause 命令的功能,可以在控制台 cmd.exe 下输入 pause /? 查看,可以看到,pause 的功能是:暂停并显示信息“Press any key to

...

使用程序代码输出常见的字体图标(标志图片) 铜牌收录

程序中经常会使用一些常规的标志(图标、Logo)图片,例如,音量开关、各种方向箭头、扑克牌花色、邮件、电话、磁盘、笑脸/哭脸、五星等等。通常做法是,制作好图片,然后在特定的位置将图片显示出来。本文讲述如何通过输出文字的形式将这些常规的标志图片进行输出。

打开帮助文件 EasyX_Help.chm 后,内容为空白的解决办法 铜牌收录

有些同学遇到这样的问题,打开 EasyX 的帮助文档 EasyX_Help.chm 之后,发现所有的内容点击后都是空白的,就像下面这样:

这是由于 Windows 的安全机制造成的,当你从网上直接下载一个 chm 文件,或者用 Windows 资源管理器从压缩包里面解压出来 chm 文件,都会被 Windows 认为目标文件不够安全,然后默认被锁定。

所以,只需要简单解锁就可以了。

这样做:右击 EasyX_Help.chm 文件,在属性页中,会看到底部的“安全”一项,“解除锁定”没有勾选,如下图:

只需要简单的勾选“解除锁定”,然后点击确定,就可以正常浏览 chm 文件了。

为什么屏幕分辨率是 640x480? 铜牌收录

常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 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 +
...

在 VC 下清空键盘缓冲区的方法 铜牌收录

(以下代码在 VC 下通过)

控制台窗口是有输入缓冲区的,当你按键后程序没有来得及处理,系统会将按键缓存,等到程序获取按键的时候,系统会把缓冲区里面之前的按键返回。

例如这个程序:

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

int main()
{
	printf("延时 5 秒钟。请在 5 秒钟内随便按键。\n");
	Sleep(5000);

	printf("延时结束。刚才您按下的按键是:\n");

	while (_kbhit())
	{
		char c = _getch();
		printf("%c", c);
	};

	return 0;
}

请自己执行一下前面的程序,在 5 秒延时内随便按键,等到延时结束,可以看到程序可以读出刚才的按键。

...

学习保存应用程序的配置信息 金牌收录

为什么要用配置文件

需要使用配置文件的场景很多,例如:

  • 应用程序启动的时候,通过读取外部的一个“配置文件”,以加载不同的值,实现程序按照不同的需求来执行。
  • 应用程序启动后,用户会有各种操作。当用户下一次启动应用程序时,就会希望保持上一次的操作状态。或者游戏结束后,需要将最高分记录等等。因此,可以在程序关闭的时候,将一些必要的变量保存下来,并且在下一次程序启动的时候,读取这些变量。通常,可以把这些变量保存在“配置文件”中。

创建配置文件

配置文件一般以 .ini 为扩展名,编码为 ANSI 或 Unicode(即 UTF-16 LE)。例如在 \windows 文件夹里面可以找到很多 .ini 文件。.ini 文件的内容是纯文本的,可以直接双击打开编辑。举一个实际例子,下面是一个标准的 .ini 配置文件的内容:

; EasyX 范例
[Ball]
x=10
y=37
r=20
[Wall]
width=
...

用 Visual C++ 编写可以在 Borland C++ 3.1 下编译执行的程序 铜牌收录

由于某些学校的硬性规定,课设必须用 Borland C++ 3.1(以下简称 BC) 一类 DOS 下的编程工具完成。

但是,BC 用起来很费劲,毕竟是 dos 时代的工具,无论编辑还是调试,都很吃力。尤其是图形程序,由于涉及到硬件及系统的问题,导致程序不能在 win7 及以上版本的 Windows 中运行,必须借助 dosbox 一类工具或者虚拟机才可以,麻烦多多。

本文通过一些常用的技巧,讲解怎样用 Visual C++(以下简称 VC) 编写可以在 BC 下直接编译运行的程序。

这样做的好处就是,可以节约大量的编码和调试时间。众所周知,当程序规模比较大的时候,调试时间会超过编码时间。而 VC 的强大调试功能,远不是 BC 能比的。同时,windows 下便捷的编辑环境,也比 BC 能节约很多时间。再比如有些人的显示器可以旋转,将 24 寸的显示器旋转 90 度竖着用,一屏可以阅读上百行代码,这种效率,绝对不是 BC 那一屏 20 多行代码可以比的。即便 BC 启用 43 行模式,效果仍然很差。

所以,下面的这个方法看似

...