本文讲解 Visual C++ 的项目文件组成,以及如何正确的创建及管理项目。
本文所设计的内容是初学者必须要掌握的。不能正确的管理项目,就不能进一步写有规模的程序。
一、项目下各种常见文件类型的功能
1. 代码文件
扩展名为 .cpp、.c、.h 等。
通常情况下,项目会由多个代码文件和头文件组成,每个文件实现不同的功能。
2. 资源文件
扩展名为 .rc 。
资源文件中定义了项目中所需的各种资源,例如图片、图标、对话框、声音等。项目中的资源引用情况均会记录在其中。有些资源会完整的记录在 .rc 里面,有些资源仅仅在 .rc 里面记录一个链接。
3. 项目管理文件
扩展名在不同版本的 VC 下有区别:VC6 为 .dsp,VC2008 / VC2010 为 .vcproj,VC2012 为 .vcxproj 。
项目管理文件管理所有代码、资源文件以及项目设置。
4. 工作区管理文件
...
这个程序将图片转换为马赛克效果。
算法原理:求出每个小方块内所有像素的颜色平均值,然后用来设置为该小方块的颜色。依次处理每个小方块,即可实现马赛克效果。
完整代码如下:
/////////////////////////////////////////////////////////
// 程序名称:将图片转换为马赛克效果
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20200727
// 作 者:krissi <zh@easyx.cn>
// 最后修改:2013-4-22
//
#include <graphics.h>
#include <conio.h>
// 将图片转换为马赛克效果
// 参数:
// pimg: 待处理的 IMAGE 对象指针
// tilesize: 马赛克的尺寸
// startx: 马赛克的平铺起始位置 x 坐标
// starty: 马赛克的平铺起始位置 y 坐标
vo
...
这个程序实现将图片进行模糊处理。
本程序的模糊处理算法:遍历图片像素,将每个像素颜色值与其周围像素颜色值求和,取平均值对其赋值。
完整代码如下(注意图片文件的路径):
/////////////////////////////////////////////////////////////////////////
// 程序名称:将图片进行模糊处理
// 编译环境:Visual C++ 6.0 ~ 2017,EasyX 20180727(beta)
// 作 者:krissi <zh@easyx.cn>
// 发布日期:2013-1-19
// 最后修改:2018-10-5
//
#include <graphics.h>
#include <conio.h>
// 将图片进行模糊处理
void Blur(IMAGE *pimg)
{
DWORD* pMem = GetImageBuffer(pimg);
int r, g, b
...
这个程序实现将图片转化成底片效果。
底片效果使用如下公式:
R = 0xFF - GetRValue(pMem[i]);
G = 0xFF - GetGValue(pMem[i]);
B = 0xFF - GetBValue(pMem[i]);
完整代码如下:
/////////////////////////////////////////////////////////
// 程序名称:底片效果
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20200727
// 作 者:krissi <zh@easyx.cn>
// 最后修改:2013-1-20
//
#include <graphics.h>
#include <conio.h>
// 底片效果
void ColorInvert(IMAGE *pimg)
{
...
这个程序实现将彩色图像转换为灰度图像。
彩色转换为灰度使用如下公式:
Gray = R * 0.299 + G * 0.587 + B * 0.114
为了提高运算速度,将这个公式转换为整数运算:
Gray = (R * 229 + G * 587 + B * 114 + 500) / 1000
为了提高运算速度的方法还有很多,这里作为演示,不再详述。
完整代码如下:
/////////////////////////////////////////////////////////
// 程序名称:彩色图片转换为灰阶图片
// 编译环境:Visual C++ 6.0 / 2010,EasyX 20130322(beta)
// 作 者:krissi <zh@easyx.cn>
// 最后修改:2013-1
...
目前,点 EasyX 绘图窗口的“关闭”,会直接退出整个程序。有时候,程序需要执行完整的流程,因此,禁止关闭按钮就是一个很需要的方法。
可以通过 initgraph 函数的第三个参数禁用关闭按钮,确保程序按实际流程完整执行。
以下代码禁用关闭按钮(VC6 / VC2010 编译通过):
#include <graphics.h>
#include <conio.h>
void main()
{
initgraph(640, 480, NOCLOSE);
circle(320, 240, 100);
_getch();
closegraph();
}
Visual C++ 的控制台项目默认生成的 exe 图标很大众,本文讲解怎样修改 exe 文件的图标。
注:Visual C++ Express(学习版)不支持资源编辑,无法创建资源文件,也就无法添加图标资源。
基础知识
图标属于”资源“,需要依附在资源文件中。
如果创建的项目类型是 Win32 Application 并且不是空项目,那么项目中默认是有资源文件的。否则,就需要先创建资源文件,再添加图标资源。
步骤一:添加资源文件
首先,检查一下项目中是否存在资源文件。资源文件的扩展名是 .rc,如果你的项目名称为 test,通常资源文件的文件名为 test.rc。如果项目中存在资源文件,就不用再添加了,直接进行步骤二。
如果没有资源文件,请按照以下方法添加:
Visual C++ 6.0 这样做:
- 点菜单:File -> New...,选择 Files 中的 Resource Script,并
...

西班牙程序员 Roman Cortes 用纯 javascript 脚本编写了一个纪念披头士摇滚乐队(Beatles)的程序,动态效果很是漂亮。现在,这个精彩的程序经 krissi 移植到了 vc 上。以下是执行效果抓图(炫丽的动态效果还是需要您亲自编译才能看到):
完整的 VC 源代码如下:
////////////////////////////////////////////////////////////////////
// 程序名称:纪念披头士摇滚乐队(Beatles)
// 编译环境:VC6.0 / 2010,EasyX 2011惊蛰版
// 原 作 者:西班牙程序员 Roman Cortes
// 原 程 序:http://www.romancortes.com/blog/a-tribute-to-the-beatles/ (javascript 版本)
// 移植作者:krissi <zh@easyx.cn>
// 最后修改:2012-3-5
//
...
关于什么是 midi 音乐文件,请参考百度百科:http://baike.baidu.com/view/7969.htm 。
这里简单说一说:
midi 是一种音乐文件,通常扩展名为 mid。不同于 mp3 的地方是:mp3 保存的是声音的波形数据,而 mid 保存的是乐器、音符、音调等。所以从文件体积上来说,mp3 的体积是 mid 体积的几十倍甚至上百倍。
鉴于 midi 的特点,早期很多游戏的都使用 midi 音乐。所以,本文讲怎样使用 midi 音乐。
【1. 素材获取】
网上搜索吧,网上有很多 mid 资源。但是不要尝试将 mp3 转换为 mid,由于原理不同,暂时无法实现 mp3 -> mid 的转换。
【2. 播放】
能播放 mp3 的方法,一般都可以用来播放 mid。所以,可以参考这些文章:
《在游戏中播放音乐》 http://www.easyx.cn/skills/View.aspx?id=44
《将 mp3 以资源形式嵌入 exe
...

2012年2月14日情人节就要来临了,西班牙程序员 Roman Cortes 用纯 javascript 脚本编写了红色玫瑰花。
现在,我把这个精彩的程序移植到了 VC 上。以下是执行效果:
完整的 VC 源代码如下:
////////////////////////////////////////////////////////////////////
// 程序名称:情人节的玫瑰
// 编译环境:VC6.0 / VC2010,EasyX_20210730
// 原 作 者:西班牙程序员 Roman Cortes
// 原 程 序:http://js1k.com/2012-love/demo/1022 (javascript 版本)
// 移植作者:krissi <zh@easyx.cn>
// 最后修改:2012-2-13
// 注:程序中的很多精简变量名都沿用原 javascript 中的变量名。
//
#include <graphics.
...
在 Turbo C 时代的图形编程有“调色板”的概念,但在真彩色时代,调色板的概念已经不完全相同了。
EasyX 模拟了 Turbo C 的大部分功能。由于上述原因,调色板并没有实现。如果要使用调色板,可以通过 Windows GDI 函数实现。
以下范例程序演示了这一过程:
(由于是动画程序,贴图无法展现效果,因此省略了贴图)
///////////////////////////////////////////////////
// 程序名称:基于 EasyX 的调色板动画程序
// 编译环境:VC6.0 / VC2010,EasyX 2011惊蛰版
// 作 者:krissi <zh@easyx.cn>
// 最后修改:2012-1-4
//
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define WIDTH 640
#define
...
bioskey() 函数需要引用头文件 bios.h,这个头文件在 VC 中默认是没有的,将其引用 #include <bios.h> 删掉即可。
功能上,bioskey 可以实现以下三个功能:
- bioskey(0): 返回用户按键。
如果返回值的低 8 位非 0,该值表示按键的 ASCII 码;
如果返回值的低 8 位为 0,该值表示按键的键码。
作为替代,VC 中可以使用 getch() 返回用户按键。对于功能键(如光标键),getch() 需要调用两次,第一次返回 0 或 0xE0,第二次返回键码。
详见:http://msdn.microsoft.com/en-us/library/078sfkak(v=VS.80).aspx
- bioskey(1): 返回是否有按键发生。
如果没有按键,返回 0;
如果有按键,返回该按键值。(该按键仍然保留)
作为替代,VC 中可以使用 kbhit() 返回是否有按键发生。
...

迷宫程序。执行效果如下:
程序间有足够多的注释,就不多作介绍了。代码如下:
///////////////////////////////////////////////////
// 程序名称:迷宫 游戏
// 编译环境:Visual C++ 6.0 / 2010,EasyX 2013霜降版
// 作 者:krissi <zhaoh1987@qq.com>
// 最后修改:2011-3-12
//
#include <graphics.h>
#include <time.h>
//////////////////////////////////////////////////////
// 定义全局变量
//
BYTE** g_aryMap = NULL; // 迷宫地图
SIZE g_szMap; // 迷宫地图的尺寸
IMAGE g_imgSight(360, 280); // 游戏的视野
RECT g_rtSigh
...