YangW

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

用 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 行模式,效果仍然很差。

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

...

实现桌面截图

本文讲解怎样截取整个桌面的图像。

对于控制台程序,执行后首先会创建一个黑色的控制台窗口,然后才会启动你的程序。因此这时候抓到的图,会包括一个黑色的控制台窗口,我想,这是大多数人不希望看到的。因此,实现抓图,要建立的项目需要是 Win32 Application,而不能是平时用的 Win32 Console Application。怎样创建一个 Win32 Application,请参考文章《在没有控制台的 Win32 Application 中使用 EasyX 绘图》。

[名词介绍]

DC:英文单词 Device Contexts(设备上下文) 的缩写。DC 中包含有用于该设备的一组绘图对象以及这些对象的属性(例如画笔、画刷等)。

[原理简介]

要获取桌面内容,先要获取桌面的 DC,然后再通过图像拷贝语句将桌面图像的内容拷贝到 IMAGE 的 DC 中。

[实现步骤]

因为实现起来简单,步骤已经以注释的形式写到了下面的示例代码中:

...

一步步拓展程序,实现文字在背景上的移动

本文适用读者:已经学完 C 语言基本知识,并对 EasyX 略有了解。

本文范例实现的功能:文字在背景上移动,并且不破坏背景。

本文范例编译平台:VC6 / VC2010 + EasyX 20140321(beta)。

本文并不直接写出最终代码,而是从最开始绘制背景,一步步拓展到我们需要的功能。希望这个过程能对初学者有所启发。

一、绘制背景

为了实现文字移动而不破坏背景的效果,我们先画个背景。做法很简单,就是画一连串的竖线,并且每次变换颜色,这样就能弄一个渐变色的背景,代码如下:

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

// 主函数
void main()
{
	// 创建绘图窗口
	initgraph(640, 480);
	
	// 绘制背景
	for(int i = 0; i < 640; i++)
	{
		setlinecolor(i);
		li
...

怎样编写格式优美的代码

0. 序

很多初学者会被人一眼就看出来是初学者,为什么?原因很多。其中,代码格式是很重要的一项。不注重代码格式,不仅别人看起来不舒服,还会影响自己对代码的阅读。虽然错误的格式不会产生编译错误,但却会让你更容易犯错,并且更难排查错误。所以,学会编写格式优美的代码,是初学者必须要学的一课。

优秀的代码格式并不是唯一的,有很多种风格。本文仅讲解常见的 C/C++ 语言编码规则,而其它规则相信大家在学习工作中会慢慢接触到。

再有就是,为了便于阅读代码,EasyX 网站的代码都是比较注意格式的。所以,如果打算投稿到 EasyX,看看本文也很有必要。

以下讲解编写代码时在格式上一些常见的注意事项。

1. 正确缩进

所谓缩进,是指在某一行代码的左端留出一部分空白。采用缩进的目的为了清楚的定义一个块的开始和结束,这样会使程序更加清晰易读。虽然目前主流的开发平台都具备智能缩进的功能,但是很多时候修改代码还是需要自己注意缩进问题。

下面的范例代码是求解 100 以内的质数,该范例中有多种缩进情况

...

怎样产生随机方向(上下左右)?

比如坦克游戏,敌人坦克移动的四个方向通常不会用 1~4 这样四个数值表示,而是用 dx、dy 这样的 x、y 轴上的增量表示。对应关系如下:

dx =  0;  dy = -1; 表示向上
dx =  0;  dy =  1; 表示向下
dx = -1;  dy =  0; 表示向左
dx =  1;  dy =  0; 表示向右

如果用 1~4 表示 4 个方向,敌人坦克前进一步的代码要这样写:

...

同时执行两个或更多功能的方法

我留意到群里和贴吧有不少人都在问怎样同时执行两个过程,比如:

  1. 贪吃蛇游戏,怎样实现双人对抗?就是控制两条蛇移动。
  2. 俄罗斯方块游戏,要加一个时钟,怎样使时钟和游戏同时进行?
  3. 打砖块游戏,怎样实现一边让小球自由移动、一边实现玩家控制木板?

有些人会想到用多线程来解决。我这里首先要说:这个问题不要用多线程,多线程要解决是另一种问题,这里不再详述,本文只讲一下怎样实现前面说的问题。(当然不用多线程解决)

先说一个简单的程序要求:有一个变量 a,初值为 0,每秒钟增加 2,按任意键停止;还有一个变量 b,初值为 0,每秒钟增加 3。现在要求将这两个功能同时执行,该怎么做?

我相信很多人都能写出来这个简单的程序:

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

void main()
{
	// 
...

在没有控制台的 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 就是 Console

...

通过 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 error C1083: C

...

将 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. 提取资源文件中的为临时文件

...