解决错误:error C2665: “outtextxy”: 2 个重载中没有一个可以转换所有参数类型

【错误描述】

一些程序在 VC6 下运行好好地,但是放到 VC2008 及更高版本 VC 下编译却报错误(以下仅以 VC2008 举例,高版本 VC 类似),例如使用如下语句:

outtextxy(10, 20, "Hello World");

在 VC6 下可以成功编译,但在 VC2008 下编译后会有错误。

中文版错误提示如下:

error C2665: “outtextxy”: 2 个重载中没有一个可以转换所有参数类型

英文版错误提示如下:

error C2665: 'outtextxy' : none of the 2 overloads could convert all the argument types

同样的,对于其他一些包含字符串调用的函数,例如 loadimage、drawtext 等,也会遇到类似问题。

【错误原因】

简单来说,这是由于字符编码问题引起的。
VC6 默认使用的

...

什么是 LPCTSTR?和 char* 有什么关系?

简单来说,LPCTSTR 就表示字符串指针。

那么和 char* 又有什么区别呢?

大家用 char 表示字符时,英文占用一个字节,中文站用两个字节。这样有一个严重的问题:两个字节,究竟是两个英文字符,还是一个中文字符?为了解决这个问题,unicode 编码诞生了。

常见的 unicode 编码不管中文英文都用两个字节表示,用 wchar_t 来定义。

为了让代码适应 char 和 wchar_t 两种情况,可以用 TCHAR 宏,这个宏当项目定义为 unicode 时表示 wchar_t,否则表示 char。

对应的,还有 _T("") 宏用来表示字符串,例如 _T("abc") 在项目为 unicode 时表示 L"abc",否则表示 "abc"。

然后再看 LPCTSTR,它是以下几个概念的缩写:Long Point Const Tchar STRing,这样意思就明确了吧。

窗口技巧:利用窗体句柄实现圆形窗口

该篇文章讲述如何做一个圆形窗口。根据该思路,可以实现各种形状的窗口。

阅读该文章前,请先阅读

  1. “VC绘图/游戏简易教程-10:用鼠标控制绘图/游戏程序”http://tieba.baidu.com/f?kz=778075014
  2. “VC绘图/游戏简易教程-15:窗体句柄(Windows 编程入门)”http://tieba.baidu.com/f?kz=871437280

【基础程序】

先写一个基础程序,实现按鼠标右键退出,完整代码如下:

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

