Windows游戏编程复习

由于工作原因 不得不复习一下前面的内容 当然这些东西不会再工作中用到 我用了差不多两天
时间写了三千字左右的Windows基础概念的复习 其他详细还是需要自己去掌握 这里只是分享给大家


MessageBox();
{
第一个参数HWND
第二个参数信息框内需要显示的字符串
第三个参数标题栏内需要显示的字符串
第四个参数 样式 (MB_OK MB_YESNO MB_YESNOCANCEL)
(一个ok 
一个ok一个no 
一个ok 一个no一个cancel)
返回值类型:
IDYES 按下yes后的返回值
IDNO按下 no的返回值
IDOK按下 ok后的返回值
IDCANCEL按下 Cancel后的返回值
}


PlaySound();播放音乐
开始的时候必须包含#pragma comment(lib,"Winmm.lib"); 这个是必须链接winmm.lib库文件
或者在属性配置 连接器 输入里面添加一个库文件为Winmm.lib 即可
{
第一个参数是在当前vcproj下路径的文件目标地址
第二个参数可以沉默填NULL
第三个参数是播放声音的标志 一般重复播放就填写 SND_LOOP | SND_ASYNC一块使用 循环播放
(SND_FILENAME | SND_ASYNC  异步播放时立即返回)
}


客户区-定义在标题栏下面的都是客户区--其他补充请查阅资料


HWND 窗口句柄 -我们要对某一个窗口进行操作的时候必须得到当前窗口句柄(Windows程序中)有很多句柄
光标,图标,窗口 创建这些系统资源都会分配内存 图标句柄 - HICON 光标句柄 - HCURSOR 
画刷句柄 - HBRUSH 


消息--Windows程序是一种基于事件驱动方式的程序的程序设计模式,Windows程序与操作系统间的通信主要基于
消息  举个例子:按下鼠标  按下WSAD 按下某键 按下鼠标 执行某个操作


讲到消息咱们可以来看看MSG 这个结构体表示的意思
MSG
{
第一个参数Hwnd 指定消息所在窗口
第二个参数 指定消息标识符
第三个参数 第四个参数都是指定此msg20:28 2016-12-21时间 (一般为0)
第六个参数是投递到消息队列中鼠标当前位置
}


窗口结构体
struct WNDCLASSEX(别名) 与 WNDCLASS 下面我们讲一下一个升级版
初始化 WNDCLASSEX = {0}; 将此定义了一个窗口类别结构体实例化 (初始化) -- 参数的详细定义见下
{
参数一 是表示结构体的大小 咱们一般设置为sizeof(WNDCLASSEX);取结构体的字节数大小
参数二 是style指定窗口风格 一般CS_HREDRAW | CS_VREDRAW  要多用就用|进行连接
CS_HREDRAW 当窗口水平方向上的宽度变化时 会重绘窗口
CS_VREDRAW 当窗口水平方向上的高度变化时 会重绘窗口
CS_NOCLOSE 禁用Close命令 导致窗口没有关闭按钮
参数三 WNDPROC类型的lpfnWndproc 他是一个函数指针指向窗口过程的函数
参数四 表示窗口附加内存 我们设置为0就好了
参数五 和第四个参数是一样的 我们直接设置为0即可
第六个参数 指定包含窗口过程的程序的实例句柄把Winmain的第一个参数传递给他即可
第七个参数 ico图标 如果为NULL 系统将提供一个沉默的图标
第八个参数 Cursor表示光标句柄 咱们一般写成IDC_ARROW 
第九个参数 HBRUSH类型的hbrBackground,指定窗口累的背景画刷句柄
第十个参数 LPCTSTR类型的lpszMenuName, 一个以空终止的字符串一般填0
第十一个参数 窗口类别结构体的名字 ""字符串取一个喜欢的名字
第十二个参数 小图标 右下角(一般填0)不用太在意
}




