修改 VC 生成的 EXE 文件的图标

Visual C++ 的控制台项目默认生成的 exe 图标很大众,本文讲解怎样修改 exe 文件的图标。

注:Visual C++ Express(学习版)不支持资源编辑,无法创建资源文件,也就无法添加图标资源。

基础知识

图标属于”资源“,需要依附在资源文件中。

如果创建的项目类型是 Win32 Application 并且不是空项目,那么项目中默认是有资源文件的。否则,就需要先创建资源文件,再添加图标资源。

步骤一:添加资源文件

首先,检查一下项目中是否存在资源文件。资源文件的扩展名是 .rc,如果你的项目名称为 test,通常资源文件的文件名为 test.rc。如果项目中存在资源文件,就不用再添加了,直接进行步骤二。

如果没有资源文件,请按照以下方法添加:

Visual C++ 6.0 这样做:

  1. 点菜单:File -> New...,选择 Files 中的 Resou
...

在游戏中使用 midi 音乐文件

关于什么是 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

...

在没有控制台的 Win32 Application 中使用 EasyX 绘图

通常大家学习 VC 都会创建 Win32 Console Application,它的特点就是输入输出简单,调试简单方便。不过对界面要求高的程序有一个控制台窗口似乎并不美观。本文讲怎样在没有控制台的 Win32 Application 中使用 EasyX 绘图。

首先,创建新项目的时候,要选择 Win32 Application 项目。

然后,写主函数的时候,一定要注意,不是 main,而是 WinMain。完整的格式如下:

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// 在这里写代码

	return 0;
}

这样就是一个没有控制台的、完整的 Win32 程序了。

