1.文件类型:
ipch文件夹和.sdf文件:这两个文件都是Visual Studio用来保存预编译的头文件和Intellisense用的。(可删除,对于工程开发没有影响)
Debug文件夹:存放着编译过程中的中间文件,以及最后的目标文件,.exe执行文件(如果是Release型,则不出现Debug文件夹而是Release文件夹)
.vcxproj:项目文件
.sln:记录着关于解决方案中的信息
.suo:记录着应用于该解决方案的用户选项
.opensdf:记录着关于项目的状态信息(只在项目处于打开状态时才有)
2. Windows平台游戏铁三角:C++, Windows API, 图形库(DirectX或OpenGL)
3. 3中基本的创建交互式Windows应用程序的方式:
a. 使用Windows API进行开发:
b. 使用MFC来进行开发:
比Windows API更高层,因此效率必然不如Windows API。但有底层代码隐蔽性的特点且封装了很多实际上没有、用到的东西,不利于游戏开发的效率和游戏的运行速度,不适合游戏开发。MFC做游戏地图编辑器之类的工具软件倒是比较合适。
c. 使用Windows Forms:基于窗口的新的开发机制,是微软.NET开发框架的图形用户界面部分,该组件通过将现有的Windows API封装为托管代码提供了对Windows本地(native)组件的访问方式。(我们通常可以把这套组件看做事MFC的替代品)
4. API:应用程序编程接口(Application Programming Interface)
SDK:软件开发包(Software Development Kit)常用DirectX SDK
5. MSDN:Microsoft Developer Network Library
微软开发者网络帮助库
6. int WINAPI WinMain()
头文件WinDef.h中:#define WINAPI __stdcall
__stdcall表示一种调试约定
参数:
第一个(HINSTANCE类型 hInstance),当前运行的实例句柄。h表示handle,就是句柄。
第二个(HINSTANCE类型 hPrevInstance),当前实例的前一个实例句柄
第三个(LPSTR类型 lpCmdLine),一个以空终止的字符串,指定传递给运用程序的命令行参数。lp表示参数是一个指针。
第四个(int类型 nCmdShow),指定程序窗口应该如何显示(最大化、最小化、隐藏等)
7. MessageBox函数
参数:
第一个(HWND类型 hWnd),表示我们显示的消息框所属的窗口的句柄
第二个(LPCTSTR类型 lpText),一个以NULL结尾的字符串,表示所要显示的消息框的内容
第三个(LPCTSTR类型 lpCaption),一个以NULL结尾的字符串,消息框的标题内容
第四个(UINT类型 uType),表示消息框窗口的样式
使用多个标识符,用逻辑或连接
常用于小时错误消息(提示缺失.dll什么的)
8. PlaySound函数(编译前连接winmm.lib库文件)
参数:
第一个(LPCTSTR类型 pszSound),字符串,指定要播放的声音文件,设为NULL时停掉所有当前播放的声音
第二个(HMODULE类型 hmod),包含了第一个参数中指定的声音文件作为资源的可执行文件句柄
第三个(DWORD类型 fdwSound),用来控制声音播放的标志
9. 句柄——每个Windows资源都有且都独特的“身份证”
10. MSG结构体(消息的表示形式)
参数:
第一个(HWND类型 hwnd),指定了消息所属的窗口
第二个(UINT类型 message),指定了消息的标识符
第三、四个(WPARAM类型 wParam 和 LPARAM类型 lParam),都用于指定消息的附加信息
第五个(DWORD类型 time),表示投递到消息队列中的时间
四六个(POINT类型 pt),表示投递到消息队列是鼠标的当前位置
消息队列:用于存放改程序创建窗口的消息
Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断地从消息队列中取出消息并进行响应。
11. 窗口类的设计:
WNDCLASSEX结构体
WNDCLASSEX wndClass = { 0 };
// 用WNDCLASSEX定义了一个窗口类,即用wndClass实例化了WINCLASSEX,用于之后窗口的各项初始化。
参数:
第一个(UINT类型 cbSize)表示该结构体的字节数大小,一般取sizeof(WNDCLASSEX)
第二个(UINT类型 style)指定这一类型窗口的风格样式,多个用逻辑与连接
第三个(WNDPROC类型 lpfnWndProc)一个函数指针,指向窗口过程函数(是一个回调函数)
第四个(int类型 cbClsExtra)表示窗口类的附加内存。一般设置为0
第五个(int类型 cbWndExtra)表示窗口的附加内存。一般设置为0
第六个(HINSTANCE类型 hInstance)指定包含窗口过程的程序的实例句柄。(把WinMain函数的第一个参数,即改程序当前运行的实例句柄传给它)可
第七个(HICON类型 hIcon)指定窗口类的图标句柄。用LoadIcon函数加载将返回值赋给hIcon;通常用LoadImage函数从文件直接加载。
第八个(HCURSOR类型 hCursor)表示窗口类的光标句柄。可用LoadCursor加载一个光标
第九个(HBRUSH类型 hbrBackground)指定窗口类的背景画刷句柄
第十个(LPCTSTR类型 lpszMenuName)指定菜单资源的名字
第十一个(LPCTSTR类型 lpszClassName)指定窗口类的名字
第十二个(HICON类型 hIconSm)指定窗口类的小图标句柄(任务栏右下角托盘显示的小图标)
12. 窗口类注册函数:RegisterClassEx
只有一个参数,即上一步中所设计的窗口类对象的指针
例如:
WNDCLASSEX wndClass = { 0 };
RegistrClassEx( &wndClass );
13. 窗口正式创建:CreateWindow函数
(可以调用AdjusWindowRect()函数计算窗口的尺寸)
参数:
第一个(LPCTSTR类型 lpClassName)指定对应窗口类的名称
第二个(LPCTSTR类型 lpWindowName)指定创建窗口的名字
第三个(DWORD类型 dwStyle)指定创建窗口的样式,比如预设好的WS_OVERLAPPEDWINDOW类型
第四个(int类型 x)指定窗口的水平位置,CW_USEDEFAULT默认位置
第五个(int类型 y)指定窗口的竖直位置,CW_USEDEFAULT默认位置
第六个(int类型 hWidth)指定窗口的宽度
第七个(int类型 hHeight)指定窗口的高度
第八个(HWND类型 hWndParent)指定被创建窗口的父窗口句柄,可选,通常设为NULL
第九个(HMENU类型 hMenu)指定窗口菜单的资源句柄,可选,通常设为NULL
第十个(HINSTANCE类型 hInstance)指定窗口所属的应用程序实例的句柄,即应用程序的实例ID(WinMain的第一个参数)
第十一个,lpParam作为WM_CREATE消息的附加参数lParam传入的数据指针,可选,通常为NULL
14. 窗口的显示和更新
改变窗口位置和大小:MoveWindow函数(左上角为原点(0,0))
参数:
第一个(HWND类型 hWnd)之前创建窗口的句柄
第二个(int类型 X)相对左上角的新位置
第三个(int类型 Y)相对左上角的新位置
第四个(int类型 nWidth)指定窗口的新宽度
第五个(int类型 nHeight)指定窗口的新高度
第六个(BOOL类型 bRepaint)指定是否要重画窗口
显示窗口:ShowWindow函数
参数:
第一个(HWND类型 hWnd)窗口句柄
第二个(int类型 nCmdShow)指定窗口的显示状态,可直接填nCmdShow
更新窗口:UpdateWindow函数
参数:
hWnd 指创建成功后的窗口句柄
15. 两套消息循环体系:
GetMessage为核心:
参数:
第一个(LPMSG类型 lpMsg)指向一个消息(MSG)结构体,GetMessage从线程的消息队列中取出的消息信息将保存在该结构体中
第二个(HWND类型 hWnd)指定接受属于哪一个窗口的消息,一般设为NULL
第三个(UINT类型 wMsgFilterMin)指定要获取消息的最小值,通常为0
第四个(UINT类型 wMsgFilterMax)指定要获取消息的最大值,若与最小值同时为0则表示接受所有消息
收到WM_QUIT消息,返回值为0
否则,返回值为非0值
出错,返回-1
PeekMessage为核心:(更常用)
参数:
前四个与GetMessage一样
第五个(UINT类型 wRemoveMsg)用于指定消息的获取方式。取PM_NOREMOVE,则取出消息后,消息将不会从消息队列中移除;取PM_REMOVE,则移除
能在消息队列中取到消息,返回值为非0;否则为0
区别:
无论应用程序消息队列是否有消息,PeekMessage函数都立即返回
而GetMessage函数只有在消息队列中有消息时才返回,队列中无消息则会一直等,在等的时间里,应用程序不能执行任何指令
P.S. GetMessage和PeekMessage函数的第二个参数通常不要填窗口句柄,最好填0(有可能某一时间这个窗口句柄失效了,而消息循环仍然在运行,会导致错误)
16. 窗口过程函数:
主要用于处理发送给窗口的消息,Windows应用程序的主要代码部分
窗口过程函数的名字可以自定义,不必用WindowsProc
但函数定义形式必须和声明格式一样
系统通过窗口过程函数的地址(指针)调用窗口过程函数,而不是函数名
参数:
第一个(HWND类型的hwnd)
第二个(UINT类型的uMsg)表示待处理消息的ID,即消息类型
第三、四个(WPARAM类型的wParam,LPARAM类型的lParam)用于标识消息的附加信息
17. 窗口类的注销:UnregisterClass函数
18. 当我们的程序需要GDI来绘图时,必须先去的设备环境的句柄
19. 获取设备环境句柄(HDC)的两种方法
BeginPaint函数、EndPaint函数
参数:(两个函数一样)
第一个(HWND类型 hWnd)
第二个(const PAINTSTRUCT类型的*lpPaint)将欧体包含了应用程序用来绘制它所拥有的窗口客户区所需要的信息
(P.S. ValidateRect函数,用于更新指定窗口的无效矩形区域,使之有效:参数1 HWND类型hWnd,参数2 const RECT类型*lpRect为NULL时客户区将会生效)
GetDC函数、ReleaseDC函数
参数:
第一个(HWND类型hWnd),均有
第二个(HDC类型hDC)指向要释放的设备上下文环境的句柄,releaseDC独有
20. 坐标转换:
客户区 -> 屏幕区:ClientToScreen()
屏幕区 -> 客户区:ScreenToClient()
21. 一个设备环境中同一时刻只能有一个画笔对象,也只能有一个画刷对象
P.S. GDI对象已经创建变回占用部分内存,一旦用不到它了,无必要将他们删除