void main()
{
	initgraph(640, 480);	// 初始化图形窗口
	MOUSEMSG m;				// 定义鼠标消息

	while(true)
	{
		m = GetMouseMsg();	/
...

VC绘图/游戏简易教程--15:窗体句柄(Windows 编程入门)

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

EasyX 库有一个获取窗口句柄的功能,很是强大,这里介绍一下。

【窗体句柄】

窗体句柄是 Windows 下窗口的标识,可以理解为窗口的 ID。Windows SDK 中的许多窗口操作函数都需要指明窗体句柄,也就是说,有了句柄,我们可以通过 Windows SDK 中的 API 实现许多高级的窗体控制。

【函数原型】

窗体句柄为 HWND 类型,通过 GetHWnd() 函数可以返回绘图窗体的句柄。其函数原型是:
HWND GetHWnd();

【使用句柄】

举个例子,设置窗体标题文字的 Windows API 为:
BOOL SetWindowText(HWND hWnd, LPCTSTR lpString);
参数:
   hWnd: 要设置标题文字的窗口句柄

...

读取图片的技巧:将图片内嵌到 exe 文件中

【场景描述】

如果程序中需要使用一张图片,通常会用相对路径方式指定一个外部文件。例如:

loadimage(NULL, "test.jpg");

这样,将编译后的 .exe 和 test.jpg 放在一起,就可以正确加载图片。许多游戏有几十个甚至上千个文件,就是有类似这样的许多外部数据。

但还有一些情况,希望图片能嵌入编译后的 .exe 里面,这样只需要拷贝一个 .exe 文件就能附带上所需图片。本文就介绍这种情况的实现方法。

【什么是资源文件】

windows 应用程序是可以包含各种“资源”的,例如:图标、对话框、菜单、快捷键等等,这些资源按照一定的格式,可以和 .exe 链接在一起。

我们所要做的,就是把图片放到资源中,然后从资源中加载图片。

【操作步骤】

以英文版的 VC6 和 VC2010 为例,嵌入资源的操作步骤如下:

...

VC绘图/游戏简易教程--14:通过位运算实现颜色的分离与处理

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

本节课要求熟练掌握位运算,详见:
http://hi.baidu.com/bestans/blog/item/fb75b439404876e614cecb9f.html

[颜色基础]

在 EasyX 库中,颜色是一个 int 类型的数据,转换为 16 进制后的颜色格式是 0xbbggrr,其中,bb/gg/rr 分别表示两位十六进制的蓝/绿/红颜色值,每种颜色的范围是 0x0~0xff,转换为十进制就是 0~255。

举几个颜色标示的例子:

  • 颜色  直接表示  RGB 宏标示
  • 纯绿色 0x00ff00  RGB(0, 255, 0)
  • 青色  0xffff00  RGB(0, 255, 255)  注:青=蓝+绿
  • 中灰色 0x7f7f7f  RGB(

...

VC绘图/游戏简易教程--13:getimage / putimage / loadimag / saveimage / IMAGE 的用法

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

 getimage / putimage / loadimage / saveimage 这一组命令和 IMAGE 对象可以实现图像处理的相关功能,下面逐个介绍。
(有点类似 tc 中的 imagesize)

[加载图片]

实现加载图片主要分三步:
1. 定义 IMAGE 对象
2. 读取图片至 IMAGE 对象
3. 显示 IMAGE 对象到需要的位置

很简单,我们看一下完整的代码:

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

void main()
{
	initgraph(640, 480);

	IMAGE img;	// 定义 IMAGE 对象
	loadimage(&

...

VC绘图/游戏简易教程--12:数组

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法) 

课程要求:先复习下课本上对数组的讲解(随便一本教材都行)

[一维数组]
数组可以实现批量操作。比如,我们产生 10 个随机数,产生后先保存起来,然后输出最大的:

	int n[10];
	int i;
	for (i=0; i<10; i++)
		n[i] = rand() % 1000;

	// 按生成的顺序,逆序输出
	for (i=9; i>=0; i--)
		printf("%d\n", n[i]);

	// 找出最大的
	int max = -1;
	for (i=0; i<10; i++)
	{
		if (n[i] > max)
			max = n[i];
	}

	printf("最大的数字是:%d\n", max);

...

VC绘图/游戏简易教程--11:随机函数

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

[随机函数简介]
游戏中,许多情况都是随即发生的。还有一些图案程序,例如屏保,也是随即运动的。这就需要用随机函数。

随机函数很简单,只有一个:
rand()
该函数返回 0~32767 之间的一个整数。(不需要记住 32767 这个数字,大概知道这个范围就行了)
该函数在头文件 <stdlib.h> 中,使用前记得引用。

[简单测试]

#include <stdio.h>
#include <stdlib.h>

void main()
{
	int r;
	for(int i=0; i<10; i++)
	{
		r = rand();
		printf("%d\n", r);
	}
}

执行后,

...

VC绘图/游戏简易教程--10:用鼠标控制绘图/游戏程序

教程总目录:http://www.easyx.cn/skills/View.aspx?id=45 (里面包括VC下的graphics.h的配置方法)

学习本节课前,需要熟练掌握第 7 节。详见:http://www.easyx.cn/skills/View.aspx?id=21

==本节课开始==

捕获鼠标消息就像捕获按键消息一样简单。
对于按键,通常我们会先检查是否有按键,然后定义一个变量保存按键,再然后根据该按键的值,执行相应的程序。
对于鼠标,道理是一样的。

先写个代码对比一下:

获取按键:               获取鼠标:
  char c;               &

...