﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-A place full of passion - Crius</title><link>http://www.blogjava.net/wilyquan/</link><description>人生每一天都在进步。</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 11:30:57 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 11:30:57 GMT</pubDate><ttl>60</ttl><item><title>ios开发随笔</title><link>http://www.blogjava.net/wilyquan/archive/2011/02/14/344282.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Mon, 14 Feb 2011 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2011/02/14/344282.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/344282.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2011/02/14/344282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/344282.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/344282.html</trackback:ping><description><![CDATA[1、afconvert 实现音频格式转换 <br /><hr />
由于iphone/ipad不提供mp3编码器，一般将caf文件转换为需要的文件格式。一个比较简单的转换方式利用iphone/ipad提供的afconvert命令转换。<br />
例如将caf 文件转换mp3如下：<br />
afconvert -f mp4f -d aac -b 128000 Bounce2.caf a.mp3<br />
caf文件转换wave格式：<br />
afconvert -f WAVE -d LEI16@22050 -c 1 &lt; destinate file &gt;

<img src ="http://www.blogjava.net/wilyquan/aggbug/344282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2011-02-14 18:03 <a href="http://www.blogjava.net/wilyquan/archive/2011/02/14/344282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenGL模型视图变换、投影变换、视口变换</title><link>http://www.blogjava.net/wilyquan/archive/2010/07/27/327235.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Tue, 27 Jul 2010 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2010/07/27/327235.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/327235.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2010/07/27/327235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/327235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/327235.html</trackback:ping><description><![CDATA[<p>OpenGL中不设置模型，投影，视口，所绘制的几何图形的坐标只能是-1到1(X轴向右，Y轴向上，Z轴垂直屏幕)。</p>
<p>产生目标场景的过程类似于用照相机进行拍照：</p>
<p>(1)把照相机固定在三角架上，并让他对准场景</p>
<p>&nbsp;&nbsp; 从不同位置观察场景(视图变换)</p>
<p>(2)对场景进行安排，使各个物体在照片中的位置是我们所希望的</p>
<p>&nbsp;&nbsp; 移动，旋转或者放大缩小场景中的物体(模型变换)</p>
<p>(3)选择照相机镜头，并调整放大倍数(调焦)</p>
<p>&nbsp;&nbsp; 显示物体时，可以选择物体是如何投影到屏幕上(投影变换)</p>
<p>(4)确定照片的大小，放大照片还是缩小照片</p>
<p>&nbsp;&nbsp; 把图形画下来，是要占据整个屏幕还是屏幕的一部分(视口变换)</p>
<p>三大变换：(都是通过操作矩阵来实现的)</p>
<p>1、模型视图变换</p>
<p>在进行模型视图变换之前，应先设置当前操作的矩阵为"模型视图矩阵",通过设置glMatrixMode( GL_MODELVIEW),在进行变换</p>
<p>之前把当前矩阵设置为单位矩阵glLoadIdentity();如果不进行单位化，所有的后续操作都是在当前矩阵的前提下进行的。</p>
<p>2、投影变换</p>
<p>投影变换即定义一个可视空间，可视空间以外的物体不会被绘制到屏幕上(从现在起，坐标不在是-1.0到1.0了)</p>
<p>OpenGL支持两种投影，透视投影和正投影，通过设置glMatrixMode( GL_PROJECTION )来操作投影矩阵。</p>
<p>透视投影的主要函数</p>
<p>1、glFrustum() </p>
<p>2、glPerspective( GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far)</p>
<p>创建一个表示对称透视视图平截头体的矩阵，并把它与当前矩阵相乘。fovy是YZ平面上视野的角度，范围【0，180】。aspect是这个平截头体的纵横比，也就是宽度除于高度。near和far值分别是观察点与近侧裁剪平面以及远侧裁剪平面的距离(沿Z轴负方向)这两个值都是正的。</p>
<p>正投影的主要函数</p>
<p>1、glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) </p>
<p>创建一个平行视景体（就是一个长方体空间区域）。实际上这个函数的操作是创建一个正射投影矩阵，并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形，矩形左下角点三维空间坐标是（left，bottom，-near），右上角点是（right，top，-near）；远裁剪平面也是一个矩形，左下角点空间坐标是（left，bottom，-far），右上角点是（right，top，-far）。注意，near和far都是正值。只有在视景体里的物体才能显示出来，我感觉你最后两个参数取得有点问题，而且你改成0，0后，视景体深度没有了，整个视景体都被压成个平面了，当然就显示不正确了。</p>
<p>2、glOrtho2D( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)</p>
<p>创建一个表示把二维坐标投影到屏幕上的矩阵，并把当前矩阵与它相乘，裁剪区域为矩形。</p>
<p>把像素绘制到屏幕上glViewport()定义视口，前两个参数最左下方，后两个参数宽度和高度。</p>
<p>3、视口变换</p>
<p>在窗口中定义一个像素矩形，最终的图像将映射到这个矩形中。</p>
<p>glViewport( Glint x, Glint y, GLsizei width, GLsizei height );XY指定了视口的左下角，WH指定了视口的高度和宽度。在默认情况下，视口的初始值是(0,0,winwidth,winheight)。</p>
<p>视口的纵横比一般和视景体的纵横比相同。当窗口的大小发生变化时，并不会自动影响视口，应用程序应该检测窗口大小改变事件。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/longge7685/archive/2010/01/31/5274467.aspx</p>
<p>关于模型转换的基础知识</p>
<p>1．模型转换与视点转换： glTranslate{fd}(TYPE x, TYPE y, TYPE z )、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; glRotate{fd}( TYPE angle, TYPE x, TYPE y, TYPE z )、<br />
&nbsp;&nbsp;&nbsp;&nbsp; glScale{fd}(TYPE x, TYPE y, TYPE z )<br />
这三个函数分别对模型进行平移，旋转，缩放。我们可以想象一下，视点转换和模型转换可以使用相同的函数进行，比如，在用相机拍摄物体时，我们可以保持物体的位置不动，而将相机移离物体，这就相当于视点转换；也可以保持相机的位置不动，将物体移离相机，这就相当于模型转换。<br />
模型转换和视点转换共同构成模型视景矩阵。</p>
<p>2．矩阵堆栈操作：glPushMatrix(),glPopMatrix()<br />
说明，OpenGL中有两个最基本的矩阵，模型视景矩阵和投影矩阵，它们都有相应的矩阵堆栈，这些矩阵的当前值就是在矩阵堆栈中的最顶层元素。对于转换操作，发出转换命令后生成的新的当前矩阵就存储在矩阵堆栈中，因此，我们可以利用矩阵堆栈存储当前值，并在需要的时候将当前值弹出堆栈。<br />
举例来说，我们现在需要绘制一个自行车，设置自行车的两个轮子相对于坐标原点是对称的。我们可以这样绘制：将坐标系原点移动到前车轮中心，然后进行绘制，完成后，计算前车轮中心到后车轮中心的距离，并将坐标系原点移动到后车轮中心，再绘制后车轮。显然，这种绘制顺序是不科学的，如果需要绘制更多的对称物体，那么这种计算量会非常大，而且容易产生错误。<br />
这种问题，我们使用矩阵堆栈可以很容易得到解决。在绘制前车轮之前，将当前矩阵保存在矩阵堆栈中，然后将坐标原点移动到前车轮中心，绘制前车轮，绘制结束后，将保存的当前矩阵弹出矩阵堆栈，这时堆栈顶部的矩阵仍为原坐标系，下一步只需相对于原坐标系移动相应距离到后车轮进行绘制，这样，所有物体的位置都是相对于原坐标系进行设置，程序计算量得到缩减，而且不容易出错误。</p>
<img src ="http://www.blogjava.net/wilyquan/aggbug/327235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2010-07-27 16:53 <a href="http://www.blogjava.net/wilyquan/archive/2010/07/27/327235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏程序员养成计划</title><link>http://www.blogjava.net/wilyquan/archive/2010/07/27/327208.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Tue, 27 Jul 2010 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2010/07/27/327208.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/327208.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2010/07/27/327208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/327208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/327208.html</trackback:ping><description><![CDATA[<p>&nbsp; 转自：<a href="http://blog.csdn.net/soilwork/archive/2009/01/08/3731645.aspx">http://blog.csdn.net/soilwork/archive/2009/01/08/3731645.aspx</a></p>
<p>&nbsp; 与玩游戏相比,写游戏要复杂上千万倍,除了需要掌握通用的编程技巧以外，还要有相当的图形学，物理，数学基础，特别是在国内，由于相关资料的缺乏，更是让初学者无从下手。下面总结了一些入门方法和比较容易入手的资料。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先你要精通一门高级语言，比如C++或者C#，其次，要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一，因为你遇到的大部分资源都将是英文的，不要总等着别人为你翻译。慢慢尝试着阅读英文资料，你会发现其实也并没有那么难:)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开始，你要做的就是选择一门图形API，一般就是DirectX或者OpenGL之间选一个。如果考虑到跨平台，那么OGL是首选. 如果只在ms的平台，则DX是首选。我对OGL并不是很了解，所以下面大部门资料都是和DX相关的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，作为准备工作之一，你首先要到DirectX Develop Center下载最新版的DirectX SDK。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 入门书籍非常重要，推荐&lt;&lt;Introduction to 3D Game Programming with DirectX 9.0&gt;&gt;（好像去年出了中文版）也就是传说中的龙书，这可以说是最好的DX入门教材，Frank Luna从浅入深，讨论了DX的方方面面。另外再配上&lt;&lt; Advanced 3D Game Programming With DirectX 9.0&gt;&gt;，书名虽然是advanced，但实际上没有多少advanced级别的内容。看完这两本书，你基本上已经对DirectX比较熟悉了。如果你希望学习XNA，也是一样的，毕竟XNA是以DX为基础。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不要一开始就看图形学的书，这个时候你对图形编程还没有一个基本的感性认识，因此八成看的云里雾里。不要以网上的教程和论坛提问作为主要学习途径，找一本好书，系统学习，效率才最高。不要马上看SDK里的例子，很多图形学的基本原理仅仅通过读代码是不会明白的。某些年代太过久远的书就不要看了，比如《windows游戏编程大师技巧》（总看到有人在找这本书）。有人说基本的思想总是不变的，可惜对于现代GPU来说，很多早期的技术和优化技巧早就过时了。图形编程是发展的非常快的技术，看看GPU的发展速度，1~2年就是一代产品的革新。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，入门之后，是你巩固和拓展视野的阶段。现在看计算机图形学就比较合适了。吐血推荐&lt;&lt;Real-Time-Rendering&gt;&gt;,这本书算得上是所有图形程序员的必读书籍和参考手册了。最近刚出了第三版（更新：已经有电子版了）。可惜国内只有第二版，稍微有点老，如果实在找不到第三版，还是值得一读。国内其他所有以图形学命名的书都有一个共同点：枯燥，过时。只需看看其中二维三维变换和曲线曲面表示的部分即可。如果这个时候发现你当年数学没有学好，那么有三本数学书是为游戏程序员量身定制的：&lt;&lt;3D Math Primer for Graphics and Game Development&gt;&gt;, &lt;&lt;Mathematics for 3D Game Programming and Computer Graphics&gt;&gt;和&lt;&lt;Essential Mathematics Guide 2nd Edition&gt;&gt;，第一本书有中文版，最后一本则是08年才出的新书。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实入门之后，就没有固定的学习路线了，最好根据你感兴趣的方向来学习。</p>
<p>Shader方面：《Cg_tutorial》和《The Complete Effect and HLSL Guide》都是不错的入门材料，当然还有SDK文档。&lt;&lt;Shaders for Game Programmers and Artists&gt;&gt;有大量入门的例子。&lt;&lt;Advanced Lighting And Materials With Shaders&gt;&gt;详细介绍了各种光照模型和技术。&lt;&lt;GPU Gems&gt;&gt; 1~3册肯定是必读的，虽然有1，2有中文版，但某些翻译并不是很理想，强烈建议直接看英文版。ShaderX系列也是很经典的系列，每年出版一本，包含了最新的实时渲染技术，如今已经出了第6册了。不过网络上只能找到1~3册。1，2册大部分shader都是用asm写的，不过看懂原理，转换为HLSL也并不难。另外Nvidia SDK和ATI SDK也是学习shader的重要资源。最后还有刚出的&lt;&lt; Programming Vertex, Geometry, and Pixel Shaders&gt;&gt;</p>
<p>地形：&lt;&lt;Real Time 3D Terrain Engines Using C++ And DX9&gt;&gt;非常全面的讨论了关于地形渲染的各种技术，至少应该把第5~9章都浏览一遍。之后便可以 到virtual terrain查阅近期的地形渲染技术。</p>
<p>模型导入和动画：&lt;&lt;Advanced Animation with DirectX&gt;&gt;，仅此一本足以。</p>
<p>物理：&lt;&lt;Game Physics&gt;&gt;和&lt;&lt;Game Physics Engine Development&gt;&gt;都不错。&lt;&lt;Real-time Collision Detection&gt;&gt;是碰撞检测方面最好的书，可惜目前还没有电子版。</p>
<p>LOD：&lt;&lt;Level of Detail for 3D Graphics&gt;&gt;</p>
<p>Ray tracing:&lt;&lt; Physical-Based Rendering - From Theory to Implementation&gt;&gt;</p>
<p>引擎设计：说实话，这方面还没有特别好的书，大概越是核心的内容，越少有人愿意写吧。&lt;&lt;3D Game Engine Architecture Engineering Real-Time Applications with Wild Magic&gt;&gt;只有第三章值得一读。&lt;&lt;3D Game Engine Programming&gt;&gt;可以选部分感兴趣的章节看看，不过总的来说，讲的比较浅。更新：&lt;&lt;3D Game Engine Design, Second Edition&gt;&gt;出了影印版本，强烈推荐。最近发现&lt;&lt;Pro OGRE 3D Programming&gt;&gt;也很不错，200多页短小精干，但是可以让读者快速了解一个既有引擎的设计和构架。</p>
<p>AI：&lt;&lt;Programming Game AI by Example&gt;&gt;非常不错，好像还有中文版，备选&lt;&lt;Artificial Intelligence for Games&gt;&gt;。当然&lt;&lt;AI Programming Wisdom&gt;&gt;系列也是必读作品，不过目前网络上只有1～2册。</p>
<p>网络：%##@%...（本人是网络白痴 +_+........)</p>
<p>综合：&lt;&lt;Game Programming Gems&gt;&gt;系列，不过由于内容涉及的过于广泛，文章质量参差不齐，选择性阅读就可以了。历年GDC, Gamefest t,Siggraph等大型会议的paper也是应该关注的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于那些&#8220;All in one&#8221;或者n天较你写出个FPS游戏的书就不要读了，这类书的通病是什么都说了，结果什么也没说清楚。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了书以外，再推荐一些不错的网络资源：</p>
<p>www.GameDev.net 除了大量教程以外，论坛里多年累计下来的内容保罗万象。好好利用论坛搜索，你会发不管你多厉害，那里总有一些比你强大的人在很久以前就遇到了和你同样的问题，并且给出了解决方案。</p>
<p>Nvidia和ATI的开发者中心</p>
<p>creators.xna.com XNA官方网站</p>
<p>www.gamasutra.com 与GameDev类似</p>
<p>www.beyond3d.com 这里的除了讨论软件以外，还能看到对硬件构架的分析</p>
<p>www.ziggyware.com 最好的XNA教程网站</p>
<p>www.gameres.com 国内唯一比较专业的游戏编程网站，可惜和GameDev相比就显得太寒碜了-_-#</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，不要忘了收集各大论坛里牛人们的blog：）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，仅仅靠看书是不够的，多写多练才是王道。</p>
<img src ="http://www.blogjava.net/wilyquan/aggbug/327208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2010-07-27 12:06 <a href="http://www.blogjava.net/wilyquan/archive/2010/07/27/327208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D编程的入门级学习建议 </title><link>http://www.blogjava.net/wilyquan/archive/2010/07/27/327203.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Tue, 27 Jul 2010 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2010/07/27/327203.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/327203.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2010/07/27/327203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/327203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/327203.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://fotoone.spaces.live.com/blog/cns!68DE430B0B5562FB!901.entry">http://fotoone.spaces.live.com/blog/cns!68DE430B0B5562FB!901.entry</a><br />
和WQ谈起有关游戏开发和Direct3D编程的事，因为他是入门者，所以，我给他提了点入门级的学习建议。 </p>
<p>1. 浏览一下DirectX SDK中Direct3D 10教程 </p>
<p>DirectX SDK肯定是要好好研究和学习的。目前DirectX的最新版本是v10，v11不久将大驾光临。SDK的最新版本是March 2009 DirectX SDK。在DirectX SDK中，主要学习Direct3D 10的内容。SDK中有一个Direct3D系列教程，可以把这个系列教程的文档看看，编译和运行教程中的所有程序，得到一点3D编程的感觉，这个时候不需要对其中涉及的概念原理有很深的了解。 </p>
<p>2. 了解下游戏引擎 </p>
<p>但是，在深入学习Direct3D之前，建议看看Jake Simpson的Game Engine Anatomy 101系列文章，是用来讲解游戏引擎的，中文翻译是游戏引擎剖析。在看完后，会对游戏引擎有较全面的了解，大致会知道在一个游戏引擎中，图形渲染起什么作用，Direct3D在游戏引擎中是干嘛的，处在一个什么位置。 </p>
<p>3. 了解Direct3D graphics pipeline一般原理和组成（固定功能流水线和可编程流水线） </p>
<p>学习Direct3D，就是要掌握Direct3D graphics pipeline。在了解了游戏引擎之后，阅读一下ExtremeTech 3D Pipeline Tutorial 或者Real-Time rendering第三版的第二章（The Graphics Rendering Pipeline），它们都是讲述实时Direct3D graphics pipeline的一般原理的。我个人感觉前一篇文章内容要多点，也稍微难懂点。 当然，最好2篇文章都看看，可以相互参照进行阅读。 </p>
<p>BTW,Real-Time rendering是一本很好的图形学的书，要成为图形学专业人士的话，可以认真研究，现在最新版是第三版，唉，想起我以前的买的三本图形学教材都过时了，计算机图形学可真是发展太快了！ </p>
<p>4. 学习Direct3D graphics pipeline </p>
<p>这几篇文章看过后，再花功夫好好研究DirectX SDK中的DirectX Documentation for C++，特别要明白Direct3D graphics pipeline的各个阶段。这个阶段也可以找本DirectX入门书看看，网上有人推荐Introduction To Direct3D9，有中文版，我没看过，但这本书是讲Direct3D 9，而非Direct3D 10和Direct3D 11，由于架构上的变化（Direct3D 10抛弃了固定功能的vertex和pixel处理），和Shader Model变更（抛弃了老版本的Shader Model，只支持全新的Shader Model 4），以及Shader编程语言的变化（不再支持汇编，只支持HLSL），Direct3D 9和Direct3D 10有很大的区别，所以不推荐入门者浪费青春去学习Direct3D 9，而应该直接学习Direct3D 10和Direct3D 11。 </p>
<p>在阅读DirectX Documentation for C++的时候，也阅读Real-Time rendering第三版的第三章（The Graphics Processing Unit），在这个学习阶段，我强烈推荐看Programming Vertex, Geometry, and Pixel Shaders。 </p>
<p>另外，可以参考一下Richard Thomson的Direct3D Graphics Pipeline资料，主要看看其中的Direct3D Graphics Pipeline&nbsp; Poster，这张图类似Direct3D API迷宫的导航图，我个人感觉在学习和掌握Direct3D API方面，很有价值。 同样，要注意的是Richard Thomson的Direct3D Graphics Pipeline&nbsp; Poster针对的是Direct3D 9.0版本，此图不反映最新的Direct3D流水线，但此图依然对理解Direct3D 10/11 pipeline有参考价值，比如：Direct3D 9 Graphics Pipeline&nbsp; Poster图中的Vertex Assembly以上部分可以理解为Direct3D 10/11 pipeline中的Input-Assembler Stage(IAS)，同样，Vertex Assembly到Primitive Assembly的之间的部分理解为Direct3D 10/11 pipeline中的Vertex Shader Stage(VSS)，Primitive Assembly到Rasterization and Component Interpolation之间的部分理解为Rasterizer Stage(RS)，Rasterization and Component Interpolation和Fog Blend之间的部分理解为Pixel Shader Stage(PSS)，Fog Blend以下的部分则理解为Output-Merger Stage(OMS)。另外，Direct3D 9中的一些处理阶段，比如Alpha Test，在Direct3D 10没有单独实现，需要编写Pixel Shader实现，所以，Direct3D 10/11 pipeline中不会出现Alpha Test处理阶段。 </p>
<p>BTW, 写到这，我突然想，我是不是该把Richard Thomson的Direct3D 9 Graphics Pipeline&nbsp; Poster的图改写一下，发布一张Direct3D 10/11 Graphics Pipeline Poster?&nbsp; 恩，不过，我想Richard Thomson自己会做这个工作的！ </p>
<p>最新版本的March 2009 DirectX SDK主要包括的是Direct3D 10&amp;9 Graphics Pipeline的内容，有关最新Direct3D 11 Graphics Pipeline的内容，可以看看Introduction to the Direct3D 11 Graphics Pipeline中的PPT，或者阅读一下March 2009 DirectX SDK中的Direct3D 11 Technical Preview，不过现在看不看都没有什么关系，毕竟Direct3D 11还不知道何时正式登场。 </p>
<p>5. 根据自己的兴趣，挑选几个Direct3D Samples进行研究 </p>
<p>理解了Direct3D图形流水线之后，可以根据兴趣学习图形学中的不同方面的知识，比如，对动画、阴影感兴趣，就可以重点研究Direct3D Samples中的动画、阴影的例子。研究代码的同时，也学习动画、阴影原理，这样学起来，得心应手。 </p>
<p>6. 学习Direct3D的方法总结 </p>
<p>在我看来，学习，应该首先建立系统框架图，就好比去游乐园玩，有导航图一样，学习的时候，才不会迷失在错综复杂的技术细节之中。然后，再像玩拼图游戏一样，把系统的各个知识面拼缀到这个系统框架图中，形成完整的知识系统图。 </p>
<p>这种方法用在Direct3D的学习上，可以认为是：先理解游戏引擎这个系统框架图，然后，明了3D 图形子系统在游戏引擎中的位置。接着，在理解3D图形子系统（Direct3D）这个子系统框架图的基础上，明了Direct3D流水线，进一步针对Direct3D流水线包含的各个阶段（Stage），深入学习Direct3D API。在学习中，遇到函数、结构、常量可以自动地发现这些东西在Direct3D流水线中的哪个阶段被用到。按照这种方式进行学习，可以比较方便地把各个知识点有条理地拼缀起来，极大地提高学习效果。 </p>
<p>----- </p>
<p>注：某日在网上看到一篇游戏程序员养成计划，写得细致全面，强烈推荐。地形渲染还有一本书《Focus On 3D Terrain 》，我建议学习地形渲染看这本书比较容易上手。本书网上有中文翻译(我建议别看，翻译得差)。所有书籍，都推荐直接看英文版的。 </p>
<p>&nbsp; </p>
<p>WinCapture: www.wincapture.com </p>
<p>WinCapture The most popular screen capture, video screen recording and image editing utility for Windows, with more than 9 million downloads. <br />
Capture anything you see on your computer screen - images and text. </p>
<p>Easily record activity on your computer screen, audio and webcam video. </p>
<p>Edit your screen captures and images with drawing tools, annotations and stunning visual effects.</p>
<img src ="http://www.blogjava.net/wilyquan/aggbug/327203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2010-07-27 11:35 <a href="http://www.blogjava.net/wilyquan/archive/2010/07/27/327203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINCE 读取SIM和Outlook中联系人信息</title><link>http://www.blogjava.net/wilyquan/archive/2010/03/04/314533.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Thu, 04 Mar 2010 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2010/03/04/314533.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/314533.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2010/03/04/314533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/314533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/314533.html</trackback:ping><description><![CDATA[<p>//获得SIM中联系人信息。<br />
LPARAM DoShowSimContact(HWND hWnd, WORD idItem, HWND hwndCtl, WORD wNotifyCode)<br />
{<br />
&nbsp;MessageBox(NULL, TEXT("start show sim contact"),TEXT("info"),MB_YESNO);<br />
&nbsp;HSIM lphSim;<br />
&nbsp;HRESULT hr = SimInitialize(0, NULL, 0, &amp;lphSim);<br />
&nbsp;if(FAILED(hr))&nbsp;&nbsp; <br />
&nbsp;{<br />
&nbsp;&nbsp;MessageBox(NULL, TEXT("initialize failure!"),TEXT("error"),MB_YESNO);<br />
&nbsp;&nbsp;return 0 ;<br />
&nbsp;}</p>
<p>&nbsp;DWORD dwUsed,dwTotal;&nbsp;&nbsp; <br />
&nbsp;hr = SimGetPhonebookStatus(lphSim, SIM_PBSTORAGE_SIM, &amp;dwUsed, &amp;dwTotal);</p>
<p>&nbsp;TCHAR buf[20];</p>
<p>&nbsp;swprintf(buf, TEXT("dwUsed = %d"), dwUsed);</p>
<p>&nbsp;MessageBox(NULL, buf ,TEXT("dwUsed"),MB_YESNO);<br />
&nbsp;for(int i=0; i&lt;dwUsed; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;{</p>
<p>&nbsp;&nbsp;//对结构初始话以下&nbsp;&nbsp; <br />
&nbsp;&nbsp;SIMPHONEBOOKENTRY phoneent;&nbsp;&nbsp; <br />
&nbsp;&nbsp;memset(&amp;phoneent,0,sizeof(phoneent));&nbsp;&nbsp; <br />
&nbsp;&nbsp;phoneent.cbSize = sizeof(phoneent); <br />
&nbsp;&nbsp;if (SUCCEEDED(SimReadPhonebookEntry(lphSim, SIM_PBSTORAGE_SIM, i+1, &amp;phoneent)))<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;TCHAR name[32];<br />
&nbsp;&nbsp;&nbsp;TCHAR phone[32];<br />
MessageBox(NULL, phoneent.lpszText ,TEXT("info1"),MB_YESNO);<br />
&nbsp;&nbsp;&nbsp;wcsncpy(name, phoneent.lpszText,31); // 姓名<br />
&nbsp;&nbsp;&nbsp;wcsncpy(phone, phoneent.lpszAddress,31); // 电话<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _tcscat(name, phone);<br />
&nbsp;&nbsp;&nbsp;MessageBox(NULL, name ,TEXT("info"),MB_YESNO);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;<br />
&nbsp;}</p>
<p>&nbsp;//最后别忘了清理&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;SimDeinitialize(lphSim);<br />
&nbsp;lphSim = NULL;</p>
<p><br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
<br />
//获得Outlook联系人信息<br />
</p>
<p>BOOL GetOutlookContacts(IPOutlookItemCollection * pItemCol)<br />
{<br />
&nbsp;BSTR bstrFirstName;<br />
&nbsp;BSTR bstrLastName;<br />
&nbsp;BSTR bstrPhoneNumber;<br />
&nbsp;BSTR bstrContactInfo;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;IContact * pContact = NULL;<br />
&nbsp;int cItems = 0;<br />
&nbsp;<br />
&nbsp;pItemCol-&gt;get_Count(&amp;cItems);<br />
&nbsp;<br />
&nbsp;for (int i = 1; i &lt;= cItems; i++)<br />
&nbsp;{<br />
&nbsp;&nbsp;if (SUCCEEDED(pItemCol-&gt;Item (i, reinterpret_cast&lt;IDispatch**&gt;(&amp;pContact))))<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;// grab properties<br />
&nbsp;&nbsp;&nbsp;pContact-&gt;get_FirstName(&amp;bstrFirstName);<br />
&nbsp;&nbsp;&nbsp;pContact-&gt;get_LastName(&amp;bstrLastName);<br />
&nbsp;&nbsp;&nbsp;pContact-&gt;get_HomeTelephoneNumber(&amp;bstrPhoneNumber);</p>
<p>&nbsp;&nbsp;&nbsp;// allocate a buffer for all the properties plus a comma, space. newline, and terminating null<br />
&nbsp;&nbsp;&nbsp;bstrContactInfo = SysAllocStringByteLen(NULL, SysStringByteLen(bstrFirstName) +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SysStringByteLen(bstrLastName) + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SysStringByteLen(bstrPhoneNumber) + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4*sizeof(OLECHAR)));<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;// copy the strings into one<br />
&nbsp;&nbsp;&nbsp;_tcscpy(bstrContactInfo, bstrLastName);<br />
&nbsp;&nbsp;&nbsp;_tcscat(bstrContactInfo, _T(", "));<br />
&nbsp;&nbsp;&nbsp;_tcscat(bstrContactInfo, bstrFirstName);<br />
&nbsp;&nbsp;&nbsp;_tcscat(bstrContactInfo, _T("\n"));<br />
&nbsp;&nbsp;&nbsp;_tcscat(bstrContactInfo, bstrPhoneNumber);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;// add it to the listview<br />
&nbsp;&nbsp;&nbsp;AddToList(bstrContactInfo);</p>
<p>&nbsp;&nbsp;&nbsp;// clean up<br />
&nbsp;&nbsp;&nbsp;SysFreeString(bstrFirstName);<br />
&nbsp;&nbsp;&nbsp;SysFreeString(bstrLastName);<br />
&nbsp;&nbsp;&nbsp;SysFreeString(bstrPhoneNumber);<br />
&nbsp;&nbsp;&nbsp;SysFreeString(bstrContactInfo);<br />
&nbsp;&nbsp;&nbsp;pContact-&gt;Release();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;if(!AddSIMContactsFolderText())<br />
&nbsp;{<br />
&nbsp;&nbsp;MessageBox(NULL, TEXT("add sim failure!"),TEXT("error"),MB_YESNO);</p>
<p>&nbsp;}<br />
&nbsp;return TRUE;<br />
&nbsp;<br />
}</p>
<img src ="http://www.blogjava.net/wilyquan/aggbug/314533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2010-03-04 16:45 <a href="http://www.blogjava.net/wilyquan/archive/2010/03/04/314533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++ 设备项目中由向导生成的代码</title><link>http://www.blogjava.net/wilyquan/archive/2010/02/28/314103.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Sun, 28 Feb 2010 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2010/02/28/314103.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/314103.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2010/02/28/314103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/314103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/314103.html</trackback:ping><description><![CDATA[<p>Visual C++ 的功能和向导简化了生成多平台设备应用程序、配置文件和项目文件的大多数常见任务。此演练描述由 Windows 32 设备应用程序向导自动生成的代码。以此方式，您可以根据需要扩展并修改您的 Windows 应用程序。</p>
<h1 class="heading">向导生成的 Windows 32 设备应用程序的代码</h1>
<div class="seeAlsoNoToggleSection" id="sectionSection0">
<p>如果您熟悉 Windows (win32) 桌面编程，则可以很容易识别出向导生成的主例程。</p>
<p>在典型的 Windows 设备应用程序中，主入口点位于 &lt;yourprojectname&gt;.cpp 文件中。下文给出了此文件的示例。</p>
<p>粗略的来看，应用程序具有以下主要函数：</p>
<ul>
    <li>
    <p><strong>WinMain</strong> 函数</p>
    <li>
    <p><strong>MyRegisterClass</strong> 函数</p>
    <li>
    <p><strong>InitInstance</strong> 函数</p>
    <li>
    <p><strong>About Dialog</strong> 函数</p>
    </li>
</ul>
<p>下面将对每一个函数做进一步的阐释：</p>
<ul>
    <li>
    <p><strong>WinMain</strong> 函数：<tt>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow).</tt>。有关更多信息，请参见 <a id="ctl00_MTCS_main_ctl01" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl01',this);" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/winmain.asp">WinMain Function（WinMain 函数）</a>。<span id="ctl00_MTCS_main_ctl02"></p>
    <div class="libCScode" id="ctl00_MTCS_main_ctl02_">
    <div class="CodeDisplayLanguage">&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl02_code" space="preserve">int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       nCmdShow)
    {
    MSG msg;
    // Perform application initialization:
    if (!InitInstance(hInstance, nCmdShow))
    {
    return FALSE;
    }</pre>
    </div>
    </div>
    </span>
    <li>
    <p>Win32 平台。有关更多信息，请参见 <a id="ctl00_MTCS_main_ctl03" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl03',this);" href="http://msdn.microsoft.com/zh-cn/library/ws0swas0(VS.80).aspx">Win32 Platforms</a>。</p>
    <span id="ctl00_MTCS_main_ctl04">
    <div class="libCScode" id="ctl00_MTCS_main_ctl04_">
    <div class="CodeDisplayLanguage"><a class="copyCode" title="复制代码" href="javascript:CopyCode('ctl00_MTCS_main_ctl04_code');"></a>&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl04_code" space="preserve">#ifndef WIN32_PLATFORM_WFSP
    HACCEL hAccelTable;
    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WIN32SMARTDEVICE);
    #endif // !WIN32_PLATFORM_WFSP</pre>
    </div>
    </div>
    </span>
    <li>
    <p>消息循环。有关更多信息，请参见 <a id="ctl00_MTCS_main_ctl05" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl05',this);" href="http://msdn.microsoft.com/zh-cn/library/11s98h9e(VS.80).aspx">Message Handling and Command Targets</a>。</p>
    <span id="ctl00_MTCS_main_ctl06">
    <div class="libCScode" id="ctl00_MTCS_main_ctl06_">
    <div class="CodeDisplayLanguage"><a class="copyCode" title="复制代码" href="javascript:CopyCode('ctl00_MTCS_main_ctl06_code');"></a>&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl06_code" space="preserve">        // Main message loop:
    while (GetMessage(&amp;msg, NULL, 0, 0))
    {
    #ifndef WIN32_PLATFORM_WFSP
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg))
    #endif // !WIN32_PLATFORM_WFSP
    {
    TranslateMessage(&amp;msg);
    DispatchMessage(&amp;msg);
    }
    }
    return (int) msg.wParam;
    }
    </pre>
    </div>
    </div>
    </span>
    <li>
    <p><strong>MyRegisterClass</strong> 函数用于注册该窗口应用程序。</p>
    <span id="ctl00_MTCS_main_ctl07">
    <div class="libCScode" id="ctl00_MTCS_main_ctl07_">
    <div class="CodeDisplayLanguage">&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl07_code" space="preserve">//  FUNCTION: MyRegisterClass()
    ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
    {
    WNDCLASS wc;
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = (WNDPROC)WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32SMARTDEVICE));
    wc.hCursor       = 0;
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName  = 0;
    wc.lpszClassName = szWindowClass;
    return RegisterClass(&amp;wc);
    }
    </pre>
    </div>
    </div>
    </span>
    <li>
    <p><strong>InitInstance</strong>：<tt>FUNCTION InitInstance(HANDLE, int)</tt>。有关更多信息，请参见 <a id="ctl00_MTCS_main_ctl08" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl08',this);" href="http://msdn.microsoft.com/zh-cn/library/tba932ss(VS.80).aspx">InitInstance Member Function</a>。</p>
    <p><tt>WIN32_PLATFORM_WFSP</tt> 用作 Smartphone 的条件，<tt>WIN32_PLATFORM_PSPC</tt> 用作 Pocket PC 的条件。如果需要进一步区分，可以随时定义自己的条件。</p>
    <span id="ctl00_MTCS_main_ctl09">
    <div class="libCScode" id="ctl00_MTCS_main_ctl09_">
    <div class="CodeDisplayLanguage"><a class="copyCode" title="复制代码" href="javascript:CopyCode('ctl00_MTCS_main_ctl09_code');"></a>&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl09_code" space="preserve">// FUNCTION: InitInstance(HANDLE, int)
    // PURPOSE: Saves instance handle and creates main window.
    // COMMENTS:
    // In this function, we save the instance handle in a global
    // variable and create and display the main program window.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
    HWND hWnd;
    TCHAR szTitle[MAX_LOADSTRING];
    // title bar text
    TCHAR szWindowClass[MAX_LOADSTRING];
    // main window class name
    g_hInst = hInstance;
    // Store instance handle in your global variable.
    #ifdef WIN32_PLATFORM_PSPC
    // SHInitExtraControls should be called once during your application's initialization to initialize any
    // of the Pocket PC special controls such as CAPEDIT and SIPPREF.
    SHInitExtraControls();
    #endif // WIN32_PLATFORM_PSPC
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_WIN32SMARTDEVICE, szWindowClass, MAX_LOADSTRING);
    #if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
    //If it is already running, then focus on the window, and exit.
    hWnd = FindWindow(szWindowClass, szTitle);
    if (hWnd)
    {
    // Set the focus to the foremost child window.
    // The "| 0x00000001" is used to bring any owned windows
    //to the foreground and activate them.
    SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
    return 0;
    }
    #endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP
    if (!MyRegisterClass(hInstance, szWindowClass))
    {
    return FALSE;
    }
    hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
    return FALSE;
    }
    #ifdef WIN32_PLATFORM_PSPC
    // When the main window is created using CW_USEDEFAULT,
    // the height of the menubar is not taken into account.
    // So the generated code resizes the window after creating it.
    if (g_hWndMenuBar)
    {
    RECT rc;
    RECT rcMenuBar;
    GetWindowRect(hWnd, &amp;rc);
    GetWindowRect(g_hWndMenuBar, &amp;rcMenuBar);
    rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
    MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
    }
    #endif // WIN32_PLATFORM_PSPC
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
    }
    </pre>
    </div>
    </div>
    </span>
    <li>
    <p>还将为应用程序生成一个&#8220;关于&#8221;对话框，作为指导您如何生成其他对话框的示例：<tt>LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)</tt></p>
    <span id="ctl00_MTCS_main_ctl10">
    <div class="libCScode" id="ctl00_MTCS_main_ctl10_">
    <div class="CodeDisplayLanguage"><a class="copyCode" title="复制代码" href="javascript:CopyCode('ctl00_MTCS_main_ctl10_code');"></a>&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl10_code" space="preserve">// win32smartdevice.cpp : Defines the entry point for the application.
    #include "stdafx.h"
    #include "win32smartdevice.h"
    #include &lt;windows.h&gt;
    #include &lt;commctrl.h&gt;
    #define MAX_LOADSTRING 100
    // Global Variables:
    HINSTANCE               g_hInst;
    // Current instance:
    HWND                    g_hWndMenuBar;
    // Menu bar handle
    // Forward declarations of functions included in this code module:
    ATOM              MyRegisterClass(HINSTANCE, LPTSTR);
    BOOL              InitInstance(HINSTANCE, int);
    LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
    #ifndef WIN32_PLATFORM_WFSP
    LRESULT CALLBACK  About(HWND, UINT, WPARAM, LPARAM);
    #endif
    // !WIN32_PLATFORM_WFSP
    //  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
    //  PURPOSE:  Processes messages for the main window.
    //  WM_COMMAND    - process the application menu
    //  WM_PAINT      - Paint the main window
    //  WM_DESTROY    - post a quit message and return</pre>
    </div>
    </div>
    </span>
    <li>
    <p>已包含一些主消息（如 <tt>WM_COMMAND</tt>）以提供可扩展性。包含 <tt>WinProc</tt> 以用于处理系统及用户输入消息：<tt>LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam. </tt>。有关 <tt>WinProc</tt> 的更多信息，请参见 <a id="ctl00_MTCS_main_ctl11" onclick="javascript:Track('ctl00_MTCS_main_ctl00|ctl00_MTCS_main_ctl11',this);" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceui/html/_wcesdk_Windows_Overview.asp">Windows Overview（Windows 概述）</a>。</p>
    <span id="ctl00_MTCS_main_ctl12">
    <div class="libCScode" id="ctl00_MTCS_main_ctl12_">
    <div class="CodeDisplayLanguage"><a class="copyCode" title="复制代码" href="javascript:CopyCode('ctl00_MTCS_main_ctl12_code');"></a>&nbsp;</div>
    <div dir="ltr" style="background-color: #ddd">
    <pre class="libCScode" id="ctl00_MTCS_main_ctl12_code" space="preserve">LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HGDIOBJ  hbrWhite, hbrGray;
    POINT aptStar[6] = {50,2, 2,98, 98,33, 2,33, 98,98, 50,2};
    #if defined(SHELL_AYGSHELL) &amp;&amp; !defined(WIN32_PLATFORM_WFSP)
    static SHACTIVATEINFO s_sai;
    #endif // SHELL_AYGSHELL &amp;&amp; !WIN32_PLATFORM_WFSP
    switch (message)
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    #ifndef WIN32_PLATFORM_WFSP
    case IDM_HELP_ABOUT:
    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
    break;
    #endif // !WIN32_PLATFORM_WFSP
    #ifdef WIN32_PLATFORM_WFSP
    case IDM_OK:
    DestroyWindow(hWnd);
    break;
    #endif // WIN32_PLATFORM_WFSP
    #ifndef WIN32_PLATFORM_WFSP
    case IDM_OK:
    SendMessage (hWnd, WM_CLOSE, 0, 0);
    break;
    #endif // !WIN32_PLATFORM_WFSP
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_CREATE:
    #ifdef SHELL_AYGSHELL
    SHMENUBARINFO mbi;
    memset(&amp;mbi, 0, sizeof(SHMENUBARINFO));
    mbi.cbSize     = sizeof(SHMENUBARINFO);
    mbi.hwndParent = hWnd;
    mbi.nToolBarId = IDR_MENU;
    mbi.hInstRes   = g_hInst;
    if (!SHCreateMenuBar(&amp;mbi))
    {
    g_hWndMenuBar = NULL;
    }
    else
    {
    g_hWndMenuBar = mbi.hwndMB;
    }
    #ifndef WIN32_PLATFORM_WFSP
    // Initialize the shell activate info structure
    memset(&amp;s_sai, 0, sizeof (s_sai));
    s_sai.cbSize = sizeof (s_sai);
    #endif // !WIN32_PLATFORM_WFSP
    #endif // SHELL_AYGSHELL
    hbrWhite = GetStockObject(WHITE_BRUSH);
    hbrGray  = GetStockObject(GRAY_BRUSH);
    return 0L;
    break;
    case WM_PAINT:
    RECT  rc;
    hdc = BeginPaint(hWnd, &amp;ps);
    GetClientRect(hWnd, &amp;rc);
    Polyline(hdc, aptStar, 6);
    EndPaint(hWnd, &amp;ps);
    return 0L;
    break;
    case WM_DESTROY:
    #ifdef SHELL_AYGSHELL
    CommandBar_Destroy(g_hWndMenuBar);
    #endif // SHELL_AYGSHELL
    PostQuitMessage(0);
    break;
    #if defined(SHELL_AYGSHELL) &amp;&amp; !defined(WIN32_PLATFORM_WFSP)
    case WM_ACTIVATE:
    // Notify shell of your activate message.
    SHHandleWMActivate(hWnd, wParam, lParam, &amp;s_sai, FALSE);
    break;
    case WM_SETTINGCHANGE:
    SHHandleWMSettingChange(hWnd, wParam, lParam, &amp;s_sai);
    break;
    #endif // SHELL_AYGSHELL &amp;&amp; !WIN32_PLATFORM_WFSP
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
    #ifndef WIN32_PLATFORM_WFSP
    // Message handler for about box.
    LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_INITDIALOG:
    #ifdef SHELL_AYGSHELL
    {
    // Create a Done button and size it.
    SHINITDLGINFO shidi;
    shidi.dwMask = SHIDIM_FLAGS;
    shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
    shidi.hDlg = hDlg;
    SHInitDialog(&amp;shidi);
    }
    #endif // SHELL_AYGSHELL
    return TRUE;
    case WM_COMMAND:
    #ifdef SHELL_AYGSHELL
    if (LOWORD(wParam) == IDOK)
    #endif
    {
    EndDialog(hDlg, LOWORD(wParam));
    return TRUE;
    }
    break;
    case WM_CLOSE:
    EndDialog(hDlg, message);
    return TRUE;
    #ifdef _DEVICE_RESOLUTION_AWARE
    case WM_SIZE:
    {
    DRA::RelayoutDialog(
    g_hInst,
    hDlg,
    DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_ABOUTBOX_WIDE) : MAKEINTRESOURCE(IDD_ABOUTBOX));
    }
    break;
    #endif
    }
    return FALSE;
    }
    #endif // !WIN32_PLATFORM_WFSP
    </pre>
    </div>
    </span></div>
    </li>