需要注意的是,因为没有控制台,所以 conio.h 头文件中的函数都不能使用(conio 就

...

通过 Windows API 获取鼠标位置等状态信息

EasyX 有一个演示鼠标操作的范例程序,这里,我们尝试通过 Windows API 获取鼠标信息。关于 API 的使用都以注释形式写到了程序中,故不再详细讲解,代码如下:

// 程序名称:通过 API 获取鼠标状态
// 编译环境:Visual C++ 6.0 / 2008 / 2010,EasyX 2011惊蛰版
//
#include <graphics.h>
#include <stdio.h>

void main()
{
	initgraph(640, 480);		// 初始化绘图窗口
	HWND hwnd = GetHWnd();		// 获取绘图窗口句柄

	POINT point;
	TCHAR s[10];

	while(true)
	{
		GetCursorPos(&point);			// 获取鼠标指针位置(屏幕坐标)
		ScreenToClient(hwnd, &point);	// 将鼠标指针位置转
...

将 TC 下的绘图和游戏程序移植到 VC 下

Turbo C(简称tc)是 dos 时代经典的编译器,学习编程时,有很多图形类和游戏类的程序都是用 tc 编写的。由于 c 语言标准的不完善,这些程序大多数都不能直接在 vc 里面编译。本文就讲解怎样将 tc 程序移植到 vc 下。

注:本文以 VC 6.0 为范例(高版本的 vc 大同小异),同时请安装最新版本的 EasyX 图形库。

移植前请注意:

  1. 确保 tc 代码可以正确运行。
  2. 将 tc 代码复制粘贴到 vc 里面。注意,vc 里面代码文件的扩展名要用 .cpp,不能用 .c。
  3. 以下解决办法不分先后顺序,哪条对应就按照哪条修改。
  4. 如果没找到对应的解决办法,可以暂时跳过,先改后面的。可能修改了第 3 条错误,第 2 条错误也就没有了。
  5. 可能解决一个问题后,会出现 10 个新问题,这不要紧。细心、耐心一些,一个一个问题慢慢处理,并不复杂。

以下正文:

错误提示:fatal err

...

将 mp3 以资源形式嵌入 exe 中使用

本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用。嵌入 mp3 和嵌入图片略有不同,将图片嵌入到 exe 中,以及访问嵌入 exe 中的图片,请参考:http://www.easyx.cn/skills/View.aspx?id=6

【一、以资源文件形式嵌入 exe】

关于“资源文件”的介绍和“将 mp3 以资源形式嵌入 exe 文件中”的步骤,请仿照 http://www.easyx.cn/skills/View.aspx?id=6。

【二、播放资源文件中的 mp3】

1. 思路

查看 MSDN 中关于 mciSendString 的使用,发现并不支持直接读取资源文件中的媒体文件,也不支持读取内存中的媒体文件。因此,我们需要提取资源

文件中的 mp3 为成临时文件,然后调用 mciSendString 播放,播放结束后再删掉这个临时文件。

2. 提取资源文件中的为

...

关于编程中“绝对路径”和“相对路径”的使用

加载图片、音乐等各种文件的时候,都要指定文件路径。通常,可以用绝对路径和相对路径两种方式来指定文件。

先解释一下概念:

  • 绝对路径,就是从盘符开始的路径,例如:“c:\windows\system32\mfc42.dll”。
  • 相对路径,就是从当前路径开始的路径,例如,当前路径是“c:\windows”,那么指定前面范例的文件,可以直接写“system32\mfc42.dll”。
    注意,路径分隔符“\”在 c 语言里面是转义字符,所以表达路径分隔符需要用“\\”。

从功能上讲:

  • 访问每台电脑上路径都固定不变的文件,需要用绝对路径,例如访问 c:\boot.ini。
  • 如果程序所在路径不固定,访问的文件和程序放在一起,就要用相对路径。例如和程序放在一起的图片文件。

在 VC6 的项目

...

通过程序设置鼠标的样式

在编写程序中(尤其是游戏),有时候需要使用个性的鼠标样式,本文就讲解怎样实现该功能。

实现这个功能需要两步:

  1. 加载鼠标样式,并获取其句柄(HCURSOR);
  2. 设置窗口类的鼠标样式为第一步获取到的句柄。

下面详细解释一下这两步:

一、获取鼠标样式的句柄

使用 API 函数 LoadCursor 实现加载鼠标样式。该函数可以读取系统默认的样式,也可以加载资源形式的 .cur 鼠标样式图片,还可以通过 API 函数 LoadImage 加载文件形式的鼠标样式图片。

涉及到的函数原型如下:

HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName);
HMODULE GetModuleHandle(LPCTSTR lpModuleName);
HANDLE LoadImage(HINSTANCE hins
...

TC 中的 bioskey() 函数在 VC 中用什么代替?

bioskey() 函数需要引用头文件 bios.h,这个头文件在 VC 中默认是没有的,将其引用 #include <bios.h> 删掉即可。

功能上,bioskey 可以实现以下三个功能:

1. bioskey(0): 返回用户按键。

如果返回值的低 8 位非 0,该值表示按键的 ASCII 码;

如果返回值的低 8 位为 0,该值表示按键的键码。

作为替代,VC 中可以使用 getch() 返回用户按键。对于功能键(如光标键),getch() 需要调用两次,第一次返回 0 或 0xE0,第二次返回键码。

详见:http://msdn.microsoft.com/en-us/library/078sfkak(v=VS.80).aspx

2. bioskey(1): 返回是否有按键发生。

如果没有按键,返回 0;

如果有按键,返回该按键值。(该按键仍然保留)

作为替代,VC 中可以使用 kbhit() 返回

...

在不创建绘图窗口的前提下,直接生成图片文件

通常我们使用 initgraph 创建绘图窗口,然后在里面绘图。

除此之外,我们还可以直接在 IMAGE 对象中绘图,这样就可以实现在不创建绘图窗口的前提下,直接生成图片文件。

为此,需要使用两条命令:

1. SetWorkingImage
该命令用于设定绘图目标。当设置为 IMAGE 对象时,之后所有的绘图操作都会针对该 IMAGE 对象。

2. saveimage
该命令用于保存图片。

实际上并不复杂,请看下面例子:

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

void main()
{
	// 创建一个 300 x 300 的 IMAGE 对象
	IMAGE img(300, 300);
	// 设定 img 为绘图操作的目标
	SetWorkingImage(&i

...