YangW

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

实现简单的询问对话框

游戏结束的时候,通常会简单的弹出一个对话框询问用户是否要重新来一句,如下图:

这篇文章就简单讲解一下这个功能如何实现。

首先,我们需要使用一个 Windows API 函数:MessageBox。该函数原型如下:

int MessageBox(
	HWND hWnd,          // handle to owner window
	LPCTSTR lpText,     // text in message box
	LPCTSTR lpCaption,  // message box title
	UINT uType          // message box style
);

第一个参数 hWnd 是指向父窗口的句柄,可以通过 EasyX 的函数 GetHWnd() 得到绘图窗口的句柄;

第二个参数 lpText 是要显示的字符串;

第三个参数 lpCapti

...

在游戏中播放音乐

游戏没有声音多单调。

这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧:

// 编译该范例前,请把 music.mp3 放在项目文件夹中
// 发布时,请把 music.mp3 和编译的 exe 放在一起
// 编译环境:VC6~VC2017 + EasyX_20190314(beta)
//
#include <graphics.h>
#include <conio.h>
// 引用 Windows Multimedia API
#pragma comment(lib,"Winmm.lib")

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

	// 打开音乐
	mciSendString(_T("open music.mp3 alias mymusic"), NULL, 0, NULL);

	outtextxy(0, 0, _T("按任意键开始播放"));
	getch();

	// 播放音
...

程序的编写风格(代码格式)可以随心所欲

很多文章都阐述了编写程序时“代码格式”的重要性,甚至还有些硬性的规定。当然,这篇文章并不是否定格式的重要性,初学者甚至应该十分注重格式才对。

但是另一方面,编写程序还应该注重整体,通过代码格式展现出整体的结构。这里举一个例子,EasyX 网站有一个变幻线的源代码:
http://www.easyx.cn/samples/View.aspx?id=42

其中有几行代码是很长的,并且违反了很多条“代码格式”的规定,这里转过来这几行:

	// 判断顶点是否越界
	if		(m_head->pos.x < 0)			{ m_head->pos.x = -m_head->pos.x;				m_step.x =  rand() % MAXSTEP + 1;	}
	else if (m_head->pos.x >= WIDTH)	{ m_head->pos.x -= m_head->pos

...

解决问题:编译范例程序都出现上百个错误

刚开始用 EasyX,编译却出现上百个错误,例如:

error C2143: syntax error : missing ')' before '='
error C2072: 'initgraph' : initialization of a function
error C2059: syntax error : ')'
warning C4028: formal parameter 1 different from declaration
warning C4028: formal parameter 2 different from declaration
warning C4028: formal parameter 3 different from declaration
error C2143: syntax error : missing ')' before '*'
error C2081: 'bool' : name in formal parameter list ille

...

解决错误: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:用鼠标控制绘图/游戏程序”https://www.codeabc.cn/bestans/post/concise-lesson-10
  2. “VC绘图/游戏简易教程-15:窗体句柄(Windows 编程入门)”https://www.codeabc.cn/bestans/post/concise-lesson-15

【基础程序】

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

#include <graphics.h>
#include <c
...

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

注:Visual C++ Express(学习版)不支持资源编辑,无法创建资源文件,因此也就无法实现内嵌图片资源。

场景描述

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

loadimage(NULL, _T("test.jpg"));

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

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

什么是资源文件

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

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

...