窗口的正式创建
Create Window
{
第一个参数 指定对应窗口的类名wndClass.lpszClassName = ("")类名 就是上面窗口结构体里面的十一个参数
第二个参数 用于指定创建的窗口名字 也就是显示在标题栏上的程序的名字 比如"打飞机"就会显示在上方
第三个参数DWORD的style 风格就像跑车一样有不同的款型 一般咱们填WS_OVERLAPPEDWINDOW
(WS_OVERLAPPED)用于产生一个层叠的窗口 而一个层叠的窗口具有一个标题栏和边框
(WS_CAPTION)创建一个有标题栏的窗口
(WS_SYSMENU)创建一个标题栏上带有系统菜单的窗口,需要和WS_CAPTION一起使用
(WS_THICKFRAME)创建一个可调边框的窗口
(WS_MINIMAZEBOX)创建一个具有最小化的窗口必须和WS_SYSMENU一起使用
(WS_MAXIMIZEBOX)创建一个具有最大化按钮的窗口也必须和WS_SYSMENU一起使用
第四个参数 int类型的x 用于指定窗口的水平位置
第五个参数 int类型的y 用于指定窗口的竖直位置
第六个参数 int类型的width 指定窗口的宽度
第七个参数 int类型的height 指定指定窗口的高度  4-7的参数一般填CW_USEDEFAULT 表示沉默位置
第八个参数 HWND类型的hwndparent 一般设置为NULL
第九个参数 指定窗口菜单的资源句柄 一般我们不用菜单 所以NULL即可
第十个参数HINSTANCE类型的hinstance 用于指定窗口所属的应用程序实例的句柄 也就是应用程序的实例ID
一般这个参数我们填上hInstance
第十一个参数作为WM_CREATE消息的附加参数 所以一般窗口创建失败返回NULL 所以一般填NULL
}


窗口的更新和显示
改变窗口位置与大小 MoveWindow
(
参数一 HWND类型的hwnd 填当前窗口句柄
参数二 x坐标 相对于屏幕
参数三 y坐标 相对于屏幕 (左上角)
参数四 width 窗口的宽
参数五 Heright 用于窗口高度
参数六 BOOL类型的 制定了是否要重画窗口 把它填上TRUE WM_PAINT消息就会重画 FALSE反之
)


显示窗口
ShowWindow 来进行窗口的显示 就像一个手机什么都做好了 但是没有生产 加工 推送到市场 是一样的
ShowWindow
{
第一个参数 是显示窗口的句柄
第二个参数 int类型的nCmdShow 窗口显示状态 SW_HIDE SW_SH0W SW_SHOWNA 这里就不一一来解释意思了
}


窗口显示了还需要做窗口的更新
更新窗口UpdateWindow 只有一个参数 咱们填写当前需要更新窗口的句柄 Hwnd 就像买了房子没装修一样


两套消息循环体系GetMessage 和 PeekMessage 消息循环中亦敌亦友的存在这
先介绍一下GetMessage函数
GetMessage 作用是获取消息队列中的消息 如果队列中一条消息也没有的话 他会一直等待直到有消息出现


GetMessage参数介绍
第一个参数是LPMSG类型的 一般只想MSG这个结构体 
第二个参数是HWND类型的句柄 指定接受属于哪一个窗口的消息 一般将这个参数设置为NULL
第三个参数 UINT类型 获取消息最小值一般设置为0
第四个参数 UINT类型 获取消息的最大值 如果三四个参数都设置为0就表示接受所有 来者不拒
写法见代码---------------------------------------




PeekMessage消息
有五个参数 前四个参数和GetMessage消息完全一样 不一样的是第五个参数
所以我们详细讲解一下第五个参数吧
第五个参数一个可以再PM_NOREMOVE和PM_REMOVE中取值 
如果取值是PM_NOREMOVE那么PeekMessage函数去除某条消息后,这条消息将不会从消息队列中被移除
如果取值是PM_REMOVEDE就会被移除,一般我们取为PM_PEMOVE 就是和GetMessage一样的取消息


举个例子GetMessage和PeekMessage Get就好像抢劫犯 有你得给  没有我就在这里等你给我
而PeekMessage 有就给我点 , 没有也不强求 所以更适合我们游戏循环


