游戏编程之DirectX的修炼:二(创建属于自己的windows窗口程序:上)
2017-08-30 13:53
519 查看
千里之行始于足下,想要写出一个自己的游戏,首先还是要有一个窗口去承载我们美轮美奂的内容。窗口,一个无比美丽有神奇的东西,想想你被控制台支配的恐惧,你就会发现,所见即所得是一件多么美妙的事情。想想之前只能在控制台写程序的自己,曾常常怀疑,我是不是学了假编程,总感觉有点啥不对(好吧,有这种想法应该不是对的,毕竟基础很重要),我记得第一次接触有图形界面的编程是mfc,mfc吧,说难也难,说简单也不简单。反正我是被它搞得晕头转向过。然后,就在博客上看到一位叫做央雾前辈写的一些关于mfc上的游戏编程(事实上,也只是在mfc上编而已,毕竟几乎不会用到mfc的那套乱七八糟的东西,原谅我,我不是要诋毁mfc,实际上我觉得mfc还是挺不错的),结果就是有一个非常强烈的感受——游戏的体验非常不好。我感觉很慢,可能是因为mfc的东西太多了吧。总之,不扯了。我们还是来写一个整洁的win32程序吧。
然后我们右键源文件,添加->新建项。创建一个main.cpp创建项目就ok啦
如果是第一次编写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窗口程序,内容可能有点多,我也没啥自信,不过还是想尽量说清楚搞明白让看了的人,如果有啥错误和不足都希望有看过的人指出来谢谢。
**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窗口程序,内容可能有点多,我也没啥自信,不过还是想尽量说清楚搞明白让看了的人,如果有啥错误和不足都希望有看过的人指出来谢谢。
相关文章推荐
- 游戏编程之DirectX的修炼:二(创建属于自己的windows窗口程序:下)
- Windows程序编程(2):窗口创建
- C语言小程序:Windows窗口游戏编程模板
- Directx3D9学习之二:Windows编程之最简单窗口程序
- windows编程学习笔记(1)创建窗口与消息循环
- ActionScript 3.0游戏编程——创建简单的ActionScript程序
- Windows编程之SDK窗口程序浅析
- windows编程 全屏窗口的创建总结
- 【Windows编程】笔记-添加音效与窗口创建
- Windows下游戏制作(1)---win32窗口创建(2)
- Windows窗口程序从创建到关闭产生的消息
- 创建一个主显示表面 (Windows游戏编程大师P210)
- Windows编程之MFC窗口程序浅析
- 【DirectX 2D游戏编程基础】DirectX精灵的创建
- Windows编程基础 第三章 基本窗口创建过程 MDI窗口创建
- Windows 编程- 生成窗口程序
- Windows编程之最简单窗口程序
- Delphi使用Windows API 创建最基本的窗口程序Hello,Windows演示
- Windows编程学习笔记 lesson2 窗口创建
- [收录]windows编程之为程序创建系统快捷键