`

《Windows游戏编程大师技巧》 四、GDI、控件和突发奇想

 
阅读更多


本章是纯粹讲述Windows编程的最后一章。谢天谢地!

高级GDI绘图

GDI比起DirectX来实在太慢了,那为什么还要了解?

1.GDI功能很全,并且是Windows与生俱来的渲染引擎。
2.如果想创建任何工具或标准应用程序,都要用到GDI。
3.GDI与DirectX混合使用,来仿真DirectX尚未实现的函数。


到底什么是图形设备描述表?

图形设备描述表HDC保存了视频卡的各种信息,访问各种GDI函数时都要用到。
对于使用GDI的任何函数,它都是必须的。并且它还保存了设置,这样省去了
GDI函数调用时的许多参数。


画笔:用于画线条和轮廓。
画刷:用于填充任何闭合的对象。

在你的系统配置中有许多画笔和画刷,但是在当前图形设备描述表中每次只有
一个画笔或画刷被激活。该过程称之为选定(selection)。对于得到的画笔或画刷,
在完成绘制图形之后必须删除该画笔或画刷。因为Windows GDI关于画笔和画刷句柄
只有有限数目的存取位置,有可能被用光!

HGDIOBJ GetStockObject(int fnObject); // 获得一些预定义的对象句柄
HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);// 创建新画笔
HGDIOBJ SelectObject(HDC hdc, HGDIOBJhObject); // 返回之前正在被使用的画笔句柄
BOOL DeleteObject(HGDIOBJ hObject); // 销毁的画笔


绘制点

使用GDI绘制点很容易,不需要画笔或画刷。
Windows GDI使用的是一个上下颠倒的第一象限的笛卡尔坐标系。



for (int index = 0; index < 1000; index++) {
int x = rand() % 400;
int y = rand() % 400;
COLORREF color = RGB(rand()%255, rand()%255, rand()%255);
SetPixel(hdc, x, y, color);
}



绘制线段

1.创建画笔,并在图形设备描述表中选定它。
2.调用MoveToEx()设定线段的起始位置。
3.调用LineTo()从起始位置到终点位置绘制线段。

HPEN blue_pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
HGDIOBJ old_pen = SelectObject(hdc, blue_pen);

MoveToEx(hdc, 10, 10, NULL);
LineTo(hdc, 50, 60);

SelectObject(hdc, old_pen);
DeleteObject(blue_pen);

绘制矩形、圆形、多边形都是类似的。


定时高于一切

PC内置有一个精确的定时器(毫秒级),但我们最好还是使用Windows内置的定时函数。
Windows将这个定时器虚拟成为几乎无限多个虚拟定时器,定时地向WinProc传递WM_TIMER
消息。



创建定时器很方便,但是该技术是有缺陷的:第一,多个定时器将发送多个消息;
第二,定时器并不那么准确;最后,在大多数游戏循环中,都希望程序以指定帧频
运行。我们可以通过查询系统时钟来实现。

while (TRUE)
{
DWORD start_time = GetTickCount();

// Retrieve msg in queue(non-block, GetMessage may block if queue is empty)
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// Lock time to 30 fps (1s / 30 = 33ms)
while ((GetTickCount() - start_time) < 33);

// Main game processing goes here
if (KEYDOWN(VK_ESCAPE))
SendMessage(hwnd, WM_CLOSE, 0, 0);
}


使用控件

游戏编程方面的书一般不讨论Windows控件功能,但了解一些可以用控件作为工具。

创建按钮:
CreateWindowEx(
NULL, // extended style
"button", // class
"PUSHBUTTON", // title
WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,
10,
10 + button * 36, // initial x, y
strlen(button_names[button]) * 16,
24, // initial width, height
hwnd, // handle to parent
(HMENU) (100 + button), // handle to menu
hInst, // instance of application
NULL);

处理按下按钮时产生的WM_COMMAND消息,上面设置了按钮控件的id是100。

case WM_COMMAND:
{
if (LOWORD(wparam) == 100)
...
}



控件同时也是窗口,也能像窗口一样接收消息。但由于它们是某个父控件的子控件,
接收到的消息被转发到父控件窗口事件句柄中。我们可以使用SendMessage()向子控件
发送消息。比如SendMessage(hwndbutton, BM_CLICK, 0, 0); 向按钮发送点击事件。


分享到:
评论

相关推荐

    Windows游戏编程大师技巧——2D和3D游戏编程基础.zip

    本资源包“Windows游戏编程大师技巧——2D和3D游戏编程基础”旨在帮助初学者快速掌握游戏开发的核心技能,提升至专业水平。下面我们将深入探讨其中涉及的重要知识点。 1. **Windows编程基础**:在Windows上开发游戏...

    Windows游戏编程大师技巧(CHM)

    第一部分为Windows编程基础,包括概述、 Windows编程、GDI、控件等知识,第二部分为DirectX和2D基础,接触了用DirectX进行各种控制及二维平面中变换的知识,第三部分编程核心则重点介绍了相关的数学、物理原理及如何...

    windows游戏编程大师技巧chapter7工程文件part2

    在《Windows游戏编程大师技巧》一书中,第七章主要探讨了如何在Windows平台上构建和优化游戏引擎,这部分是章节的第二部分,重点关注工程文件的构建和管理,以及相关的技术细节。下面将根据提供的标签和文件名,详细...

    游戏编程--大师技巧

     第四章 WindowsGDI、控件和突发奇想  高级GDI图形  点、线、平面多边形和圆  关于文本和字体  定时的重要性  使用控件  获取信息  T3D游戏控制程序  总结  第二部分 DirectX和2D基础  第五章 DirectX...

    Windows游戏编程大师技巧(第二版)

    一本学习Windows程序设计的好书,由简到难,循序渐进。从GDI到DDraw再到D3D。一步一步进入游戏编程世界。

    GDI实时进度控件

    GDI+是Microsoft Windows平台上的图形设备接口,提供了丰富的绘图功能,用于创建2D图形和文本。 这个控件的主要特点在于它的动态性,它可以随着传输数据的变化而实时更新进度,提供用户一个直观的反馈。开发者可以...

    GDI+自定义控件

    在Windows编程领域,GDI+(Graphics Device Interface Plus)是一个强大的图形绘制库,它提供了丰富的图形绘制、图像处理和文本渲染功能。自定义控件则是程序员根据特定需求创建的具有独特外观和行为的用户界面元素...

    DC介绍 + Windows+GDI和GDI+编程实例剖析

    在Windows编程中,GDI和GDI+通常用于实现用户界面的绘制,例如创建自定义控件、绘制图表或者实现复杂的图形界面。开发人员可以根据具体需求选择使用GDI或GDI+,如果追求更高的性能和更简单的编程模型,GDI+通常是...

    Windows GDI和GDI+编程实例剖析源代码

    总的来说,通过研究“Windows GDI和GDI+编程实例剖析源代码”,开发者不仅可以掌握传统的Windows图形编程技巧,也能对图形绘制有深入的理解,这对于开发复杂界面或进行性能优化的项目具有很高的价值。同时,了解这些...

    C#+gdi+平滑滚动控件

    在.NET Framework中,C#是一种常用的编程语言,用于开发各种应用程序。...通过深入研究和理解这个控件的实现,开发者不仅可以掌握自定义控件的创建技巧,还能了解到如何用GDI+实现平滑滚动,提升应用的用户体验。

    零基础学VC_Windows基本控件编程

    【零基础学VC_Windows基本控件编程】 在学习VC(Microsoft Visual C++)编程时,Windows基本控件是构建用户界面(UI)的核心元素。这些控件使得用户能够与应用程序进行交互,如按钮、文本框、复选框、单选按钮、...

    C#编写的用GDI绘制的图片显示、拖动、缩放自定义控件

    在本文中,我们将深入探讨如何使用C#编程语言与GDI+(图形设备接口)来创建一个自定义控件,该控件具有显示、拖动和缩放图片的功能,特别是支持BMP格式的图片。GDI+是.NET Framework中的一部分,提供了一套丰富的...

    C夏普 GDI编程 多控件

    综上所述,"C# GDI编程 多控件"的学习涵盖了C# Windows Forms开发的基础和进阶技巧,包括图形绘制、用户交互以及常见控件的使用。通过实践这些案例,开发者可以提升自己的Windows桌面应用开发能力,为构建功能丰富的...

    Apress - Pro .NET 2.0 Windows Forms and Custom Controls c#自定义控件,GDI,多线程....

    综上所述,《Pro .NET 2.0 Windows Forms and Custom Controls in C#》是一本涵盖了自定义控件设计、GDI+绘图、多线程编程以及WinForms综合编程技巧的经典著作。无论是对于初学者还是有经验的开发者来说,本书都是一...

    Windows编程基础.pdf

    本书将着重介绍 Windows 应用程序在 C# 环境下的开发应用,涵盖了 C# 编程基础和抽象的软件设计思想,为期望快速进入 C# Windows 程序设计领域的读者提供了一个适合的入门级教材。 课程简介 本书的课程目标是高等...

    Windows Graphics Programming Win32 GDI and DirectDraw 有效版

    总之,《Windows图形编程:Win32 GDI与DirectDraw》是一本全面而深入的指南,适合Windows应用程序开发者、游戏开发者,以及对图形编程感兴趣的读者。通过阅读此书,读者将能够掌握Windows平台上的图形处理核心技术,...

    Windows图形编程(pdf)

    在Windows图形编程中,核心概念是Windows图形设备接口(GDI)和GDI+。GDI是Windows API的一部分,提供了丰富的功能来绘制文本、图形和图像。它允许程序员控制屏幕上的像素,从而创建出复杂的用户界面和动态效果。GDI...

Global site tag (gtag.js) - Google Analytics