win32游戏开发(1)--鼠标键盘响应图标绘图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36427244/article/details/83003505

实验项目名称

Windows窗口生成及基本事件处理

实验目的

Windows游戏以窗口为基础,学习Windows游戏编程,首先需要了解窗口的生成机制及基本框架代码。其次,为了让窗口响应鼠标及键盘等基本事件,需要了解并掌握如何为窗口添加相应的消息处理代码。

实验任务

根据课堂讲解的理论知识和所提供的基本代码框架的基础上完成如下任务:
1.生成一个基本的Windows窗口程序,要求使用Win32 Application类型;
2.为基本窗口程序增加自绘图标,并将图标应用于程序;
3.为基本窗口程序进一步添加鼠标消息和消息处理代码,做到点击鼠标左键时在窗口的鼠标位置绘制一个图标图案,拖动鼠标时能够连续绘制图标图案;
4.在以上程序的基础上,添加键盘处理消息和相应的处理代码,做到按下键盘的上、下、左、右键时能够朝相应的方向连续绘制图标图案;如果按下鼠标左键,再按下上、下、左、右方向键时,能够以鼠标位置为出发点,朝相应的方向连续绘制图标图案。

实验步骤

1.创建win32 application程序,项目名:test2paint.
2.往资源文件添加光标文件,图标文件
3.对消息处理函数进行修改,这一步很关键,首先明确绘图思路,为了防止图片重绘丢失,我使用一个内存兼容DC与一个兼容位图进行关联,然后使用DrawIcon()将图标绘如内存兼容DC,在执行WM_PAINT时使用bitblt()将内存兼容DC的内容绘到窗口dc中,核心代码如下:
进行必要的全局变量声明:
全局变量图
对于内存兼容DC与位图的关联操作,只需要进行一次就好了,因此我将它写在了InitInstance()函数中:
在这里插入图片描述

既然要修改程序图标,在导入了图标资源的情况下,就应该去修改 MyRegisterClass()的对应属性:
在这里插入图片描述
我们的程序既要响应鼠标点击(WM_LBUTTONDOWN),又要响应鼠标拖拽(WM_MOUSEMOVE),还要响应按键(WM_KEYDOWN),因此就有了如下代码:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
接着,只要在WM_PAINT调用bitblt()就不会丢失图像了
在这里插入图片描述
但是还有一个问题,当我放大窗口时,由于与内存兼容DC关联的位图大小是原窗口大小,因此在窗口最大化的情况下对非原窗口部分画图是无效的,这里有两种处理方法,一种就是改分辨率,一种就是改位图大小,我用的是后者,因此我在WM_SIZE写了如下代码:
在这里插入图片描述

实验数据及处理结果

对程序进行运行:
在这里插入图片描述
不论是按方向键,鼠标单击或拖拽都能绘图,移动至边界或放大窗口也不会导致图像丢失,我觉得把这些粘贴出来没有意义,就不粘贴了,因为这些功能只有视频能体现,贴图是体现不出来的.

实验后的思考

在本次实验中,遇到了很多的问题,好多问题都被我解决了,但还有一些困惑我的问题存在,而且我觉得不得不提.
第一个问题便是当我在WM_PAINT调用bitble()绘图时,原代码是这样的:
在这里插入图片描述
这时候运行程序我发现画不出图,我是这么理解的,每当调用WM_PAINT时都会产生一个新的hdc,导致bitble一直画在新的窗口句柄中而无法将内存兼容DC的内容全部画出,于是我将代码改成这样:
在这里插入图片描述
运行后发现可以画图了,但是百度后没有发现有哪个论坛是明确给出答案的,所以不知道我理解的对不对.
第二个问题是如果这里我不是用DrawIcon()而是全部换成bitblt()绘图,那还需要一个内存兼容dc与loadbitmap()后的位图关联,但是尝试后发现窗口会变成黑色且画不出图.想不到解决方法我只好改回DrawIcon()了.

项目源代码下载

请点击这里 源代码下载地址

扫描二维码关注公众号,回复: 3570456 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_36427244/article/details/83003505