Win窗口编程与DOS下编程不同,但相似。 应用程序也有其入口函数。 DOS程序中的入口函数是主函数,程序的入口函数是函数。 新建一个Win32,选择Empty proj,完成项目创建。 添加.c文件,具体编码如下:
#
int ( , , PSTR , int )
(NULL,“你好世界”,“标题”,0);
0;
()函数是入口函数。 调用()函数后,返回0结束应用程序。 ()函数的作用是弹出一个确认对话框,并在这个对话框上显示Hello World。 它很简单,但是已经脱离了命令行,开始了基于窗口的编程。
消息循环
应用程序是基于窗口的应用程序,整个操作系统是消息驱动的。 这意味着窗口乃至整个系统中发生的事件都被封装成各种消息。 OS和APP通过接收消息并分析消息中附带的参数信息来进行相关处理。 无论程序是用什么语言开发的,它都必须有一个在运行时可以接受和处理消息的循环。 这就是程序的核心内容——消息循环机制。
它包括以下类型的消息:
1. 系统定义的消息
2. 应用程序定义的消息
那么消息传递是如何工作的呢? 这里,有一个概念,叫消息队列。 操作系统有自己的消息队列,每个程序也有自己的消息队列。 当系统中发生事件时,例如单击鼠标或按下键盘上的某个键,操作系统会将时间转换为消息结构并将其放入自己的消息队列中。 根据消息中的句柄将消息分发到应用程序的消息队列中。 应用程序使用该函数来确定是否有消息,使用该函数来检索消息,使用该函数来转换消息,最后使用该函数来分发消息。 典型处理案例如下:
为了(;;)
if((&msg,NULL,0,0,)) //判断消息是否为
if((&msg,NULL,0,0))//获取消息
(&msg);//消息转换
(&msg);//分发消息
别的
休息;
消息下发后,操作系统通过回调机制调用应用程序自带的消息处理函数来处理消息。 所谓回调与应用程序调用操作系统的API函数相反。 操作系统调用应用程序的函数。 这个过程称为回调。 回调函数示例如下:
(HWND hwnd , UINT , , )
()
案件:
//做
0;
案件:
//做
0;
案件:
(0);
0;
(hwnd、、、);
在这个函数中,利用-case结构对不同的消息进行不同的处理是程序的核心部分。
GDI绘图
绘图是游戏的首要任务,其次是操作,需要响应来自键盘等输入设备的消息。 绘图最基本的需求是GDI,即图形设备接口。 GDI函数大致可以分析为以下四类:
1. 获取(或创建)和发布(或清除)设备内容的功能。 绘图时需要设备内容句柄。 GetDC 和 函数可用于在非消息处理期间执行此操作,而 和 函数可在消息处理期间用于绘图。
2.绘图函数,比如在窗口的显示区域显示一些文字的函数。
3. 设置和获取设备内容参数的函数。 设备内容的“属性”决定了绘图功能如何工作的细节。 例如,用于指定绘制文本的颜色。 设备上下文的所有属性都有默认值,这些默认值是在获取设备上下文时设置的。 对于所有Set函数,都有相应的Get函数来获取当前设备内容属性。
4、使用GDI对象的功能。 GDI 对象包括用于创建填充封闭区域的画笔、字体、位图等的画笔。
注意:位图是与显示设备上的像素相对应的矩形位阵列。 它们是位图图形的基本工具。 位图通常用于在视频监视器或打印机上显示复杂的图像。 位图还可用于显示必须快速绘制的小图像。 GDI 支持两种形式的位图 - 旧的“设备相关”位图(它们是 GDI 对象)和新的“设备无关”位图(可以存储在磁盘文件中)。
设备内容句柄
在绘图之前,必须首先获取设备内容的句柄。 获取和释放设备上下文句柄的最常见方法是在处理消息时使用和调用:
hdc = (hwnd, &ps);
//做
(hwnd,&ps);
变量ps是一个类型的结构体,该结构体的hdc字段是返回的设备内容句柄。 该结构体还包含一个名为RECT的结构体,它定义了一个包围窗口显示区域无效范围的矩形。 使用从中获取的设备上下文句柄,您只能在该区域内进行绘制。 致电使该区域有效。
程序在处理非消息时也可以获取设备内容:
hdc = GetDC(hwnd);
//做
(hwnd,hdc);
该设备上下文适用于带有窗口句柄hwnd的显示区域。 这些调用与 和 的组合之间的基本区别在于,可以使用从 GetDC 返回的句柄来绘制整个显示区域。 当然,GetDC不会使显示区域中任何可能无效的区域变得有效。
程序还可以获得适用于整个窗口(不仅仅是窗口的显示区域)的设备上下文句柄:
hdc = (hwd);
//做
(hwnd,hdc);
除了显示区域之外,该设备内容还包括窗口的标题栏、菜单、滚动条和框架。 该功能很少使用,如果想尝试使用它,必须拦截处理消息并使用它在窗口的非显示区域上进行绘制。
GetDC和获取的设备内容都与视频显示上的特定窗口相关。 另一个获取设备上下文句柄的更通用的函数是:
hdc = (,,,pData);
// 做
(HDC);
您还可以在调用 GetDC 时使用 NULL 参数来获取整个屏幕的设备内容句柄。 使用位图时,有时获取“内存设备内容”很有用:
=(hdc);
//做
();
您可以选择一个位图到内存设备内容中,然后使用 GDI 函数在位图上绘制。
可以使用 or 函数自定义一个“逻辑画笔”,因为这些函数在创建画笔时不需要设备上下文句柄作为参数,也就是说,这两个函数创建的画笔是一个与设备无关的逻辑画笔直到通话结束后。 只有这样它才会连接到设备内容。 因此,同一个逻辑刷可以用于不同的设备。
创建画笔:
hpen = (, ,);
是画笔的样式,可以是:,等价的值,是画笔的宽度。 如果为0,则表示画笔的宽度为1个像素。 如果画笔样式选择为虚线或虚线且宽度值设置为大于1,则将使用真实值。 线刷用于代替这些虚线刷进行绘制。 在支持缩放的图像中使用这些虚线时要特别小心,因为一旦缩放的线宽超过 1,它们就会变成实线。这是笔的颜色
还可以通过创建类型结构(逻辑画笔)然后调用 () 来创建画笔。
;
该结构体具有三个变量,和()。
然后传递结构体的地址来创建画笔:
hpen = (&);
定义画笔是一个“GDI对象”,所以使用后必须删除自定义的GDI对象,如(hpen);
GDI 位图对象
GDI 位图对象有时称为设备相关位图 (DDB)。 DDB是图形设备接口的图形对象之一(还包括笔、画笔、字体和调色板)。 这些图形对象存储在GDI模块内部,并由应用软件以句柄号的形式引用。 DDB 句柄可以存储在类型变量中(位图句柄)。
;
然后,通过调用DDB创建的函数来获取句柄,例如
函数用法如下:
= (cx,cy,,,位);
该函数配置并初始化GDI内存中的一些内存来存储位图和实际位图的信息。 前两个参数是以像素为单位的位图的宽度和高度,第三个参数是颜色平面。 第四个参数是每个像素的位数,第五个参数是指向以特定颜色格式存储的位数组的指针。 该数组包含用于初始化 DDB 的图像。 如果不想使用现有图像初始化DDB,可以将最后一个参数设置为NULL。
当程序使用完位图后,必须清除该内存:
();
您可以使用 ap 来简化问题:
= ap(hdc, cx, cy);
该函数创建与设备兼容的位图,hdc 是该设备的内容句柄。 通常设备内容是指特殊的图形输出设备(如显示器或打印机)及其设备驱动程序。 内存设备内容仅位于内存中,它不是真正的图形输出设备,可以说是与指定的真实设备“兼容”。 要创建内存设备内容,您必须首先拥有实际设备的设备内容句柄。 如果是hdc,可以使用如下方法创建内存设备内容:
=(hdc);
创建的存储设备的内容最终必须被删除。