摘要:
对C++代码而言,内存泄漏问题虽然有诸多方法避免,但实际代码编写的时候,或出于自信或出于复杂性的考虑,常常还会用到原始的operator new,这不可避免的会带来内存泄漏的可能,不久前本人因为违反了"可用于被多态继承的基类其析构函数应当有virtual修饰"的法则( 一不小心就忘了写virtual ^_^ ),导致了内存泄漏,因此我觉得出于安全考虑,在代码中加入内存泄漏检查机制还是很必要的,也因为这次的内存泄漏事件促使我写出这一篇文章.VC++中本身就有内存泄漏检查的机制,你可以在向导生成的支持MFC的工程中看到如下代码:#ifdef _DEBUG#define new 阅读全文
posted @ 2011-05-06 17:51
carekee
阅读(315)
评论(0)
推荐(0)
摘要:
如果OLE控件不存在的话,在 try { HRESULT hr; hr = ::CoInitializeEx( Null, COINIT_APARTMENTTHREADED ); if( FAILED(hr) ) _com_issue_error(hr); LabLE1: hr = m_lpAnimator.CreateInstance(CLSID_GifAnimator); if( FAILED(hr) ) _com_issue_error(hr); //如果控件没有注册,就会抛出异常 } catch( _com_error e ) { /////////////////////////// 阅读全文
posted @ 2011-05-06 17:46
carekee
阅读(575)
评论(0)
推荐(0)
摘要:
在WPF中,我们使用Mode3D等API来绘制三维场景,当期间的“三角形”超过一定数量时,整个场景的渲染速率直线下降,无论显卡的运行速度有多快,帧率都维持在3、5帧每秒。XNA是微软推出的一套游戏开发API,作为Managed DirectX的进化版,XNA同样封装了DirectX的底层API,此外还提供了一系列和游戏生命周期相关的类,大大减轻了传统Win32下DirectX开发的烦琐。本文试图让XNA“嵌入”在WPF的Browser Application中,使用XNA来渲染场景,并以XBAP的方式在互联网上发布,集XNA的高效和WPF的部署方便为一生,免除了开发人员在部署、安装、升级应用程 阅读全文
posted @ 2011-05-06 17:03
carekee
阅读(675)
评论(0)
推荐(0)
摘要:
使用 WriteableBitmap 类基于每个框架来更新和呈现位图。这对于生成算法内容(如分形图像)和数据可视化(如音乐可视化工具)很有用。 WriteableBitmap 类使用两个缓冲区。“后台缓冲区”在系统内存中分配,它可以累计当前未显示的内容。“前台缓冲区”在系统内存中分配,它包含当前显示的内容。呈现系统将前台缓冲区复制到视频内存中以便显示。 两个线程使用这两个缓冲区。“用户界面 (UI) 线程”生成 UI 但不将其呈现在屏幕上。UI 线程响应用户输入、计时器以及其他事件。一个应用程序可以具有多个 UI 线程。“呈现线程”撰写和呈现 UI 线程的变化。每个应用程序只有一个呈现线程。 阅读全文
posted @ 2011-05-06 17:00
carekee
阅读(18542)
评论(4)
推荐(6)
摘要:
客户端运行ClickOnce应用程序时,有可能会出现如下错误: 这是由于在客户端的GAC(全局程序集缓存)中,缺少相应的dll文件。这些Dll文件一般是第三方类库,或是一些系统库,本来需要客户端自己安装的,但客户端没有安装这些dll文件,最终导致我们的应用程序无法运行。因此我们要帮客户装上这些东西。ClickOnce应用程序和Windows Installer应用程序不同,客户不需要安装就能运行。但带来的不便之处是,我们在运行ClickOnce应用程序时,不能像运行Windows Installer那样在ClickOnce中把这些缺少的dll文件安装到GAC目录下。所幸可以通过发布选项中的Pr 阅读全文
posted @ 2011-05-06 16:58
carekee
阅读(2787)
评论(1)
推荐(0)
摘要:
下载SDK实验室的指纹工具是U.are.U 4000,在http://www.digitalpersona.com,经过一系列登陆后,可以下得SDK。这是一个压缩包,解压后如下: 安装SDK进入SDK目录,双击安装文件: 一系列Next后,可以看到,该SDK支持.Net、Java等托管语言,这是我想要的:)进入.Net目录,打开一个Sample工程,运行后:点击Enroll登记指纹: 点击Verify验证刚才登记的指纹:这是正确的情况: 这是错误的情况:完了! 阅读全文
posted @ 2011-05-06 16:56
carekee
阅读(577)
评论(2)
推荐(0)
摘要:
前文我简要的介绍了在WPF中,如何控制摄像头移动,已达到动画的效果。也带来了一个新的问题:摄像头移动的时候,毫无阻拦,这就是所谓的“穿墙模式”。有没有什么办法解决这个问题呢?有,就是在移动摄像头前先进行“碰撞检测”,确定摄像头的新位置区间中没有其他的三维模型。本文将介绍如何在WPF中进行三维碰撞检测。利用Rect3D.IntersectsWith 方法在进入下一节前,先看看最简单的碰撞检测方式:利用Rect3D.IntersectsWith 方法。Model3D有一个Bounds属性,用来表示该Model3D的边界: 该属性是Rect3D类型的,我们可以使用IntersectsWith 来确定 阅读全文
posted @ 2011-05-06 16:55
carekee
阅读(1419)
评论(0)
推荐(0)
摘要:
概述在三维场景里,Camera是不可或缺的元素。和人的眼睛一样,场景中现实的内容,实际上是Camera“看到”的。下图是在Google Sketchup里,Left视角的Camera所“看到”的内容: 和常见三维建模软件类似,在WPF的3D里,也涉及到Camera对象,在WPF里,有三种Camera:MatrixCameraPerspectiveCameraOrthographicCamera投影摄像机上述三种Camera中,PerspectiveCamera和OrthographicCamera属于投影摄像机,它将三维空间里的物体,投影到一个平面上,而这的不同之处在于,Orthographi 阅读全文
posted @ 2011-05-06 16:54
carekee
阅读(5188)
评论(0)
推荐(0)
摘要:
前文介绍了Viewport3D中的两种摄像机:OrthographicCamera和PerspectiveCamera。在3D场景里漫游,最主要的工作就是针对用户输入(例如鼠标左右移动、键盘按下A、W、S、D等键)来改变摄像机的位置、方向。本文接下来介绍如何通过改变PerspectiveCamera的属性,来达到场景的漫游效果。摄像机动作我摄像机的动作可以分成三类、移动、旋转、拉升镜头。用一个枚举来描述这些动作:public enum SceneCameraAction{ MoveForward, //向前移动 MoveBack, //向后移动 MoveLeft, //向左移动 MoveRig 阅读全文
posted @ 2011-05-06 16:54
carekee
阅读(799)
评论(0)
推荐(0)
摘要:
WPF 的 Browser Application,运行于IE、Firefox(需要插件)等浏览器中,方便了部署,但也受至于浏览器的安全性限制。例如,有时候,需要访问磁盘上某个文件时,普通的Browser Application会出现“为授予信任(Trust not granted)”的错误: 以下是解决方案修改安全属性打开项目属性,选择Security选项卡,选择“This is a full trust application”单选框: 也可以根据项目具体内容,选择“This is a partial trust application”,然后设置相应权限。添加代码签名申请一个证书在开发阶 阅读全文
posted @ 2011-05-06 16:52
carekee
阅读(761)
评论(0)
推荐(0)
摘要:
对我来说,WPF比MFC好了不止一百倍:同样的工作,用C#比用C++,开发效率至少提高了200%;在UI制作方面,WPF比MFC更容易做出绚丽的效果;WPF应用程序能嵌入在IE浏览器中,方便部署、维护。随着Windows 7发布脚步的渐进,未来桌面程序的开发,必定属于WPF的。现在,我们还有理由拒绝WPF吗?接下是一个WPF中文件选择控件的例子,先上效果图: 点击后,出现选择文件对话框: 选择文件后,自动将文件显示在图片框中:代码上很简单,除去VS自动生成的代码,总代码不超过10行,且都是在设计器里用鼠标完成的,整个过程除了输入一些名称,不需要敲一下键盘,历时2分钟:<Window x: 阅读全文
posted @ 2011-05-06 16:50
carekee
阅读(9304)
评论(3)
推荐(0)
摘要:
近年来,Google的扩展意图真的好猛啊,尤其是在传统的互联网方面。Google自身的GWT,加上ExtJs的支持,轻而易举地进入企业RIA市场。那些熟悉Java的开发人员,几乎不需要具备任何Javascript、AJAX的知识,只要调用GWT包,就能编写出华丽的RIA应用程序。反观Adobe的Flex,虽然起步早,但由于缺乏后台服务语言的支持,现今依旧停留在无限美好的YY中。微软在经历了Silverlight 1.0、2.0时代和Flex的缠斗后,终于意识到,它在RIA领域最大的敌人其实是Google,为此,及时地在3.0里增加了.Net RIA Service的功能。自此,Silverli 阅读全文
posted @ 2011-05-06 15:03
carekee
阅读(413)
评论(0)
推荐(0)
摘要:
Silverlight 3 Beta发布了!其中,ChildWindow是一个令人激动的控件。使用ChildWindow,终于在应用程序里轻松地弹出对话框,而不用Popup。接下来我就在项目里添加一个登录的对话框:在解决方案中添加一个ChildWindow:在Experssion Blend 3里打开LoginWindow,可以看到Silverlight已经为我们添加了一些项目:按照美工图,把界面修改如下:接下来修改代码,我把弹出登录窗口放在Socket连接上服务器后:protected void OnClientConnected(object sender, AsyncConnection 阅读全文
posted @ 2011-05-06 15:02
carekee
阅读(775)
评论(0)
推荐(0)
摘要:
作为.Net Framework中的“古董级”类,Socket类无论在1.0,还是最新的3.5 sp1的网络编程里,都占据着极其重要的作用。优化网络架构,一直是开发人员追求的问题。在2.0时代,我们使用异步Socket(Begin、End等方法)来增强性能,不过,这类方法往往要初始化一个IAsyncResult的对象,这给.Net的GC带来了额外的负担。因此,从2.0 sp1起,.Net Framework的Socket类里又多了一种新的异步方式(Async),Silverlight从2.0起,支持通过Async Socket的方式和服务器通信。Async Socket首先让我们来看看使用As 阅读全文
posted @ 2011-05-06 15:01
carekee
阅读(1718)
评论(1)
推荐(0)
摘要:
事务事务,要做的或所做的事情。我们通常使用事务管理器来计划某天要做的事。Windows Vista包含了一个叫做Windows日历的东西,就是一个简单的事务管理系统: RIA Services虚拟实验室里的事务管理系统,用到的核心技术为Microsoft .NET RIA Services,目前最新版本为March 09’Preview。在RIA Services前,我们往往使用前台Silverlight,后台WCF的组合来构建RIA应用程序,虽然该组合能解决开发过程中的所有问题,不过也存在一些不便之处:为了减少系统的耦合度,我们通常把一个系统分成表现层(Silverlight)、业务逻辑层( 阅读全文
posted @ 2011-05-06 14:59
carekee
阅读(212)
评论(0)
推荐(0)
摘要:
IIS中的FTP服务器可能是最不为人知的组件了,它太弱小,以至于很多黑客都不懈攻击它。看着大家宁肯用诸如ServerU等收费FTP服务程序也不愿用免费的自家的FTP,什么都喜欢插一腿的微软终于坐不住了。于是伴随着Server 2008和IIS7.0,一个名为FTP 7的东西出现了。这个据说重写了全部代码的东西看上去功能强大了不少。安装FTP 7.0首先需要下载,由于我的Server 2008是64为版本,所以我选择x64的:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=584cacf6-7 阅读全文
posted @ 2011-05-06 14:57
carekee
阅读(8606)
评论(0)
推荐(0)
摘要:
虚拟实验室引擎的需求之一就是人物漫游功能:即用户操纵人物在场景中移动。这就意味着在开发引擎的时候,要考虑到场景的某些地方,人物是无法移动到上面去的(例如河流,花坛)。我们还需要在场景上做一些“手脚”,来标记哪些区域允许移动,哪些区域不允许移动。例如,下图中,蓝色部分(用1表示)的区域是允许用户移动的区域,而红色(用0表示)则是不允许。 VGridPlace扩展VPlace我扩展了VPlace类,增添了一些变量和方法:下表给出了这些属性或方法的定义及说明: 属性名类型说明ValueInt32[]地图每一个网格的值,1表示可行,0表示不可通行PlaceWidthInt32地图横向有几个格,Plac 阅读全文
posted @ 2011-05-06 14:55
carekee
阅读(342)
评论(0)
推荐(0)
摘要:
和UIPlace类似,UIItem继承自UIObject,为虚拟实验室中物品(VItem)提供一个可渲染的对象。其继承关系如下:配置文件前文说过,在虚拟实验室的引擎中,我使用两类XML文件来传递数据,这两个XML文件分别对应“灵魂”(V开头)和“外表”(UI开头)。关于VItem的属性文件,为以下形式:<person name='周慊' centerX='73' centerY='144' x='1100' y='780' file='engine1/michael.xml' id=' 阅读全文
posted @ 2011-05-06 14:54
carekee
阅读(321)
评论(0)
推荐(0)
摘要:
在前面的章节里,我们完成了UIPlace的开发,来载入一个场景。有时候,会遇见这样的问题:当一个场景很大的时候(大大超出了显示器的大小),或者仅需要在屏幕的某一个区域中显示这个场景。这意味着我们在执行屏幕输出的时候,只需要在输出场景的一部分,至于其他的部分,需要通过和用户交互的手段(例如将鼠标移到显示区域的边缘,然后按下鼠标)来切换。为此,在虚拟实验室的引擎中,我引入了一个Stage对象,专门负责显示部分场景,以及和用户交互(接受鼠标点击滚动舞台)。舞台和场景舞台和场景的关系如下图所示:上图中,舞台的大小远远小于场景(UIPlace),因此,我可以通过鼠标点击地图滚动区域(浅黄色部分)来移动舞 阅读全文
posted @ 2011-05-06 14:54
carekee
阅读(222)
评论(0)
推荐(0)
摘要:
本文将继承UIObject,实现背景的渲染,包括读取图片。和VPlace相应,我用一个继承关系来实现虚拟实验室引擎的渲染类,其中,UIPlace对应的是背景,而UIItem对应的是前景,本章将讨论如何实现UIPlace:Xml文件如前文所述,在引擎的设计过程中,我使用两个Xml文件来装载引擎对象的数据:一个Xml文件(属性文件)包括该对象的特殊属性(例如大小、引擎中的每一个对象都有不同的大小),供VObject使用,VObject对象通过Parse方法从该Xml中获取数据;另一个Xml文件(配置文件)则表示该对象的显示属性(例如该对象所用的素材,举例说明,一个场景中可能有两棵树,这两棵树所用的 阅读全文
posted @ 2011-05-06 14:53
carekee
阅读(268)
评论(0)
推荐(0)
摘要:
在前面的章节里,我定义了一个抽象类VObject,作为虚拟实验室项目的“祖先”,接下来,我将实现两个具体类:VPlace和VItem,分别表示“场景类”和“物品类”。VPlace场景所谓场景,实际上相当于背景,像地板这些永远不会覆盖在人物之上的东西统统可以归咎于场景。引擎中的场景应该具有以下几个特点:不会轻易改变位置;永远位于物品下方,不存在空间排序问题及遮挡问题;在同一时刻,场景只能有一个;场景一般是静止不动的,因此可以用一副图片来表示场景;场景里有很多物品,这些物品按照一定的空间顺序排列。 根据场景的分类,还可以进一步抽象成VStreet(街道)、VRoom(房间)等具体信息,因此,在设计 阅读全文
posted @ 2011-05-06 14:52
carekee
阅读(392)
评论(0)
推荐(0)
摘要:
灵魂和外表在Virtual Lab的引擎中,V(irtual)开头的类抽象了Virtual Lab中的对象(例如VObject,VItem),这些对象不能直接在Silverlight的UI线程中绘制到画布上,所以,还需要定义相应的“UI”类,告诉Silverlight如何渲染这些对象。在Virtual Lab引擎中,UI(User Interface)开头的类就是这些对象(UIObject、UIItem),例如UIObject类告诉了Silverlight如何把一个VObject对象“画”到程序中。我使用以下UML图来描述二者的关系,这就是桥接模式:使用桥接模式,能够明确地划分抽象与实现,类的 阅读全文
posted @ 2011-05-06 14:50
carekee
阅读(195)
评论(0)
推荐(0)
摘要:
在前一篇日志里,我决定使用Silverlight来开发虚拟实验室引擎。接下来,我将从上到下,构建这个引擎。确定实验室中的对象构建一个虚拟的产品,首先映入脑海的就是该产品的具体表现形式。根据这个,我把实验室中的对象分成两个个部分:场景和物品。所谓场景,实际上相当于背景,像地板这些永远不会覆盖在人物之上的东西统统可以归咎于场景。在渲染上,场景也是最好对待的,它往往不会改变位置,永远位于物品下方,不存在空间排序问题及遮挡问题。物品,大概相当于前景。例如桌子、柜子等等。这些东西在渲染的时候,可能需要按照它们所处的空间位置排列,造就遮挡的效果。根据唯物主义理论,人物也是一种物品,不过和桌子比,人物会动, 阅读全文
posted @ 2011-05-06 14:49
carekee
阅读(242)
评论(0)
推荐(0)
摘要:
在前一篇日志里,我用两个UML图描述了引擎中所使用的数据对象和界面渲染对象。本文将创建VObject类。VObject是引擎中所有虚拟对象的父类,包括一些公共的属性和方法。VObject内部,主要通过以下顺序来创建数据。 属性让我们看看VObject有哪些属性: 属性名类型说明NameString名称IDGuid唯一的编号值WidthInt32宽HeightInt32高CenterXInt32中点横坐标(相对于VObject)CenterYInt32中点纵坐标(相对于VObject)TopXInt32顶点横坐标(相对于所在的Place)TopYInt32顶点纵坐标(相对于所在的Place)XI 阅读全文
posted @ 2011-05-06 14:49
carekee
阅读(452)
评论(0)
推荐(0)
摘要:
什么是引擎引擎是使用素材,响应用户输入,处理简单运算、调用远程数据的程序集。在虚拟实验室里,引擎负责调用图片素材、渲染场景、接收用户鼠标点击事件、相应事件,以及和后台通信: 这就像网络游戏的引擎一样。网游的引擎集成在Client客户端中,利用DirectDraw或Direct3D来渲染素材,利用DirectInput和鼠标键盘交互,利用Socket和游戏服务器进行数据传输。虚拟实验室引擎类似于传统CS架构下网游的引擎,但是又有着不同:虚拟实验室是基于BS架构的,客户端嵌入在网页中,我们通过在浏览器中输入网址来访问它。使用什么语言嵌入在网页中的对象有很多中,我们该用哪种语言来开发虚拟实验室引擎呢 阅读全文
posted @ 2011-05-06 14:46
carekee
阅读(449)
评论(0)
推荐(0)
摘要:
WordPress 是一种使用 PHP 语言和 MySQL 数据库开发的开源、免费的 Blog(博客,网志)引擎,用户可以在支持 PHP 和 MySQL 数据库的服务器上建立自己的 Blog。WordPress 是一个功能非常强大的博客系统,插件众多,易于扩充功能。安装和使用都非常方便。目前 WordPress 已经成为主流的 Blog 搭建平台。本文描述了如何在服务器上搭建一个属于自己的WordPress博客。本文分成以下几个方面:下载并解压WordPress在MySQL中建立用户名和博客数据库添加IIS应用程序执行安装 下载并解压WordPresshttp://code.google.co 阅读全文
posted @ 2011-05-06 14:36
carekee
阅读(502)
评论(0)
推荐(0)
摘要:
好了,现在我们能在c#里通过编程扫描图像了。还不满足?对,在前面的例子里,需要扫描的时候总是要按下一个扫描按钮,既傻又费事。现在的扫描仪,上面往往会多几个额外的按钮用来和用户交互,例如我是用的HP G2410上就有两个按钮:扫描及复制。那么,能不能用这两个按钮来代替程序里的那个难看的按钮呢? 注意左上角那个难看的按钮了吗?在WIAAL里,我们可以同过注册设备事件,监听事件等方式和设备上的按钮交互。注册事件还记得我们在上节提到的DeviceManager对象吗?MSDN官方文档描述:The Microsoft Windows Image Acquisition (WIA) Device Mana 阅读全文
posted @ 2011-05-06 14:26
carekee
阅读(1118)
评论(1)
推荐(0)
摘要:
在前面几节,我通过调用CommonDialog对象的ShowAcquireImage方法来扫描图像,这是一个弹出选择设备对话框,让用户自己扫描的过程。有时候,我们不想把过程弄得那么复杂,只想用户点击按钮后,自动开始扫描。本节我将尝试这个需求。WIAAL模型在开始代码前,再回顾以下WIAAL模型,这里选取其中的一小部分: 和 从上图不难想象,一台扫描仪,实际上就是一个Device对象,因此,我们可以通过DeviceManager来“获取”这台设备的“引用”,然后通过得到的Device对象,执行相应的扫描工作。从而跳过了使用ShowAcquireImage方法带来的一系列“多余的鼠标操作问题”。获 阅读全文
posted @ 2011-05-06 14:25
carekee
阅读(1515)
评论(0)
推荐(0)
摘要:
WIA Automation Layer不仅能从设备中捕获照片,还能进行简单的处理。当WIA Automation Layer从设备中捕获照片,保存为一个ImageFile对象,我们可以通过访问该ImageFile对象来访问照片的属性。然而,为了保护原来的照片,不能直接通过修改该ImageFile对象的方法修改图片。代替的方法是,使用ImageProcess和一个或多个Filter对象创建一个副本,修改图片。代码以下代码把扫描得到的图片顺时针旋转90度:if (imageFile != null){ ImageProcess ip = new ImageProcessClass(); obje 阅读全文
posted @ 2011-05-06 14:20
carekee
阅读(2624)
评论(0)
推荐(0)
摘要:
前文说过,在WIA 2.0 里,有一个叫Automation Layer的东西,来负责WIA和应用程序交互。既然被命名为Automation了,那么意味着比直接试用WIA接口,WIAAL更容易、更方便。实际上的确如此。关于WIA Automation Layer文档上说,WIA Automation Layer是一个高级的,全能的图像操作组件,能为应用程序(例如ASP,C#)提供首尾相连的处理能力。利用WIAAL,在程序中可以很容易地从诸如数码相机、扫描仪等图像设备中捕获图像,以及进行简单处理(缩放、旋转)。对象分级结构WIAAL的对象不多,总的来说分成来两块,第一块是可以被创建的类(例如在c 阅读全文
posted @ 2011-05-06 14:19
carekee
阅读(722)
评论(0)
推荐(1)
摘要:
WIA(Windows Image Acquire,最新版本2.0)是Windows中一组从设备中捕获图像的标准API集合,它可以从设备(例如扫描仪、数码相机)中获取静态图像,以及管理这些设备。它既是API,又是DDI(Device Driver Interface)。因此,只要是满足这个规范的设备,都能够利用WIA直接和应用程序交互,而不是通过驱动。WIA甚至提供了统一的对话框来获取图片。WIA是基于Com的,有两种使用方式:c++:使用WIA自定义接口其他:使用WIAAL(WIA Automation Layer)。 注:在Windows XP sp1以前的版本,WIAAL还不存在,因此第 阅读全文
posted @ 2011-05-06 14:05
carekee
阅读(3365)
评论(0)
推荐(0)
浙公网安备 33010602011771号