Windows程序的窗口过程函数
WindowProc函数 第一个参数HWND的句柄
第二个参数uMsg的消息ID
三四个参数是wParam lParam的附加信息 不同的情况会有不同的值


常常我们用switch、case语句来确定窗口过程接受的是什么信息  详细见代码
DestroyWindw(hwnd);销毁窗口 并发送一条WM_DESTROY消息


命名规则 匈牙利命名法
ch char类型
b BOOL类型
n int类型
w WORD类型
l LONG类型
p *指针类型
lp 远指针类型
m_ 表示类中成员 
g_ 表示局部变量名


GDI 讲解
graphics Device Interface是微软推出的一套API
设备环境(DC)
DC就是咱们绘图层 我们需要GDI来帮我们绘制图片时 , 需要获取我们的HDC
还需要我们来知道一个概念: BeginPaint  EndPaint这两个函数 必须成对出现
获取HDC 环境句柄的两种方式 
第一:BeginPaint函数 他为指定的窗口进行绘图工作的准备 并用将和绘图有关的信息填充到一个PAINTSTRUCT
结构中
{
第一个参数 HWND的窗口句柄 我说过很多遍
第二个参数 LPPAINTSTPUCT类型的lpPaint LPPAINTSTPUCT这个类型由两个部分组成 首先是LP 根据匈牙利
命名法 我们知道是代表的远指针 结合起来代表PAINTSTPUST结构体 所以我们把两部分结合起来 这个参
数就是需要填写的一个指向PAINTSTPUCT类型的结构体指针 也就是说需要创建一个对象 来取地址
}
PAINTSTPUCT 讲解:
{
第一个参数 用于绘制的句柄
第二个参数 如果非零值则擦除背景
第三个参数 通过制定左上角和右下角 的坐标确定一个要绘制的矩形范围
最后三个参数是用不到 预留的参数;
}


BeginPaint函数讲解完毕 就应该讲讲另外一个好基友 EndPaint了.
EndPaint函数
{
第一个参数 Hwnd的窗口句柄
第二个参数 和 BeginPaint函数是一样的 需要填写PAINTSTPUCT 类型的地址
}
例子:HDC dc;
PAINTSTRUCTR ps;
dc = BeginPaint(HWND,&ps); 指定窗口进行绘图工作的准备 并用将和绘图设备有关的信息填充到paintStruct
结构体中
Paint(); 绘制
EndPaint(HWND,&ps);


PS:InvalidateRect 和 ValidateRect的区别
InvalidateRect 使窗口无效 产生WM_PAINT消息
ValidateRect  使窗口有效 清除消息队列中的WM_PAINT消息 
ValidateRect 函数讲解
{
第一个参数:HWND类型的窗口句柄 如果参数为NULL (0) 则更新所有的窗口
第二个参数:指向一个包含需要生效的更新区域坐标的RECT结构体 如果参数为NULL 所有客户区都有效
}


第二:
GetDc:可以使用该函数来获取句柄 且调用完之后 要用ReleaseDC来释放DC 此函数很简单就一个参数
{
只有一个参数 : Hwnd  则就是我们窗口的句柄 GetDC函数中填上我们想要的窗口句柄来返回对应窗口
设备的上下文 
PS:如果咱们GetDC获取了窗口的DC之后 当前窗口DC就处于一直被占用的状态,使用完必须释放掉不然就
让其他应用程序无法使用了
}
有个GetDC 肯定也有基友 ReleaseDC
{
第一个参数 HWND 当前窗口句柄
第二个参数 hdc类型的dc 咱们需要释放的DC
}
例子:
HDC dc = GetDC(HWND);  获取dc
PAINT() 绘制
ReleaseDC(HWND , dc);  释放设备环境dc




Windows屏幕区域相关的概念阐述
转换坐标 一般转换客户区坐标为屏幕坐标的方法是 ClientToScreen()函数
ScreenToClient()函数则是屏幕坐标转换为客户区坐标


到此Windows基本的所需学习知识已经讲解完毕  由于学习工作原因-更新会比较慢

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值