您的位置:首页 > 编程语言

游戏编程之DirectX的修炼:二(创建属于自己的windows窗口程序:上)

2017-08-30 13:53 519 查看
     千里之行始于足下,想要写出一个自己的游戏,首先还是要有一个窗口去承载我们美轮美奂的内容。窗口,一个无比美丽有神奇的东西,想想你被控制台支配的恐惧,你就会发现,所见即所得是一件多么美妙的事情。想想之前只能在控制台写程序的自己,曾常常怀疑,我是不是学了假编程,总感觉有点啥不对(好吧,有这种想法应该不是对的,毕竟基础很重要),我记得第一次接触有图形界面的编程是mfc,mfc吧,说难也难,说简单也不简单。反正我是被它搞得晕头转向过。然后,就在博客上看到一位叫做央雾前辈写的一些关于mfc上的游戏编程(事实上,也只是在mfc上编而已,毕竟几乎不会用到mfc的那套乱七八糟的东西,原谅我,我不是要诋毁mfc,实际上我觉得mfc还是挺不错的),结果就是有一个非常强烈的感受——游戏的体验非常不好。我感觉很慢,可能是因为mfc的东西太多了吧。总之,不扯了。我们还是来写一个整洁的win32程序吧。

   **2.1创建一个win32项目**

运行vs2017新建项目->Visual C++ ->桌面向导  然后选择一下存储位置,并给项目取个名字。然后选择window应用程序,勾选空白项,其他不用勾选。使用其他IDE的朋友们创建过程有些许不同 但都大同小异,没问题的。最后确定就ok啦。





然后我们右键源文件,添加->新建项。创建一个main.cpp创建项目就ok啦



**2.2编写第一个win32程序**

       说到写程序嘛,有一个不得不提的家伙就是程序的心脏主函数“main()”,相信在编程界摸爬滚打的各位对他是无比熟悉了,不管是c还是java,反正哪里都有他,自然,win32的程序也是有一个main函数了,但是有一点点不同的是,win32 的main函数稍稍把名字给改了下,叫做WinMain。好,我们先看看这个window程序的心脏函数长啥子样。
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR     lpCmdLine,
_In_ int       nCmdShow
);

       如果是第一次编写win32程序的同学看到这个奇奇怪怪的main函数或许有些奇怪,这函数咋这么多奇奇怪怪过的东西。这个时候,我就必须要负责人的告诉你,千万别被它的外表迷惑,毕竟他终究只是个主函数而已,我们只需要用它来做我们程序的入口就好,那么我们怎么用哪?

       首先回忆一下我们的第一个控制台c++程序。

#include<iostream>
using namespace std;
int main()
{
cout<<"hello world!";
return 0;
}   哈哈,那么我们windows c++程序也就是大同小异了。
#include<windows.h>//注意 我们在编写windows程序时候,要包含头文件windows.h

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{

return 0;
}



这时候有人会问,哎呀 ,夕霞你是不是糊弄我,下面这程序这程序啥都没有,上面好歹还能弄出个hello world看看。是的,这里就是windows程序和控制台程序之间的区别了。控制台程序我们用输入输出流就能看到结果。但是想要看到Windows程序的结果,则需要有一个窗口作为载体,这个窗口可以是你自己定义的(下一章会详细分析),要么就是众多windows定义好的窗口之一:比如MessageBox。我们来看一下这个程序。顺便放上截图。
#include<windows.h>

int CALLBACK WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{

MessageBox(NULL,L"Hello win32!",L"消息窗口",MB_OK);
return 0;
}



        好啦,在解释这个程序之前,请记住,虽然这只是一个小小的对话框,但是它也是一个窗口。只是样子和我们想象中有些出入。
        让我们来解释下这个win32程序,首先大家最在意的应该是winmain函数的括号里的一大堆东西,的却,他足够引人注意,不过,这些参数是程序运行时由系统传递给程序的,所以我们不必太过纠结,了解一下各项意义。

      HINSTANCE hInstance:实例句柄,这个参数的意思是操作系统为我们的程序分配的唯一的标识符。就好比我们的每个学生都有自己的学号,只有有了学号,才能在食堂打饭啦,去图书馆借书啦等等,在后面我们还会碰到。

      HINSTANCE hPrevInstance:应用程序父句柄,这个参数已经废弃了,所以不管了。

       LPSTR lpCmdLine:一个以NULL结尾的字符串,类似于命令行参数,这里我们没必要深入了解。

       int nCmdShow:最后,这个整形的参数是什么意思那?它其实是指出如何打开我们的窗口,是最大化还是最小化,还是隐藏。(它的值可以是:SW_SHOW:激活窗口并按当前大小和位置显示。SW_MAXIMZE:最大化显示。SW_MINIMZE:最小化显示。等等。。。。)这个参数我们将在下一节的ShowWindow()中使用。

         说完参数,再来说说winmain前面的CALLBACK,可能在平时大家没有见过,我们转到定义之后可以看到如下定义



其实_stdcall 是为了强制程序从左至右的次序处理参数,所以,winmain函数必须使用CALLBACK或者WINAPI 否则winmain将不能正确处理参数。对了 windows程序有很多地方都用了匈牙利命名法,基本原则是:变量名=属性+类型+对象描述
。如h代表hwnd 句柄,具体大家可以百度。

         最后就是MessageBox这个函数啦,它其实就是一个Windosw的API函数,调用它可以产生一个小小的对话框。

int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);



第一个参数代表消息框的父窗口,这个参数一般设置为NULL。
第二个参数为要显示的内容,是一个以NULL结尾的字符串。

第三个参数为标题,是一个以NULL结尾的字符串。

第四个参数是uType类型,代表这我们要使用那种类型的消息框。

比如MB_OK  ,  MB_YESNO, MB_OKCANCEL等等,,,且大家可以用|符号自由组合他们。

哇   这节就差不多讲这么多吧,对了大家有啥不明白的可以通过Microsoft Help查看器查看自己不明白的函数,虽然都是英文,不过没关系,下个网易有道就好,毕竟我也没过四级



好吧,下一节讲如何创建一个自己的Windows窗口程序,内容可能有点多,我也没啥自信,不过还是想尽量说清楚搞明白让看了的人,如果有啥错误和不足都希望有看过的人指出来谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: