本文从哈利_创。转载请注明出处。有问题欢迎联系本人!

       邮箱:2024958085@qq.com

上一期的地址:

DX 9 UI设计学习笔记之二

4章 Introducing DirectInput

======================================================================

在这一章中我们要学到例如以下东西:

1、Create COM interfaces that represent and control input peripherals attached to the user’s computer.(创建代表以及控制连接到用户的电脑的输入附件的COM
接口。)

2、Set how input devices operate and are shared from program to program.(对输入设备怎样运作已经在程序间进行分享进行设置。)

3、Read information from keyboards and mice whenever events occur. This will consist of determining which keyboard keys or mouse buttons are pressed,
and reading the position of the mouse cursor.(在事件发生的时候,从键盘和鼠标读入信息。这包含确定键盘或者鼠标的哪个键或button被按下了,以及读入鼠标指针的位置。)

4、Set the mouse cursor to an image loaded from a file.(将鼠标的指针设为一个从文件加载的图片。)

4.1节 DirectInput Basics

这一节很简略地介绍了Direct Input。

4.2节 Getting Started

这一节基本上什么也没有讲。要注意的是,假设打算使用Direct Input。那么要包括头文件 dinput.h,并将库文件 dinput8.lib 连接到project中。

第4.3节 Programming

怎样创建一个可以使用 Direct Input 的应用程序?我们要遵循下面步骤:

1、Create a DirectInput object。建立一个 DirectInput
对象。

2、Create a DirectInput device objects(s)。建立一个或多个 DirectInput device
对象。

3、Configure the DirectInput device objects(s)。设置这些DirectInput device
对象的属性。

4、Acquire the device。获得该设备。

5、Read data from the device。从设备读取数据。

6、Release the DirectInput and DirectInput device object(s)。释放DirectInput
和DirectInput device
对象。

第4.4节 Creating aDirectInput Object

在最開始,我们须要调用DirectInput8Create 函数来创建指向一个IDirectInput8 实例的指针。

最后不要忘了释放IDirectInput8 对象。

第4.5节 CreatingDirectInput Devices

在创建了一个IDirectInput8 对象之后,我们须要调用它的CreateDevice 方法来创建一个DirectInput device,也就是一个IDirectInputDevice8 接口。

相同,最后不要忘了释放这个接口。

第4.6节 TheKeyboard

第4.7节 The Mouse

这两节分别具体介绍了怎样让你的DirectInput 程序支持键盘和鼠标的输入。一般的DirectX 9 教材都会讲到;只是与一般的这些教材不一样的是,这里还讲了怎样对鼠标的指针图案进行设置的话题。只是这个话题如今仅仅是开了个头,假设读者你打算自己去实验的话,会发现非常多问题的;所以我们以后再去慢慢研究吧!

======================================================================

第5章 Wrapping Direct3D

======================================================================

这一章我们要定义三个类:CXSurface、CXTexture 以及CXPen。

这一章充满了各种错误。严重怀疑作者的这些代码没有经过执行就放了上来!幸亏在本人的机智下,这些错误都已经改正了过来,嘿嘿!

第5.1节CXSurface----Wrapping Surfaces

这一节具体介绍了CXSurface类的定义及事实上现。先在一開始给出了定义,然后在第5.1.1节Instantiating and Deleting CXSurface、第5.1.2 节Loading Images、第5.1.3 节Copying Surfaces、第5.1.4 节Representing the Back Buffer、第5.1.5 节Rendering 以及第5.1.6 节Using CXSurface 这些小节中介绍了各个方法的实现以及怎样使用这个类。

当然,如前所述,这里面有各种错误。比方说在类的定义中,全部的Set 函数都有一个const 后缀。可是这显然是不正确的(这样的错误延续到了这一章的最后一个类)。另外。作者在CXSurface 类中定义了三个受保护的成员:

protected:
LPDIRECT3DSURFACE9m_Surface;
CXSurface* m_BackBuffer;
LPDIRECT3DDEVICE9m_pDevice;

然后构造函数是这样定义的:

CXSurface::CXSurface(LPDIRECT3DDEVICE9pDevice)
{
this->SetDevice(pDevice);
this->SetSurface(NULL);
m_BackBuffer = new CXSurface(pDevice);
}

只是假设你依样画葫芦的话,会发现导致错误。细致想想就行发现问题所在:这特么是无限递归啊,我去!看来作者想在一个类对象中同一时候处理surface 和backbuffer 的美好愿望落空了。于是在我的代码中。我定义了两个CXSurface 对象来分别代表要渲染的surface 和backbuffer,效果还真不错!

另外一个问题是:类定义中没有Render 方法,为何后面突然冒出来了一个?没关系。反正在我们的代码中不会用到这种方法的……

第5.2节 CXTexture----Wrapping Textures

这一节准备将texture 封装到一个类中。这里面仍然有非常多错误。

除了前面提到的全部的set 函数都以const 为后缀以外,还有就是在构造函数中没有初始化m_SrcRect。而且一个2维向量居然出现了z 分量。另外值得注意的是,在后面要提到的CXPen 类的DrawTexture 方法中。使用ID3DXSprite 类的Draw 方法时,要以CXTexture 对象的m_SrcRect 的指针为參数,可是要注意我们能够将这个指针设为0 以绘制整个texture,而这个是书上没有考虑到的。

第5.3节 CXPen----Wrapping ID3DXSprite

这一节比較简单,基本上没什么说的。当然错误还是有的。

======================================================================

以下奉上本人的代码!

地址例如以下:

DX 9 UI设计第5章代码修正版

以下是程序执行时的截图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTg3Mzk2OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这里有三幅图。

被遮挡的那幅图是拷贝到后台缓存上的一个surface。而左右的那两幅都是textures。上一次的程序有一些bug。就是这么几个:一个是全屏的时候按Alt+Enter 切换出去时会出错,另外一个是最大化的时候切换到全屏的时候会出错。本人花了非常长的时间搞定了第一个问题。然后在努力解决第二个问题的时候。又发现从全屏切换回窗体模式的时候窗体会变小,再全屏再切换回来,窗体又会变小,这样重复多次之后,窗体就小得可怜了。只是在本人的努力之下,这些问题都攻克了!如今无论你怎么样玩弄程序的窗体。都不会有问题啦,哈哈!还有非常给力的特性,就是从全屏切换回窗体的时候。窗体的大小和之前是一样的。

假设有问题的话,那么仅仅能是你的电脑出问题了。

哦,不正确。在显示surface的情况下,窗体的边界不能够跑到那个surface 的里面,否则会由于后台缓存装不下这个surface 而报错!只是没关系,你能够把绘制surface 的那个语句凝视掉。然后你就能够任意玩弄窗体了。

另外大家应该已经发现了,代码多了一个GfxStats类,而窗体左上角也有了统计数据。

这个是本人从“龙书”第二版的代码中拿来的封装了字体的类,能够在屏幕上显示文本,方便你对程序进行调试;当然大家能够无视掉,尽管这个COM 组件用很easy。

当然。计划到这个地步另一个小瑕疵,当切换到全屏,然后再切换回来时,它最大化。形式只是以最大化尺寸,但不是在通常意义上“最大限度表”。还有就是退出全职位置的形式也不与原来一样。但这些都是小问题,重要。以后我们有时间再弄吧,哈哈!