</ul>
引用地址：<a href="http://msdn.microsoft.com/zh-cn/library/ms228823(VS.80).aspx">http://msdn.microsoft.com/zh-cn/library/ms228823(VS.80).aspx</a></div>
<img src ="http://www.blogjava.net/wilyquan/aggbug/314103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2010-02-28 14:24 <a href="http://www.blogjava.net/wilyquan/archive/2010/02/28/314103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse获取路径/Eclipse/Path/get path/find path</title><link>http://www.blogjava.net/wilyquan/archive/2010/01/28/311093.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Thu, 28 Jan 2010 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2010/01/28/311093.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/311093.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2010/01/28/311093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/311093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/311093.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/wilyquan/aggbug/311093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2010-01-28 17:07 <a href="http://www.blogjava.net/wilyquan/archive/2010/01/28/311093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获得SWT控件焦点。(forceFocus 代替setFocus)</title><link>http://www.blogjava.net/wilyquan/archive/2009/12/23/307085.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Wed, 23 Dec 2009 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2009/12/23/307085.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/307085.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2009/12/23/307085.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/307085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/307085.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt; color: #ff99cc; font-family: Courier"><span style="color: #c0c0c0"><span style="font-size: 10pt; color: #333300; font-family: Courier">今天在调试程序的时候突然发现，当某控件有子控件存在时，该控件没有办法获得键盘焦点，该控件的键盘事件也就没有办法响应。而键盘焦点被该控件的某一个子控件获得。为什么设置给控件的键盘焦点为什么被子控件获得呢？经过看源代码发现，setFocus并不是将键盘焦点设置给该控件，而是将键盘焦点设置给它的某个子控件。当该控件的存在子控件时，setFocus方法无法实现你的需求。那么有什么方法来实现呢？通过查看setFocus源代码发现forceFocus才是最终设置键盘焦点。既然setFocus不行，那就用forceFocus代替。问题解决。<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;建议以后在设置键盘焦点用forceFocus、setFocus请少用。</span><br />
</span></span><br />
<img src ="http://www.blogjava.net/wilyquan/aggbug/307085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2009-12-23 23:11 <a href="http://www.blogjava.net/wilyquan/archive/2009/12/23/307085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>swing netbeans</title><link>http://www.blogjava.net/wilyquan/archive/2009/12/23/307081.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Wed, 23 Dec 2009 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2009/12/23/307081.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/307081.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2009/12/23/307081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/307081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/307081.html</trackback:ping><description><![CDATA[<p>http://netbeans.dzone.com/crud-on-netbeans-platform</p>
<img src ="http://www.blogjava.net/wilyquan/aggbug/307081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2009-12-23 22:29 <a href="http://www.blogjava.net/wilyquan/archive/2009/12/23/307081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Technology_Article_List</title><link>http://www.blogjava.net/wilyquan/archive/2009/12/13/305822.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Sun, 13 Dec 2009 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2009/12/13/305822.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/305822.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2009/12/13/305822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/305822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/305822.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px" align="left">beyond_java<br />
http://commons.oreilly.com/wiki/index.php/Beyond_Java<br />
Eclipse Forms: Rich UI for the Rich Client<br />
http://www.eclipse.org/articles/Article-Forms/article.html<br />
Using OpenGL with SWT<br />
http://www.eclipse.org/articles/Article-SWT-OpenGL/opengl.html<br />
Graphics Context - Quick on the draw<br />
http://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html<br />
OpenGL Programming Guide <br />
http://fly.cc.fer.hr/~unreal/theredbook/</p>
<p>The OpenGL Graphics System: A Specification (Version 1.1)<br />
http://www.opengl.org/documentation/specs/version1.1/glspec1.1/index.html</p>
<p>The Official Eclipse FAQs<br />
http://wiki.eclipse.org/index.php/Eclipse_FAQs<br />
标准窗口小部件工具箱的 Java 二维作图<br />
http://www.ibm.com/developerworks/cn/java/j-2dswt/</p>
<p align="left">&nbsp;&nbsp; <br />
创建一个 Eclipse 游戏插件，第 1 部分: 入门 <br />
http://www.ibm.com/developerworks/cn/views/opensource/tutorials.jsp?view_by=search&amp;search_by=%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA+Eclipse+%E6%B8%B8%E6%88%8F%E6%8F%92%E4%BB%B6<br />
Taking a look at SWT Images<br />
http://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html<br />
A Basic Image Viewer<br />
http://www.eclipse.org/articles/Article-Image-Viewer/Image_viewer.html<br />
Creating an Eclipse View<br />
http://www.eclipse.org/articles/viewArticle/ViewArticle2.html<br />
Take control of your properties<br />
http://www.eclipse.org/articles/Article-Properties-View/properties-view.html<br />
On the Job: The Eclipse Jobs API<br />
http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html<br />
Adapters<br />
http://www.eclipse.org/articles/article.php?file=Article-Adapters/index.html</p>
<p>Blur: http://www.jasonwaltman.com/thesis/filter-blur.html<br />
A small cup of SWT<br />
http://www.eclipse.org/articles/Article-small-cup-of-swt/pocket-PC.html<br />
http://www.blackpawn.com<br />
<br />
</p>
<h1><span style="font-size: 10pt"><em>SWT 绘图技术<br />
</em></span><a href="https://www.ibm.com/developerworks/cn/opensource/os-cn-swtimage2/">https://www.ibm.com/developerworks/cn/opensource/os-cn-swtimage2/</a></h1>
<img src ="http://www.blogjava.net/wilyquan/aggbug/305822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2009-12-13 23:22 <a href="http://www.blogjava.net/wilyquan/archive/2009/12/13/305822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT: 想锁住焦点(Focus)？</title><link>http://www.blogjava.net/wilyquan/archive/2009/12/11/305564.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Fri, 11 Dec 2009 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2009/12/11/305564.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/305564.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2009/12/11/305564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/305564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/305564.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/SuperMiner/archive/2008/01/11/2034723.aspx">SWT: 想锁住焦点(Focus)？</a>
<img src ="http://www.blogjava.net/wilyquan/aggbug/305564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2009-12-11 14:35 <a href="http://www.blogjava.net/wilyquan/archive/2009/12/11/305564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Creating Your Own Widgets using SWT </title><link>http://www.blogjava.net/wilyquan/archive/2009/12/08/305136.html</link><dc:creator>wilyquan</dc:creator><author>wilyquan</author><pubDate>Tue, 08 Dec 2009 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/wilyquan/archive/2009/12/08/305136.html</guid><wfw:comment>http://www.blogjava.net/wilyquan/comments/305136.html</wfw:comment><comments>http://www.blogjava.net/wilyquan/archive/2009/12/08/305136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wilyquan/comments/commentRss/305136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wilyquan/services/trackbacks/305136.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm" target="_blank">Creating Your Own Widgets using SWT </a><br />
<img src ="http://www.blogjava.net/wilyquan/aggbug/305136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wilyquan/" target="_blank">wilyquan</a> 2009-12-08 12:04 <a href="http://www.blogjava.net/wilyquan/archive/2009/12/08/305136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>