编程初学者:游戏编程起源(初学者)Ⅰ



★第章 Windows编程基础

☆ 介绍
本章目是介绍WINDOWS编程基础在本章结束时你应该能够很好工作了虽燃可能是简单WINDOWS你需要有C语言基础知识我很少将C++代码扩充到当然由于WINDOWS本身就是面向对象点类知识是不会对你有什么损害如果你不熟悉C++没有关系我想你还是能从我这里学到大部分东西所有代码都通过了MICROSOFT VISUAL C++6.0编译如果你还没有合适编译器个同我好了它还是很棒开动吧!
☆ 开始
多数Windows都需要Windows.h和Windowsx.h这两个头文件要确保使用它们当然你还需要其它标准C头文件象stdio.hconio.h等除了这些你还会经常看到在开始有这样行代码:
# WIN32_LEANAND_MEAN
它表示Windows头文件中将拒绝接受MFC东西这将加速你build时间如果你从没有打算应用MFC在你游戏编程中那就使用它吧如果你以前从没有看过这种声明类型——在#直接加上个“单词”那么它作用就是有条件编译看看下面例子:

#def DEBUG_MODE
prf(\"Debug mode is active!\");
#end

意思是:如果开始包含# DEBUG_MODE那么就prf否则退出这个对于你跟踪逻辑是很有帮助

☆ WinMain

DOS下C语言从开始Windows下C语言从WinMain开始个空WinMain是这样:

WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, nCmdShow)
{
(0);
} 即使什么也没做也应该返回个值有好多东西我们不熟悉首先首先WINAPI是个什么声明?WINAPI是在windows.h头文件中定义个宏它把翻译成正确约定当我们在中需要用到汇编语言时候我们在来深究它好了记住如果要用WinMain就必须要有WINAPI

步让我们来看看括号里 4个参数:
HINSTANCE hinstance:HINSTANCE是个句柄类型标识符变量hinstance是个整数用于标识例子Windows设置这个参数并把它传递给你代码很多Windows都要用到它
HINSTANCE hPreInstance:你不用担心这个参数它已经被废掉了它只是为古老Windows版本服务你将还会看到类似情况
LPSTR lpCmdLine:是个指向指针它仅在名是从DOS命令行输入或是从Run对话框中输入时才起作用因此很少被代码所用
nCmdShow:决定了窗口在显示时状态Windows通常给这个参数分配个值通常是SW_打头个常量例如SW_SHOWNORMAL表示默认状态SW_MAXINIZE或SW_MINIMIZE分别表示最大和最小模式等等

以上大体上是WinMain参数介绍下面对变量、参数、常量、类等命名思路方法介绍

☆ 匈牙利命名法
【不翻译这段了相关资料很多】

☆ 消息
当你在DOS下编程时候你不必担心其它运行DOS是独占模式但你在Windows平台上编程时你不得不考虑其它正在运行鉴于此Windows通过“消息”来连接操作申请和具体操作简单就是我们指示本身向Windows发出诸如移动窗口、放大窗口、关闭窗口等地申请Windows再根据申请考察实地情况拒绝或发出指令(计算机)作出相应动作再例如鼠标随时向Windows发出消息汇报光标位置左键或右键是否按下等Windows再根据消息作出相应反应总的无论何时Windows都要随时掌控所有消息而且Windows是直不断地接收到各种消息
这种功能是通过种被命名为CALLBACK类型实现不用害怕消息传递来传递去都是由Windows自己完成你只要声明个CALLBACK就可以了就像WINAPI用在WinMain如果还没有明白不要紧往下看你就明白了现在我要离开这个话题你只有先建立窗口(Windows)传递消息才有可能实现

☆ 窗口类
现在谈论点C++知识要想建立个窗口你就得先建立个窗口类窗口类包含所有有关窗口信息如用什么样鼠标符号菜单样式等等开发任何个窗口都离不开窗口类建立为了达到此目你必须填写WNDCLASSEX结构EX意思是“扩充”意思个老结构叫作WNDCLASS这里我们将使用WNDCLASSEX结构样子如下:

typedef struct _WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
cbClsExtra;
cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;