DirectX 9 UI三种设计学习笔记:文章4章Introducing DirectInput+文章5章Wrapping Direct3D的更多相关文章

  1. UI设计学习笔记(7-12)

    UI学习笔记(7)--扁平化图标 认识扁平化 Flat Design 抛弃传统的渐变.阴影.高光等拟真视觉效果,打造看上去更平的界面.(颜色.形状) 扁平化图标有什么优缺点 优点: 简约不简单.有新鲜 ...

  2. 精通ASP.Net MVC 3 框架(第三版)学习笔记

    精通ASP.Net MVC 3 框架(第三版)学习笔记 代码才是王道. http://pan.baidu.com/s/1pJyL1cn

  3. loadrunner 场景设计-学习笔记之性能误区

    场景设计-学习笔记之性能误区 by:授客 QQ:1033553122 场景假设: 每个事务仅包含一次请求,执行10000个并发用户数 性能误区: 每秒并发用户数=每秒向服务器提交请求数 详细解答: 每 ...

  4. 【卷土重来之C#学习笔记】(一)c#文章导航目录

    [卷土重来之C#学习笔记](一)c#文章导航目录 [卷土重来之C#学习笔记](二)c#编程概述 [卷土重来之C#学习笔记](三)类型.存储.对象 [卷土重来之C#学习笔记](四)类的基本概念 [卷土重 ...

  5. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  6. 电磁兼容性设计学习笔记--PCB中地的布局

    http://bbs.ednchina.com/BLOG_ARTICLE_3010439.HTM PCB上元器件的布局对整个PCB板的电磁兼容性影响很大,所以从事硬件电路设计的工程师很有必要学习PCB ...

  7. Java23种设计模式学习笔记【目录总贴】

    创建型模式:关注对象的创建过程 1.单例​模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 主要: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,但 ...

  8. Spark RDD设计学习笔记

    本文档是学习RDD经典论文<Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster ...

  9. JavaScript高级程序设计(第三版)学习笔记22、24、25章

    第22章,高级技巧 高级函数 安全的类型检测 typeof会出现无法预知的行为 instanceof在多个全局作用域中并不能正确工作 调用Object原生的toString方法,会返回[Object ...

随机推荐

  1. 看PHP在内部迭代的动作

    以下我们来了解怎样实现一个自己定义的迭代器,然后再開始慢慢理解迭代器的内部工作原理.先来看一个官方的样例: <? php class myIterator implements Iterator ...

  2. [2014 Regional]牡丹江 H Hierarchical Notation 做题记录

    主妇:老年人谁是炮灰牡丹江,我们的团队只是做同步大赛 他决定开爆震H什么时候,A 5min 1Y.I在该限制后,纠结了很久30min+ 1Y,神继续承担各种位置卡D在,hpp见B我认为这是非常熟悉的研 ...

  3. 【HDU】5256 系列转换(上涨时间最长的序列修饰)

    假设a[i]和a[j]我想的一样,满足条件的需要是 a[j] - a[i] > j - i 也就是说,a[i] - i < a[j] - j 例1 4 2 不满意,所以1和2必须有必要之间 ...

  4. 怎么确定你的CPU是否支持64位虚拟化

    http://www.grc.com/securable.htm 第一个64位表示你的电脑最多支持多少位的系统,32或者64. 第二个表示你的硬件是否支持DEP?Yes,支持.No,不支持.OFF,表 ...

  5. TRIZ系列-创新原理-22-变害为利原理

     变害为利原理的详细表述例如以下:1)利用有害的因素(特别是环境中的)获得积极的效果:   有害无害不过相对的(时间,空间,人),将有害的因素通过一定的处理和转化,能够变有害为实用,比方废品回收, ...

  6. UVA 12103 - Leonardo&#39;s Notebook(数论置换群)

    UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...

  7. DataGridView大扩展——显示行号

    原文 DataGridView大扩展——显示行号 在DataGridView 的实际使用中,经常需要标示出行号,这样可以比较醒目地看到当前信息.不过DataGridView 在绘制 DataGridV ...

  8. STM32本学习笔记EXTI(外部中断)

    参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...

  9. Java equals的一个坑

    public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...

  10. skyeye安装+arm-elf-gdb安装+模拟s3c44b0x+执行ucos4skyeye

    [假设你要引用.请阅读所有,这里是我的为期两天的过程只是一个记录] skyeye安装:ubuntu12.0432 llvm2.8 skyeye1.3.3 http://blog.chinaunix.n ...