本章是纯粹讲述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, HGDIOBJ hObject);              // 返回之前正在被使用的画笔句柄
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游戏编程大师技巧》 四、GDI、控件和突发奇想相关推荐

  1. 开始利用CSDN做学习笔记,从windows 游戏编程大师技巧和3D游戏编程大师开始

    利用两个月的空余时间将windows 游戏编程大师技巧和3D游戏编程大师技巧看了一遍. 第一遍读的并不深入,代码也没有仔细研究.特别是3D下册,基本只是草草浏览了一遍而已.这一遍是为了对整体有个印象和 ...

  2. 《Windows游戏编程大师技巧》(第二版)第2章

    因此几乎是一夜间,Windows 95就改变了整个计算机行业.的确,目前还有一些公司仍然在使用Windows 3.1(你能相信吗?),但是Windows 95使得基于Intel的PC成为除游戏之外的所 ...

  3. Windows游戏编程大师技巧(一)

    第一章 无尽之旅 Windows编程是一场由来已久并还在进行着的战争.开始时,游戏程序拒绝Windows平 台,但正如Borg所言:"反对无效......",我也赞同这一观点.本章 ...

  4. 《Windows游戏编程大师技巧》(第二版)第1章(上)

    第1章 学海无涯 "Oh, you want some too?!?" -Hudson, Aliens Windows 编程就像是一场由来已久并还在进行着的战争.尽管游戏程序员曾经 ...

  5. 《Windows游戏编程大师技巧》(第二版)第11章

    第三部分:核心游戏编程   第11章 算法.数据结构.内存管理和多线程   第12章 人工智能   第13章 游戏物理   第14章 文字时代   第15章 综合运用:编写游戏! 第11章 算法.数据 ...

  6. 《Windows游戏编程大师技巧》三、Windows高级编程

    Windows编程很绝的地方在于:你不用了解太多细节,就可以完成很多工作. 使用资源 资源就是你的程序代码结合在一起的多块数据,可以被程序本身在运行时加载. 资源应当也放在程序的.EXE文件中的原因是 ...

  7. 《Windows游戏编程大师技巧》(第二版)第1章(下)

    实例:FreakOut 在沉溺于所讨论的有关Windows.DirectX 和3D 图形之前,应当暂停一下,先给你看一个完整的游戏--虽然简单了一点,但毫无疑问是一个完整的游戏.你会看到一个实际的游戏 ...

  8. Windows游戏编程大师技巧第二版学习笔记之第一章 实验补充

    前面记录的一下看书中的重点,编程还是要动手,下面就来动手试试,这里选择VC6.0编译器 这里先来配置游戏编程环境,原书中的dx81sdk_full.exe一共是1百多MB,其实没必要整那么多,看我在我 ...

  9. 《windows游戏编程大师技巧》第五章:DirectX基础知识和令人生畏的COM

    1.DirectX组件 DirectX是基于COM实现的,比系统自带的GDI和MCI更快.更稳定,其包括许多组件,如: ●DirectDraw(DirectX 8.0以上的版本不包含) ●Direct ...

  10. Windows游戏编程大师技巧之三角形填充

    一.三角形的种类 三角形一般可以分为如下的四种类型(这四种类型是对于计算机来说的,不是数学意义上的分类): 平顶三角形:就是在计算机中显示的上面两个顶点的Y坐标相同. 平底三角形:就是在计算机中显示的 ...

最新文章

  1. pandas高级处理-数据离散化
  2. 云盘存储 教学反思_对设计训练的设计:以建筑工房工作模型课题的教学实验为例对设计训练方法论的反思...
  3. JAVA如何在画板加分数_自学了java一段时间,做了个最低配的画板
  4. TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性)
  5. java 短信猫发送短信的方法
  6. springboot中获取bean_最新Spring Boot干货总结(超详细,建议收藏)
  7. android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件
  8. register_globals(全局变量注册开关)
  9. LeetCode 49. 字母异位词分组(哈希)
  10. JavaScript初阶(十)---------- 数组
  11. ENVI5.1中Landsat 8数据大气校正
  12. Microsoft Visio绘图
  13. c语言循环语句解鸡兔同笼,JavaScript的for循环语句练习之解决鸡兔同笼问题
  14. 桌面池计算机置备,Horizon View 7 发布Win10桌面二:即时克隆桌面池配置
  15. python数字识别kaggle论文_基于Python语言Kaggle的数据集分析
  16. sem_wait和sem_post
  17. 【Android开发经验】Android移动UI设计经验总结
  18. Win10环境下基于Hexo的静态博客环境搭建,及其阿里云部署
  19. linux 中 lrwxrwxrwx是什么意思?
  20. Python爬虫获取代理ip及端口

热门文章

  1. android 调出键盘表情_keyboard dialog 仿微博表情键盘输入框,keyboarddialog
  2. C#操作明华澳汉读写器读写M1卡往扇区块写入读取值小结
  3. JavaScript高级程序设计 总结(一)详细版
  4. matlab分析傅里叶级数
  5. 机器人教室外墙_智慧教室之机器人创客教室建设方案
  6. 机器学习的数学基础——线性代数篇(一)
  7. 自动驾驶仿真:Carsim、NI和VTD联合仿真课题一
  8. jenkins集成sonar问题记录
  9. Dubbo视频教程《基于Dubbo的分布式系统架构视频教程》----课程列表
  10. Oracle日期函数和转换函数