这个结构有不少成员讨厌你必须为窗口类设置每个成员莫发愁纸老虎让我们来个速成
UINT cbSize:指定了以字节为单位结构大小这个成员是通过(WNDCLASSEX)实现你将会经常看到它尤其是你使用了DirectX
UINT style:指定了窗口风格它经常被以CS_打头符号常量定义两种或两种以上风格可以通过C语言中“或”(|)运算符加以组合大多数情况我们只应用 4种风格出于对文章长度考虑我们只列出这 4种若你还需要其它到MSDN里找下好了别告诉我你用不是Visual C++啊!
◎ CS_HREDRAW:旦移动或尺寸调整使客户区宽度发生变化就重新绘制窗口
◎ CS_VREDRAW:旦移动或尺寸调整使客户区高度发生变化就重新绘制窗口
◎ CS_OWNDC:为该类中个窗口分配个唯设备上下文
◎ CS_DBLCLKS:当用户双击鼠标时向窗口过程发送双击消息
WNDPROC lpfnWndProc:是指向窗口过程指针般都指向CALLBACK如果你没有用过指针简单理解为地址就是名字名字后面别带括号
cbClsExtra:它是为类保留额外信息 大多数员不用它你在在写游戏时也不太可能用它所以设为0好了
cbWndExtra:同上个差不多设为0好了
HANDLE hInstance:是指向窗口过程例子句柄同时也是WinMain()参数的应该设置为hinstance
HICON hIcon:指向窗口图标句柄它通常被LoadIcon设置在你学会如何在你中使用资源前你先设置成如下样子:LoadIcon(NULLIDI_WINLOGO)当然还有些其它IDI_打头符号常量你自己去帮助文件里找吧




HCURSOR hCursor:指向窗口光标句柄它通常被LoadCursor()设置在你学会如何在你中使用资源前你先用Windows默认LoadCursor(NULL,IDC_ARROW)
HBRUSH hbrBackground:当你窗口过程得到消息要求刷新(或重画)窗口时至少要用种纯色或“brush”(画刷)重画窗口区域画刷是由参数确定你可以使用GetStockObject几种常备画刷如BLACK_BRUSH, WHITE_BRUSH, GRAY_BRUSH等现在你就用GetStockObject(BLACK_BRUSH)吧对不起你可能觉得我说太简单了但我不想把开始弄得太复杂我在以后篇幅里会详细讲我保证
LPCTSTR lpszMenuName:如果你想建立个有下拉菜单窗口你得给这个参数赋个菜单名称(这涉及到资源)由于你还不知道如何创建菜单你就先用NULL设置成个没有菜单窗口吧
LPCSTR lpszClassName:很显然你需要给类起个名字随你便如“TMD”要用双引号引上啊!
HICON hIconSm:指向小图标句柄小图标用来显示在窗口标题栏里要用到LoadIcon()现在你就用Windows默认LoadIcon(NULLIDI_WINLOGO)
好了你有关WNDCLASSEX结构知道差不多了你可以自己设置它了下面是个例子:

WNDCLASSEX sampleClass; // declare structure variable sampleClass.cbSize = (WNDCLASSEX); // always use this!
sampleClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; // standard tings
sampleClass.lpfnWndProc = MsgHandler; // we need to write this!
sampleClass.cbClsExtra = 0; // extra info, not used
sampleClass.cbWndExtra = 0; // extra window info, not used
sampleClass.hInstance = hinstance; // parameter passed to WinMain
sampleClass.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Windows logo
sampleClass.hCursor = LoadCursor(NULL, IDC_ARROW); // standard cursor
sampleClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // a simple black brush
sampleClass.lpszMenuName = NULL; // no menu
sampleClass.lpszClassName = \"Sample Class\" // name
sampleClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Windows logo again
【“//”后面我就不翻译了】

我想你已经有点儿不太崇拜Windows员了言归正传点我得提醒你注意GetStockObject(HBRUSH)类型配置这是GetStockObject可以其它对象不仅仅是“brush”所以你需要个HBRUSH类型配置在Visual C++旧版本里不用配置但新6.0版本需要它否则会编译出错
件事是注册这个窗口类只有这样你才能创建新窗口十分简单你只需要个RegisterClassEX它只有个参数就是你窗口类地址(名字)根据我上面给例子这里应该这样:
RegisterClassEx(&sampleClass);
我们窗口类创建完了我们可以用它创建个窗口了只是时间问题喽!

☆ 创建窗口
待续



Tags:  网络游戏的起源 网络游戏起源 游戏的起源 编程初学者

延伸阅读

最新评论

发表评论