Windows桌面应用程序(1-2-2-4th) 绘画窗口
2017-12-31 22:55
260 查看
你已经创建了你的窗口。现在你想展示一些东西。在Windows术语中,这被称为绘画窗口。混合隐喻,一个窗口是一张空白的画布,等着你来填充它。
有时你的程序会启动绘画来更新窗口的外观。在其他时候,操作系统会通知您必须重新绘制一部分窗口。发生这种情况时,操作系统将窗口发送WM_PAINT消息。必须涂漆的窗口部分称为更新区域。
第一次显示一个窗口时,窗口的整个客户区必须被绘制。因此,当您显示一个窗口时,您总会收到至少一条WM_PAINT消息。
显示窗口更新区域的插图
您只负责绘制客户区域。操作系统自动绘制包括标题栏在内的周围框架。完成绘制客户区后,清除更新区域,该区域告诉操作系统,直到发生某些更改之前,不需要发送另一个WM_PAINT消息。
现在假设用户移动另一个窗口,以便遮住窗口的一部分。当被遮挡的部分再次变为可见时,该部分被添加到更新区域,并且你的窗口接收到另一个WM_PAINT消息。
显示两个窗口重叠时更新区域如何变化的插图
如果用户拉伸窗口,更新区域也会改变。在下图中,用户向右拉伸窗口。窗口右侧新近暴露的区域被添加到更新区域:
显示调整窗口大小时更新区域如何变化的插图
在我们的第一个示例程序中,绘画例程非常简单。它只是用纯色填充整个客户区域。尽管如此,这个例子足以证明一些重要的概念。
通过调用BeginPaint函数开始绘画操作。这个函数用重绘请求的信息填充PAINTSTRUCT结构。当前更新区域在PAINTSTRUCT的rcPaint成员中给出。此更新区域是相对于客户区域定义的:
显示客户区域的起源的例证
在你的绘画代码中,你有两个基本的选择:
绘制整个客户区,而不管更新区域的大小。任何超出更新区域的内容都会被剪切掉。也就是说,操作系统忽略它。
通过在更新区域内部绘制窗口部分来优化。
如果你总是绘制整个客户区域,代码会更简单。但是,如果绘制逻辑复杂,跳过更新区域以外的区域会更有效。
以下代码行使用系统定义的窗口背景色(COLOR_WINDOW)以单一颜色填充更新区域。COLOR_WINDOW指示的实际颜色取决于用户当前的配色方案。
FillRect的细节对于这个例子并不重要,但是第二个参数给出了要填充的矩形的坐标。在这种情况下,我们传入整个更新区域(PAINTSTRUCT的rcPaint成员)。在第一个WM_PAINT消息上,整个客户区需要被绘制,所以rcPaint将包含整个客户区。在随后的WM_PAINT消息中,rcPaint可能包含一个较小的矩形。
FillRect功能是图形设备接口(GDI)的一部分,它已经为Windows图形提供了很长时间的支持。在Windows 7中,微软推出了一个名为Direct2D的新图形引擎,它支持诸如硬件加速等高性能图形操作。Direct2D还可以通过Windows Vista平台更新和Windows Server 2008通过Windows Server 2008平台更新获得Windows Vista(GDI仍然完全受支持)。完成绘画后,调用EndPaint函数。此函数清除更新区域,它向Windows发出窗口已完成绘制自己的信号。
下一个
关闭窗口
原文链接:Painting the Window
有时你的程序会启动绘画来更新窗口的外观。在其他时候,操作系统会通知您必须重新绘制一部分窗口。发生这种情况时,操作系统将窗口发送WM_PAINT消息。必须涂漆的窗口部分称为更新区域。
第一次显示一个窗口时,窗口的整个客户区必须被绘制。因此,当您显示一个窗口时,您总会收到至少一条WM_PAINT消息。
显示窗口更新区域的插图
您只负责绘制客户区域。操作系统自动绘制包括标题栏在内的周围框架。完成绘制客户区后,清除更新区域,该区域告诉操作系统,直到发生某些更改之前,不需要发送另一个WM_PAINT消息。
现在假设用户移动另一个窗口,以便遮住窗口的一部分。当被遮挡的部分再次变为可见时,该部分被添加到更新区域,并且你的窗口接收到另一个WM_PAINT消息。
显示两个窗口重叠时更新区域如何变化的插图
如果用户拉伸窗口,更新区域也会改变。在下图中,用户向右拉伸窗口。窗口右侧新近暴露的区域被添加到更新区域:
显示调整窗口大小时更新区域如何变化的插图
在我们的第一个示例程序中,绘画例程非常简单。它只是用纯色填充整个客户区域。尽管如此,这个例子足以证明一些重要的概念。
switch(uMsg){ case WM_PAINT: { PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd,&ps); // All painting occurs here, between BeginPaint and EndPaint. FillRect(hdc,&ps.rcPaint,(HBRUSH)(COLOR_WINDOW+1)); EndPaint(hwnd,&ps); } return 0; }
通过调用BeginPaint函数开始绘画操作。这个函数用重绘请求的信息填充PAINTSTRUCT结构。当前更新区域在PAINTSTRUCT的rcPaint成员中给出。此更新区域是相对于客户区域定义的:
显示客户区域的起源的例证
在你的绘画代码中,你有两个基本的选择:
绘制整个客户区,而不管更新区域的大小。任何超出更新区域的内容都会被剪切掉。也就是说,操作系统忽略它。
通过在更新区域内部绘制窗口部分来优化。
如果你总是绘制整个客户区域,代码会更简单。但是,如果绘制逻辑复杂,跳过更新区域以外的区域会更有效。
以下代码行使用系统定义的窗口背景色(COLOR_WINDOW)以单一颜色填充更新区域。COLOR_WINDOW指示的实际颜色取决于用户当前的配色方案。
FillRect(hdc,&ps.rcPaint,(HBRUSH)(COLOR_WINDOW+1));
FillRect的细节对于这个例子并不重要,但是第二个参数给出了要填充的矩形的坐标。在这种情况下,我们传入整个更新区域(PAINTSTRUCT的rcPaint成员)。在第一个WM_PAINT消息上,整个客户区需要被绘制,所以rcPaint将包含整个客户区。在随后的WM_PAINT消息中,rcPaint可能包含一个较小的矩形。
FillRect功能是图形设备接口(GDI)的一部分,它已经为Windows图形提供了很长时间的支持。在Windows 7中,微软推出了一个名为Direct2D的新图形引擎,它支持诸如硬件加速等高性能图形操作。Direct2D还可以通过Windows Vista平台更新和Windows Server 2008通过Windows Server 2008平台更新获得Windows Vista(GDI仍然完全受支持)。完成绘画后,调用EndPaint函数。此函数清除更新区域,它向Windows发出窗口已完成绘制自己的信号。
下一个
关闭窗口
原文链接:Painting the Window
相关文章推荐
- Windows桌面应用程序(1-2-1-4th) 什么是窗口?
- Windows桌面应用程序(1-2-3-4th) 在COM中创建一个对象
- C#编写Windows桌面应用程序窗口全屏显示
- Windows桌面应用程序(1-2-2-2nd) 窗口消息
- Windows桌面应用程序(1-2-2-3rd) 编写窗口过程
- Windows桌面应用程序(1-2-4th) 模块3.Windows图形
- Windows桌面应用程序(1-2-4-4th) 您的第一个Direct2D程序
- Windows桌面应用程序(1-2-2-1st) 创建一个窗口
- Windows桌面应用程序(1-2-5-4th) 其他鼠标操作
- 远程桌面登录Windows 7 时报Atbroker.exe 应用程序错误
- Windows桌面应用程序(1-2-4-5th) 呈现目标,设备和资源
- C# Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法
- Windows桌面应用程序(1-2-1st) Windows编程简介在C++中
- windows之 会话、工作站、桌面、窗口之间的关系
- electron之Windows下使用 html js css 开发桌面应用程序
- Windows桌面应用程序(1-1st) 使用DirectX创建您的第一个Windows应用程序
- 屏蔽控制台应用程序的窗口#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
- 学习C++在windows下窗口应用程序开发(三)
- 用HTML开发Windows桌面应用程序
- PHP开发Windows桌面应用程序实例