压电振动式发电机微电源智能控制应用电路的设计 VpGB技术

Piezoelectric micro vibration generator, power supply, circuit design of intelligent control application
-
Origin 引用自:21iC.com
压电振动式发电机微电源智能控制应用电路的设计




Read >>


DllImport - C#与C++函数对照案例

<h1>

<span style="font-size:18px;">DllImport - C#与C++函数对照案例</span> 

</h1>
<p>

<span style="font-size:18px;">最近改写C++代码比较多, 为了以后自己方便查阅, 将这些知识点梳理完毕整理如下:</span> 

</p>
<p>

<span style="line-height:1.5;font-size:18px;">以下文章主要对照DllImport中, C++函数原型与C#中的函数原型, 重点对参数类型变化做一个总结.</span> 



Read >>


GNSS定位中的精度因子DOP值

<p>

<span style="font-size:16px;">GNSS定位中的精度因子.</span> 

</p>
<p>

<br />

</p>
<p>

<span style="font-size:16px;">首先感慨的是本科时未珍惜机会好好学习, 这些概念都没有掌握透彻.&nbsp;</span> 

</p>
<p>

<span style="font-size:16px;">幸好现在捡起来为时不晚.</span> 

</p>
<p>

<span style="font-size:16px;">首先我不是学霸, 其次作为本科学习卫星导航定位这个专业的我来说, 我写下文时还是深感自己的专业术语真的不够标准.&nbsp;</span> 





Read >>


Introduction to EGL API

<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

EGL&nbsp;是&nbsp;OpenGL ES&nbsp;和底层&nbsp;Native&nbsp;平台视窗系统之间的接口。本章主要讲述&nbsp;OpenGL ES&nbsp;的&nbsp;EGL API&nbsp;,以及如何用它创建&nbsp;Context&nbsp;和绘制Surface&nbsp;等,并对用于&nbsp;OpenGL&nbsp;的其他视窗&nbsp;API&nbsp;做了比较分析,比如&nbsp;WGL&nbsp;和&nbsp;GLX&nbsp;。本章中将涵盖如下几个方面:

</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

<span style="font-family:Arial;font-size:14px;line-height:21px;background-color:#FFFFFF;">* &nbsp;EGL&nbsp;综述</span> 

</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

* &nbsp;EGL&nbsp;主要构成(&nbsp;Display&nbsp;,&nbsp;Context&nbsp;,&nbsp;Configuration&nbsp;)

</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

* &nbsp;在&nbsp;Brew&nbsp;和&nbsp;Windows CE&nbsp;上使用&nbsp;EGL

</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

* &nbsp;EGL&nbsp;和其他&nbsp;OpenGL&nbsp;视窗系统的比较

</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

<br />

</p>
<p style="font-family:Arial;font-size:14px;text-indent:2em;background-color:#FFFFFF;">

<p>
    <!--more-->
</p>
<p>
    <br />
</p>

</p>
<h2 style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

<span style="font-size:18px;"><strong>EGL&nbsp;介绍</strong></span> 

</h2>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

EGL&nbsp;是为&nbsp;OpenGL ES&nbsp;提供平台独立性而设计。在本章中,你将详细地学习每个&nbsp;EGL API&nbsp;,并了解使用&nbsp;EGL&nbsp;时候需要注意的平台特性和限制。&nbsp;OpenGL ES&nbsp;为附加功能和可能的平台特性开发提供了扩展机制,但仍然需要一个可以让&nbsp;OpenGL ES&nbsp;和本地视窗系统交互且平台无关的层。&nbsp;OpenGL ES&nbsp;本质上是一个图形渲染管线的状态机,而&nbsp;EGL&nbsp;则是用于监控这些状态以及维护&nbsp;Frame buffer&nbsp;和其他渲染&nbsp;Surface&nbsp;的外部层。图&nbsp;2-1&nbsp;是一个典型的&nbsp;EGL&nbsp;系统布局图。

</p>
<p style="text-align:center;">

<img src="/wp-content/uploads/2014/09/20140916080300_43585.gif" alt="" /><span style="line-height:1.5;"></span> 

</p>
<p style="text-align:center;">

figure 1 EGL system structure

</p>
<p style="text-align:left;">

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;视窗设计是基于人们熟悉的用于&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Microsoft Windows</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;(&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">WGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;)和&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">UNIX</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;(&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">GLX</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;)上的&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">OpenGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;的&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Native</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;接口,与后者比较接近。</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">OpenGL ES</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;图形管线的状态被存储于&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;管理的一个&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Context</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;中。&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Frame Buffers</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;和其他绘制&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Surfaces</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;通过&nbsp;</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL API</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;创建、管理和销毁。</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">&nbsp;同时也控制和提供了对设备显示和可能的设备渲染配置的访问。</span> 

</p>
<p style="text-align:left;">

<span style="font-family:Arial;line-height:1.5;background-color:#FFFFFF;"><br />

</span>
</p>
<h2 style="text-align:left;">

<span style="font-family:Arial;line-height:1.5;background-color:#FFFFFF;">EGL 数据类型</span> 

</h2>
<p style="text-align:left;">

<span style="font-family:Arial;font-size:14px;line-height:1.5;background-color:#FFFFFF;">EGL&nbsp;包含了自己的一组数据类型,同时也提供了对一组平台相关的本地数据类型的支持。这些&nbsp;Native&nbsp;数据类型定义在&nbsp;EGL&nbsp;系统的头文件中。一旦你了解这些数据类型之间的不同,使用它们将变得很简单。多数情况下,为保证可移植性,开发人员将尽可能使用抽象数据类型而避免直接使用系统数据类型。通过使用定义在&nbsp;EGL&nbsp;中&nbsp;Native&nbsp;类型,可以让你写的&nbsp;EGL&nbsp;代码运行在任意的&nbsp;EGL&nbsp;的实现上。&nbsp;Native EGL&nbsp;类型说明如下:</span> 

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>NativeDisplayType&nbsp;</strong>平台显示数据类型,标识你所开发设备的物理屏幕

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>NativeWindowType&nbsp;</strong>平台窗口数据类型,标识系统窗口

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>NativePixmapType&nbsp;</strong>可以作为&nbsp;Framebuffer&nbsp;的系统图像(内存)数据类型,该类型只用于离屏渲染

</p>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">下面的代码是一个</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">NativeWindowType</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">定义的例子。这只是一个例子,不同平台之间的实现千差万别。使用</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">native</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">类型的关键作用在于为开发者抽象化这些细节。</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">QUALCOMM</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">使用</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">IDIB</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">结构定义</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">native</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">类型,如下:</span>
<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>

struct IDIB {
     AEEVTBL(IBitmap) *pvt; // virtual table pointer
     IQueryInterface * pPaletteMap; // cache for computed palette mapping info
     byte * pBmp; // pointer to top row
     uint32 * pRGB; // palette
     NativeColor ncTransparent; // 32-bit native color value
     uint16 cx; // number of pixels in width
     uint16 cy; // number of pixels in height
     int16 nPitch; // offset from one row to the next
     uint16 cntRGB; // number of palette entries
     uint8 nDepth; // size of pixel in bits
     uint8 nColorScheme; // IDIB_COLORSCHEME_...(ie. 5-6-5)
     uint8 reserved[6];
};

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">接下来的小节中,我们将深入更多</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">数据类型细节。标准</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">数据类型如表</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">2.1</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">所示。</span>
<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>
<p style="text-align:left;font-family:Arial;font-size:14px;background-color:#FFFFFF;">

表&nbsp;2.1 EGL&nbsp;数据类型

</p>
<div style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

<p style="text-align:center;"> 数据类型 </p> <p style="text-align:center;"> 值 </p>
<p style="text-align:center;"> EGLBoolean </p> <p> EGL_TRUE =1, EGL_FALSE=0 </p>
<p> EGLint </p> <p> int 数据类型 </p>
<p> EGLDisplay </p> <p> 系统显示 ID 或句柄 </p>
<p> EGLConfig </p> <p> Surface 的 EGL 配置 </p>
<p> EGLSurface </p> <p> 系统窗口或 frame buffer 句柄 </p>
<p> EGLContext </p> <p> OpenGL ES 图形上下文 </p>
<p> NativeDisplayType </p> <p> Native 系统显示类型 </p>
<p> NativeWindowType </p> <p> Native 系统窗口缓存类型 </p>
<p> NativePixmapType </p> <p> Native 系统 frame buffer </p>

</div>
<div style="text-align:left;">

<span style="line-height:1.5;"> 
<h2 style="font-family:Arial;background-color:#FFFFFF;">
    EGL Displays
</h2>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">
    &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;EGLDisplay&nbsp;是一个关联系统物理屏幕的通用数据类型。对于&nbsp;PC&nbsp;来说,&nbsp;Display&nbsp;就是显示器的句柄。不管是嵌入式系统或&nbsp;PC&nbsp;,都可能有多个物理显示设备。为了使用系统的显示设备,&nbsp;EGL&nbsp;提供了&nbsp;EGLDisplay&nbsp;数据类型,以及一组操作设备显示的&nbsp;API&nbsp;。
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面的函数原型用于获取&nbsp;Native Display&nbsp;:
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">
    EGLDisplay eglGetDisplay (NativeDisplayType display);
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">
    &nbsp; &nbsp; &nbsp; &nbsp; 其中&nbsp;display&nbsp;参数是&nbsp;native&nbsp;系统的窗口显示&nbsp;ID&nbsp;值。如果你只是想得到一个系统默认的&nbsp;Display&nbsp;,你可以使用&nbsp;<strong>EGL_DEFAULT_DISPLAY&nbsp;</strong>参数。如果系统中没有一个可用的&nbsp;native display ID&nbsp;与给定的&nbsp;display&nbsp;参数匹配,函数将返回&nbsp;EGL_NO_DISPLAY&nbsp;,而没有任何&nbsp;Error&nbsp;状态被设置。
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">
    由于设置无效的&nbsp;display&nbsp;值不会有任何错误状态,在你继续操作前请检测返回值。
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">
    下面是一个使用&nbsp;EGL API&nbsp;获取系统&nbsp;Display&nbsp;的例子:
</p>

if (m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS))
throw error_egl_display;
Initialization 初始化</pre>
</span>
</div>
<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp; &nbsp; &nbsp; &nbsp; 和很多视窗&nbsp;API&nbsp;类似,&nbsp;EGL&nbsp;在使用前需要初始化,因此每个&nbsp;EGLDisplay&nbsp;在使用前都需要初始化。初始化&nbsp;EGLDisplay&nbsp;的同时,你可以得到系统中&nbsp;EGL&nbsp;的实现版本号。了解当前的版本号在向后兼容性方面是非常有价值的。嵌入式和移动设备通常是持续的投放到市场上,所以你需要考虑到你的代码将被运行在形形色色的实现上。通过动态查询&nbsp;EGL&nbsp;版本号,你可以为新旧版本的&nbsp;EGL&nbsp;附加额外的特性或运行环境。基于平台配置,软件开发可用清楚知道哪些&nbsp;API&nbsp;可用访问,这将会为你的代码提供最大限度的可移植性。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是初始化&nbsp;EGL&nbsp;的函数原型:

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

EGLBoolean eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

其中&nbsp;dpy&nbsp;应该是一个有效的&nbsp;EGLDisplay&nbsp;。函数返回时,&nbsp;major&nbsp;和&nbsp;minor&nbsp;将被赋予当前&nbsp;EGL&nbsp;版本号。比如&nbsp;EGL1.0&nbsp;,&nbsp;major&nbsp;返回&nbsp;1&nbsp;,minor&nbsp;则返回&nbsp;0&nbsp;。给&nbsp;major&nbsp;和&nbsp;minor&nbsp;传&nbsp;NULL&nbsp;是有效的,如果你不关心版本号。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eglQueryString()&nbsp;函数是另外一个获取版本信息和其他信息的途径。通过&nbsp;eglQueryString()&nbsp;获取版本信息需要解析版本字符串,所以通过传递一个指针给&nbsp;eglInitializ()&nbsp;函数比较容易获得这个信息。注意在调用&nbsp;eglQueryString()&nbsp;必须先使用&nbsp;eglInitialize()&nbsp;初始化&nbsp;EGLDisplay&nbsp;,否则将得到&nbsp;EGL_NOT_INITIALIZED&nbsp;错误信息。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是获取&nbsp;EGL&nbsp;版本字符串信息的函数原型:

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

const char * eglQueryString (EGLDisplay dpy, EGLint name);

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

参数&nbsp;name&nbsp;可以是&nbsp;EGL_VENDOR, EGL_VERSION,&nbsp;或者&nbsp;EGL_EXTENSIONS&nbsp;。这个函数最常用来查询有哪些&nbsp;EGL&nbsp;扩展被实现。所有&nbsp;EGL&nbsp;扩展都是可选的,如果你想使用某个扩展特性,请检查该扩展是否被实现了,而不要想当然假定已经实现了。如果没有扩展被实现,将返回一个Null&nbsp;字符串,如果给定的&nbsp;name&nbsp;参数无效,则会得到&nbsp;EGL_BAD_PARAMETER.&nbsp;错误信息。

</p>
<h2 style="font-family:Arial;background-color:#FFFFFF;">

初始化EGL

</h2>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">OpenGL ES是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与OpenGL是一样的。但不一样的是,这部份工作有标准,这个标 准就是EGL。而OpenGL时代在不同平台上有不同的机制以关联窗口系统,在Windows上是wgl,在X-Window上是xgl,在Apple OS上是agl等。EGL的工作方式和部份术语都接近于xgl。</span>



<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">OpenGL ES的初始化过程如下图所示意:</span>
<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>
<p style="text-align:center;">

<img src="/wp-content/uploads/2014/09/20140916080844_31236.png" alt="" /> 

</p>
<p style="text-align:center;">

figure 2. OpenGL ES Initialize

</p>
<p style="text-align:left;">

<br />

</p>
<h4>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">1. 获取Display。</span> 

</h4>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。获得Display要调用EGLboolean eglGetDisplay(NativeDisplay dpy),参数一般为 EGL_DEFAULT_DISPLAY 。该参数实际的意义是平台实现相关的,在X-Window下是XDisplay ID,在MS Windows下是Window DC。</span>
<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>
<h3>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">2. 初始化egl。</span> 

</h3>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">调用 EGLboolean eglInitialize(EGLDisplay dpy, EGLint major, EGLint minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。</span>



<h4>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">3. 选择Config。</span> 

</h4>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">所为Config实际指的是FrameBuffer的参数,在MS Windows下对应于PixelFormat,在X-Window下对应Visual。一般用EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint attr_list, EGLConfig config, EGLint config_size, EGLint num_config),其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有 id,没有value。另一个办法是用EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig config, EGLint config_size, EGLint *num_config) 来获得所有config。这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存 在num_config中。可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib ()来读取,但不能修改。</span>



<h3>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">4. 构造Surface。</span> 

</h3>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Surface实际上就是一个FrameBuffer,通过 EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg, NativeWindow win, EGLint *cfg_attr) 来创建一个可实际显示的Surface。系统通常还支持另外两种Surface:PixmapSurface和PBufferSurface,这两种都不 是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Surface也有一些attribute,基本上都可以故名思意, EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。</span>



<h4>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">5. 创建Context。</span> 

</h4>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点 坐标等图元从而形成帧缓冲内的像素。在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状 态,偶尔也从Context里获取一些信息。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">用EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)来创建一个Context。</span>
<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

<br />

</p>
<h4>

6. 绘制。

</h4>
应用程序通过OpenGL API进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)来显示。
<p>

<br />

</p>
<h3 style="font-family:Arial;background-color:#FFFFFF;">

EGL Configurations

</h3>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGLConfigs</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> 是一个用来描述 </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL surface</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> 配置信息的数据类型。要获取正确的渲染结果, </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Surface</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> 的格式是非常重要的。根据平台的不同,</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">surface</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> 配置可能会有限制,比如某个设备只支持 </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">16</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> 位色深显示,或是不支持 </span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">stencil buffer</span><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;"> ,还有其他的功能限制或精度的差异。</span>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是获取系统可用的&nbsp;EGL&nbsp;配置信息的函数原型:

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

EGLBoolean eglGetConfigs (EGLDisplay dpy, EGLConfig *configs,EGLint config_size, EGLint *num_config);

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

参数&nbsp;configs&nbsp;将包含在你的平台上有效的所有&nbsp;EGL framebuffer&nbsp;配置列表。支持的配置总数将通过&nbsp;num_config&nbsp;返回。实际返回的&nbsp;configs&nbsp;的配置个数依赖于程序传入的&nbsp;config_size&nbsp;。如果&nbsp;config_size &lt; num_config&nbsp;,则不是所有的配置信息都将被返回。如果想获取系统支持的所有配置信息,最好的办法就是先给&nbsp;eglGetConfig&nbsp;传一个&nbsp;NULL&nbsp;的&nbsp;configs&nbsp;参数,&nbsp;num_config&nbsp;将得到系统所支持的配置总数,然后用它来给configs&nbsp;分配合适的内存大小,再用得到的&nbsp;configs&nbsp;来调用&nbsp;eglGetConfig&nbsp;。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是如果使用&nbsp;eglGetConfig()&nbsp;函数的例子:

</p>

EGLConfig *configs_list;
EGLint num_configs;
// Main Display
m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if( m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS )
return FALSE;
if( eglInitialize( m_eglDisplay, NULL, NULL ) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
return FALSE;
// find out how many configurations are supported
if ( eglGetConfigs( m_eglDisplay, NULL, 0, &num_configs)== EGL_FALSE || eglGetError() != EGL_SUCCESS )
return FALSE;
configs_list = malloc(num_configs * sizeof(EGLConfig));
if (configs_list == (EGLConfig *)0)
return FALSE;
// Get Configurations
if( eglGetConfigs( m_eglDisplay, configs_list, num_configs, &num_configs)== EGL_FALSE || eglGetError() != EGL_SUCCESS )
return FALSE;

<p>

<br />

</p>
<p style="text-align:left;">

<br />

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

由于当前平台的限制,通常只有很少的配置可用。系统支持的配置通常是利用系统硬件提供最好的性能。当你移植游戏到多个平台,它们的EGL&nbsp;配置可能会有细微的差别,我们希望作为通用的移植问题来直接处理这些问题。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

选择一个&nbsp;EGL Configuration

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

基于&nbsp;EGL&nbsp;的属性,你可以定义一个希望从系统获得的配置,它将返回一个最接近你的需求的配置。选择一个你特有的配置是有点不合适的,因为只是在你的平台上使用有效。&nbsp;eglChooseConfig()&nbsp;函数将适配一个你所期望的配置,并且尽可能接近一个有效的系统配置。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是选择一个&nbsp;EGL&nbsp;配置的函数原型:

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

EGLConfig *configs, EGLint config_size, EGLint * num_config);

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

参数&nbsp;attrib_list&nbsp;指定了选择配置时需要参照的属性。参数&nbsp;configs&nbsp;将返回一个按照&nbsp;attrib_list&nbsp;排序的平台有效的所有&nbsp;EGL framebuffer&nbsp;配置列表。参数&nbsp;config_size&nbsp;指定了可以返回到&nbsp;configs&nbsp;的总配置个数。参数&nbsp;num_config&nbsp;返回了实际匹配的配置总数。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是如果使用&nbsp;eglChoosetConfig()&nbsp;函数的例子:

</p>

EGLint attrs[3] = { EGL_DEPTH_SIZE, 16, EGL_NONE };
EGLint num_configs;
EGLConfigs *configs_list;
// Get the display device
if ((eglDisplay = eglGetDisplay(EGL_NO_DISPLAY)) == EGL_NO_DISPLAY)
{
return eglGetError();
}
// Initialize the display
if (eglInitialize(eglDisplay, NULL, NULL) == EGL_FALSE)
{
return eglGetError();
}
// Obtain the total number of configurations that match
if (eglChooseConfig(eglDisplay, attrs, NULL, 0, &num_configs) == EGL_FALSE)
{
return eglGetError();
}
configs_list = malloc(num_configs * sizeof(EGLConfig));
if (configs_list == (EGLConfig *)0)
return eglGetError();
// Obtain the first configuration with a depth buffer of 16 bits
if (!eglChooseConfig(eglDisplay, attrs, &configs_list, num_configs, &num_configs))
{
return eglGetError();
}

<p style="text-align:left;">

<br />

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

如果找到多个合适的配置,有一个简单的排序算法用来匹配最接近你所查询的配置。表&nbsp;2-2&nbsp;显示了基于属性值的用来选择和排序的顺序,也包括了&nbsp;EGL&nbsp;规范中所有&nbsp;EGL&nbsp;配置属性及其默认值。

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

表&nbsp;2.1 EGL&nbsp;配置属性默认值和匹配法则

</p>
<div style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

<p> 属性 </p> <p> 数据类型 </p> <p> 默认值 </p> <p> 排序优先级 </p> <p> 选择顺序 </p>
<p> EGL_BUFFER_SIZE </p> <p> int </p> <p> 0 </p> <p> 3 </p> <p> Smaller value </p>
<p> EGL_RED_SIZE </p> <p> int </p> <p> 0 </p> <p> 2 </p> <p> Larger value </p>
<p> EGL_GREEN_SIZE </p> <p> int </p> <p> 0 </p> <p> 2 </p> <p> Larger value </p>
<p> EGL_BLUE_SIZE </p> <p> int </p> <p> 0 </p> <p> 2 </p> <p> Larger value </p>
<p> EGL_ALPHA_SIZE </p> <p> int </p> <p> 0 </p> <p> 2 </p> <p> Larger value </p>
<p> EGL_CONFIG_CAVET </p> <p> enum </p> <p> EGL_DONT_CARE </p> <p> 1(first) </p> <p> Exact value </p>
<p> EGL_CONFIG_ID </p> <p> int </p> <p> EGL_DONT_CARE </p> <p> 9 </p> <p> Exact value </p>
<p> EGL_DEPTH_SIZE </p> <p> int </p> <p> 0 </p> <p> 6 </p> <p> Smaller value </p>
<p> EGL_LEVEL </p> <p> int </p> <p> 0 </p> <p> - </p> <p> Equal value </p>
<p> EGL_NATIVE_RENDERABLE </p> <p> Boolean </p> <p> EGL_DONT_CARE </p> <p> - </p> <p> Exact value </p>
<p> EGL_NATIVE_VISUAL_TYPE </p> <p> int </p> <p> EGL_DONT_CARE </p> <p> 8 </p> <p> Exact value </p>
<p> EGL_SAMPLE_BUFFERS </p> <p> int </p> <p> 0 </p> <p> 4 </p> <p> Smaller value </p>
<p> EGL_SAMPLES </p> <p> int </p> <p> 0 </p> <p> 5 </p> <p> Smaller value </p>
<p> EGL_STENCIL_SIZE </p> <p> int </p> <p> 0 </p> <p> 7 </p> <p> Smaller value </p>
<p> EGL_SURFACE_TYPE </p> <p> bitmask </p> <p> EGL_WINDOW_BIT </p> <p> - </p> <p> Mask value </p>
<p> EGL_TRANSPARENT_TYPE </p> <p> enum </p> <p> EGL_NONE </p> <p> - </p> <p> Exact value </p>
<p> EGL_TRANSPARENT_RED_VALUE </p> <p> int </p> <p> EGL_DONT_CARE </p> <p> - </p> <p> Exact value </p>
<p> EGL_TRANSPARENT_GREEN_VALUE </p> <p> int </p> <p> EGL_DONT_CARE </p> <p> - </p> <p> Exact value </p>
<p> EGL_TRANSPARENT_BLUE_VALUE </p> <p> int </p> <p> EGL_DONT_CARE </p> <p> - </p> <p> Exact value </p>

</div>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">这里不是讲OpenGL的教程,事实上,OpenGL 是与硬件和平台无关的。这里主要讲在Android下,OpenGL 应用的基本架构、OpenGL 与Android 窗口系统通过EGL的绑定</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL是图形资源管理层,工作在图形渲染API(如OpenGL)与运行平台(Android)的窗口系统之间</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">从1.5(API 3)开始Android 支持 OpenGL ES 1.0,到 2.2(API 8)时支持 OpenGL ES 2.0。版本对应关系如下(待完善)</span>



<p>

<br />

</p>
<p>

<br />

</p>
<p>

Android SDK API EGL OpenGL ES OpenGL
1.5 3 1.0 1.0 1.3
1.6 4      
2.1 7      
2.2 8   2.0  

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">Android、EGL、OpenGL 三者关系如下:</span>
</p>
<p>

<br />

</p>
Android Windowing ( SurfaceView) ^ |
 +--------+------------------------+ | EGL | +------------+ | |
 | | Display | | | | +------------+ | |
+-----v-------+ +------------+ | | | Surface | | Config | |
| +-----^-------+ +------------+ | | | +------------+ | |
| | Context | | | | +------------+ | +--------+------------------------+ |
 v OpenGL <span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL 官网有一个1.0版本的 Specification,详细讲述了Surface、Display、Context 概念。简单地说</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(1)Display 是图形显示设备(显示屏)的抽象表示。大部分EGL函数都要带一个 Display 作为参数</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(2)Context 是 OpenGL 状态机。Context 与 Surface 可以是一对一、多对一、一对多的关系</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(3)Surface 是绘图缓冲,可以是 window、pbuffer、pixmap 三种类型之一</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL 工作流程为:</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(1)初始化</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(2)配置</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(3)创建Surface(绑定到平台Windowing系统)</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(4)绑定Surface与Context</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(5)Main Loop:渲染(OpenGL),交换离线缓冲(offline buffer)与显示缓冲</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">(6)释放资源</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">在Android SDK中,EGL类在javax.microedition.khronos.egl包中,OpenGL 类在 javax.microedition.khronos.opengles包中</span>

<p>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">下面是一个完整的 EGL/OpenGL 应用,当点击屏幕时,根据点击坐标更新屏幕背景颜色</span> 

</p>
<p>

<br />

</p>

import javax.microedition.khronos.egl.EGL10; 
import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.egl.EGLContext; 
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface; 
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback; 
import android.view.View.OnTouchListener;
public class OpenGlDemo extends Activity implements Callback, Runnable, OnTouchListener
{ 
    private SurfaceView view;
    private boolean rendering = false;
    private final Object renderLock = new Object();
    private GL10 gl;
    private float red = 0.2f, green = 0.3f, blue = 0.8f;
    @Override
    public void onCreate(Bundle savedInstanceState)
    { 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState); 
        view = new SurfaceView(this); 
        view.getHolder().addCallback(this); 
        view.setOnTouchListener(this); 
        setContentView(view); 
    }
    public void surfaceCreated(SurfaceHolder holder)
    {
        synchronized (renderLock)
        { 
            Log.d("OpenGlDemo >>>", "Start rendering..."); 
            rendering = true;
            new Thread(this).start();
         }
    } 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    {   
        
    }
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
        synchronized (renderLock) 
        { 
            rendering = false;
         } 
    } 
    public void run() 
    { 
        Init EGL10 egl = (EGL10) EGLContext.getEGL(); 
        EGLDisplay disp = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 
        egl.eglInitialize(disp, new int[2]); 
        Config EGLConfig[] configs = new EGLConfig[1];
        egl.eglChooseConfig(disp, 
             new int[]{ EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE }, configs, 1, new int[1]); 
        EGLConfig config = configs[0]; 
        //Create surface and bind with native windowing 
        EGLSurface surf = egl.eglCreateWindowSurface(disp, config, view .getHolder(), null); 
        //Bind with OpenGL context 
        EGLContext contx = egl.eglCreateContext(disp, config, EGL10.EGL_NO_CONTEXT, null); 
        egl.eglMakeCurrent(disp, surf, surf, contx); 
        gl = (GL10) contx.getGL(); 
        while (true)
        { 
            synchronized (renderLock) 
            {
                if (!rendering) 
                { 
                    break;
                 } 
            }
            render(gl);
            egl.eglSwapBuffers(disp, surf); 
        } 
        Log.d("OpenGlDemo >>>", "Stop rendering");
        // Finalize
        egl.eglMakeCurrent(disp, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); 
        egl.eglDestroyContext(disp, contx); 
        egl.eglDestroySurface(disp, surf);
        gl = null; 
   } 
    private void render(GL10 gl) 
    { 
        gl.glClearColor(red, green, blue, 1.0f); 
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    } 
    public boolean onTouch(View view, MotionEvent e)
    { 
        red = e.getX() / view.getWidth(); 
        green = e.getY() / view.getHeight();
        blue = 1.0f;
        return true;
    }
}

<p>

<br />

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

上面的应用,就是在Android 下的OpenGL 应用的最基本结构,涉及了不少EGL细节的操作

</p>
<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">如果你google 一下“Android OpenGL”,得到结果十之八九是使用了android.opengl.GLSurfaceView。使用GLSurfaceView实现上面的简单应用,代码要简单得多</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">是这样的:GLSurfaceView隐藏了EGL操作及渲染线程的细节,并提供了生命周期回调方法</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">但,基本上,使用 GLSurfaceView 没法控制渲染循环,例如:你没法控制帧速(fps)</span>



<p>

<br />

</p>
<p>

EGL是由Khronos Group提供的一组平台无关的API。它的功能:<br />

1> 和本地窗口系统(native windowing system)通讯;

2> 查询可用的配置;

3> 创建OpenGL ES可用的“绘图表面”(drawing surface);

4> 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;

5> 管理“渲染资源”,比如纹理映射(rendering map)。

● EGLDisplay

EGL可运行于GNU/Linux的X Window System,Microsoft Windows和MacOS X的Quartz。

EGL把这些平台的显示系统抽象为一个独立的类型:EGLDisplay。

使用EGL的第一步就是初始化一个可用的EGLDisplay:
</p>
<p>

<br />

</p>

 EGLint majorVersion;  
    EGLint minorVersion;  
    EGLBoolean success = EGL_FALSE;  
    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);  
    if (display != EGL_NO_DISPLAY)  
    {  
        success = eglInitialize(display, &majorVersion, &minorVersion);  
    }  
    if (success != EGL_TRUE)  
    {  
        EGLint errno = eglGetError();  
        if (errno != EGL_SUCCESS)  
        {  
            _TCHAR errmsg[32];  
            _stprintf(errmsg, _T("[EGL] Initialization failed. Error code: 0x%04x"), errno);  
            // EGL_BAD_DISPLAY      EGLDisplay参数错误  
            // EGL_NOT_INITIALIZED  EGL不能初始化  
        }  
    }  

<p>

<br />

</p>
<p>

<br />

</p>
<p>

<br />

</p>
<p>

<br />

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

这里用到了三个EGL函数:

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp; EGLDisplay eglGetDisplay(EGLNativeDisplayType id); &nbsp;<br />

    EGLBoolean eglInitialize(EGLDisplay display, EGLint majorVersion, EGLint minorVersion);  

    EGLint eglGetError();  
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

● EGLConfig<br />

初始化过后,要选择一个合适的“绘图表面”。
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp; EGLBoolean eglGetConfigs(EGLDisplay display,&nbsp;&nbsp;&nbsp; // 已初始化好&nbsp;

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp; EGLConfig* configs,&nbsp;&nbsp;&nbsp; // 如果为NULL,则返回EGL_TRUE和numConfigs,即图形系统所有可用的配置 &nbsp;<br />

   EGLint maxConfigs,     // 上面那个configs数组的容量  

   EGLint* numConfigs);   // 图形系统返回的实际的可用的配置个数,存储在configs数组里  
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

用例:

</p>
<p>

<span style="line-height:1.5;"> </span> 

</p>

static const EGLint CONFIG_ATTRIBS[] =  
    {  
        EGL_RED_SIZE,       5,  
        EGL_GREEN_SIZE,     6,  
        EGL_BLUE_SIZE,      5,  
        EGL_DEPTH_SIZE,     16,  
        EGL_ALPHA_SIZE,     EGL_DONT_CARE,  
        EGL_STENCIL_SIZE,   EGL_DONT_CARE,  
        EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,  
        EGL_NONE            // 属性表以该常量为结束符  
    };  
    GLint numConfigs;  
    EGLConfig config;  
    if (success != EGL_FALSE)  
        success = eglGetConfigs(display, NULL, 0, &numConfigs);  
    if (success != EGL_FALSE && numConfigs > 0)  
        success = eglChooseConfig(display, CONFIG_ATTRIBS, &config, 1, &numConfigs); 

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">可以查询某个配置的某个属性:</span>
<p>

<br />

</p>
<p>

<span style="line-height:1.5;"> </span> 

</p>

    EGLBoolean eglGetConfigAttrib(EGLDisplay display,    // 已初始化  
                                  EGLConfig config,      // 某个配置  
                                  EGLint attribute,      // 某个属性  
                                  EGLint * value);  

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">让EGL为你选择一个配置:</span>
<p>

<br />

</p>
<p>

<span style="line-height:1.5;"> </span> 

</p>

 EGLBoolean eglChooseConfig(EGLDisplay display,  
                               const EGLint* attribs,    // 你想要的属性事先定义到这个数组里  
                               EGLConfig* configs,       // 图形系统将返回若干满足条件的配置到该数组  
                               EGLint maxConfigs,        // 上面数组的容量  
                               EGLint* numConfigs);      // 图形系统返回的可用的配置个数  



<p>

<br />

</p>
<p>

<span style="line-height:1.5;"><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL如果选择了多个配置给你,则按一定规则放到数组里:</span><br />

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">1> EGL_CONFIG_CAVEAT</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">2> EGL_COLOR_BUFFER_TYPE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">3> 按color buffer所占位宽</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">4> EGL_BUFFER_SIZE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">5> EGL_SAMPLE_BUFFERS</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">6> EGL_SAMPLES</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">7> EGL_DEPTH_SIZE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">8> EGL_STENCIL_SIZE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">9> EGL_ALPHA_MASK_SIZE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">10> EGL_NATIVE_VISUAL_TYPE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">11> EGL_CONFIG_ID</span>



<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">● EGLSurface</span></span>
</p>
<p>

<span style="line-height:1.5;"> </span> 

</p>

 EGLSurface eglCreateWindowSurface(EGLDisplay display,  
                                      EGLConfig config,  
                                      EGLNativeWindowType window, // 在Windows上就是HWND类型  
                                      const EGLint* attribs);     // 此属性表非彼属性表  

<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

这里的属性表并非用于OpenGL ES 2.0,而是其它的API,比如OpenVG。我们只需要记住一个:EGL_RENDER_BUFFER [EGL_BACK_BUFFER, EGL_FRONT_BUFFER]。<br />

OpenGL ES 2.0是必须工作于双缓冲窗口系统的。

该属性表当然也可以为NULL,也可以只有一个EGL_NONE。那表示所有属性使用默认值。

如果函数返回EGL_NO_SURFACE,则失败。错误码:

EGL_BAD_MATCH:          属性设置错误。比如EGL_SURFACE_TYPE没有设置EGL_WINDOW_BIT

EGL_BAD_CONFIG:         因为配置错误,图形系统不支持

EGL_BAD_NATIVE_WINDOW:  窗口句柄错误

EGL_BAD_ALLOC:          无法创建绘图表面。比如先前已经创建一个了。
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

● pixel buffer<br />

OpenGL ES 2.0可以向pixel buffer渲染,同样使用硬件加速。pbuffer经常用来生成纹理映射。如果想渲染到纹理,常用更高效的framebuffer对象。

在EGL_SURFACE_TYPE里使用使用EGL_PBUFFER_BIT可创建pbuffer:
</p>

 EGLSurface eglCreatePbufferSurface(EGLDisplay display,  
                                       EGLConfig config,  
                                       const EGLint* attribs);  

<p>

<span style="line-height:1.5;"><br />

</span>
</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

使用到的属性:

</p>
<p style="font-family:Arial;font-size:14px;background-color:#FFFFFF;">

EGL_WIDTH, EGL_HEIGHT<br />

EGL_LARGEST_PBUFFER:        如果参数不合适,可使用最大的pbuffer

EGL_TEXTURE_FORMAT:         [EGL_NO_TEXTURE] 如果pbuffer要绑定到纹理映射,要指定纹理的格式

EGL_TEXTURE_TARGET:            [EGL_NO_TEXTURE, EGL_TEXTURE_2D]

EGL_MIPMAP_TEXTRUE:         [EGL_TRUE, EGL_FALSE]
</p>
<p>

<span style="line-height:1.5;"><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">创建失败时返回EGL_NO_SURFACE,错误码:</span><br />

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL_BAD_ALLOC:      缺少资源</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL_BAD_CONFIG:     配置错误</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL_BAD_PARAMETER:  EGL_WIDTH和EGL_HEIGHT为负数</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL_BAD_MATCH:      配置错误;如果用于纹理映射,则高宽参数错误;EGL_TEXTURE_FORMAT和EGL_TEXTURE_TARGET只有一个不是EGL_NO_TEXTURE</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">EGL_BAD_ATTRIBUTE:  指定了EGL_TEXTURE_FORMAT、EGL_TEXTURE_TARGET或者EGL_MIPMAP_TEXTRUE,却不指定使用OpenGLES在配置里</span></span>
</p>
<p>

<span style="line-height:1.5;"><span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">使用pbuffer的例子:</span></span> 

</p>
<p>

<span style="line-height:1.5;"> </span> 

</p>

 EGLint cfgAttribs[] =  
    {  
        EGL_SURFACE_TYPE,    EGL_PBUFFER_BIT,  
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,  
        EGL_RED_SIZE,        5,  
        EGL_GREEN_SIZE,      6,  
        EGL_BLUE_SIZE,       5,  
        EGL_DEPTH_SIZE,      1,  
        EGL_NONE  
    };  
    const EGLint MAX_CONFIG = 10;  // 我们要从10个配置里挑选一个  
    EGLConfig configs[MAX_CONFIG];  
    EGLint numConfigs;  
    if (!eglChooseConfig(display, cfgAttribs, configs, MAX_CONFIG, &numConfigs))  
    {  
        // 报错  
    }  
    else  
    {  
        // 挑选一个配置  
    }  
    EGLint PBufAttribs[] =  
    {  
        EGL_WIDTH,  512,  
        EGL_HEIGHT, 512,  
        EGL_LARGEST_PBUFFER, EGL_TRUE,  
        EGL_NONE  
    };  
    EGLRenderSurface pbuffer = eglCreatePbufferSurface(display, config, PBufAttribs);  
    if (pbuffer == EGL_NO_SURFACE)  
    {  
        // 创建失败,报各种错  
    }  
    EGLint width, height;  
    if (!eglQuerySurface(display, pbuffer, EGL_HEIGHT, &height)  
        || !eglQuerySurface(display, pbuffer, EGL_WIDTH, &width)  
    {  
        // 查询不到信息,报错  
    }  

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">pbuffer和普通的窗口渲染最大的不同是不能swap,要么拷贝其值,要么修改其绑定成为纹理。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">● EGLContext</span>
<p>

<br />

</p>
<p>

<span style="line-height:1.5;"> </span> 

</p>

EGLContext eglCreateContext(EGLDisplay display,  
                                EGLConfig config,  
                                EGLContext context,    // EGL_NO_CONTEXT表示不向其它的context共享资源  
                                const EGLint * attribs)// 我们暂时只用EGL_CONTEXT_CLIENT_VERSION  
    const EGLint attribs[] =  
    {  
        EGL_CONTEXT_CLIENT_VERSION, 2,  
        EGL_NONE  
    };  
    EGLContext context = eglCreateContext(display, cfg, EGL_NO_CONTEXT, attribs);  
    if (context == EGL_NO_CONTEXT)  
    {  
        if (EGL_BAD_CONFIG == eglGetError())  
        {  
            ...  
        }  
    }  
    if (!eglMakeCurrent(display, window, window, context)) // 两个window表示读写都在一个窗口  
    {  
        // 报错  
    }  

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">● 渲染同步</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">只使用OpenGL ES 2.0,那么,glFinish即可保证所有的渲染工作进行下去。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">但使用OpenVG或本地图形API渲染字体,要比使用OpenGL ES 2.0要容易。所以,你可能要在同一个窗口使用多个库来渲染。</span>



<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">可以用EGL的同步函数:EGLBoolean eglWaitClient() 延迟客户端的执行,等待服务器端完成OpenGL ES 2.0或者OpenVG的渲染。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">如果失败,返回错误码:EGL_BAD_CURRENT_SURFACE。</span>



<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">如果要等待本地图形API的渲染完成,使用:EGLBoolean eglWaitNative(EGLint engine)。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">engine参数必须是EGL_CORE_NATIVE_ENGINE。其它值都是通过EGL扩展来指定。</span>

<span style="font-family:Arial;font-size:14px;line-height:26px;background-color:#FFFFFF;">如果失败,返回错误码:EGL_BAD_PARAMETER。</span>

<p>

<br />

</p>
<p>

<span style="line-height:1.5;"><br />

</span>
</p>
<p>

<br />

</p>
<p>

<span style="line-height:1.5;"><br />

</span>
</p>
<p>

<br />

</p>


























































































































































































































Read >>


glDrawArrays参数详解

<h1 style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

glDrawArrays参数详解

</h1>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

<br />

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

在OpenGl中所有的图形都是通过分解成三角形的方式进行绘制。

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

绘制图形通过GL10类中的glDrawArrays方法实现,

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

该方法原型:

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

glDrawArrays(int mode, int first,int count)

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

参数1:有三种取值

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.GL_TRIANGLES:每三个顶之间绘制三角形,之间不连接

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式绘制三角形

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.GL_TRIANGLE_STRIP:顺序在每三个顶点之间均绘制三角形。这个方法可以保证从相同的方向上所有三角形均被绘制。以V0V1V2,V1V2V3,V2V3V4……的形式绘制三角形

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

&nbsp;
<p>
    <!--more-->
</p>
<p>
    <br />
</p>

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

参数2:从数组缓存中的哪一位开始绘制,一般都定义为0

</p>
<p style="font-family:Helvetica, Tahoma, Arial, sans-serif;font-size:14px;background-color:#FFFFFF;">

参数3:顶点的数量

</p>













Read >>


error C2039: lstrlenW不是ATL的成员解决方法

<p>

问题解决方法&nbsp;

</p>
<p>

&nbsp;以下为解决的步骤:

</p>
<p>

&nbsp;1.         从微软网站上下载VisualStudioDeviceWindowsEmbeddedCompact7.msi补丁包,安装该补丁包。&nbsp;

</p>
<p>

下载地址为:

http://www.microsoft.com/en-us/download/details.aspx?id=27729 
</p>
<p>

&nbsp;这个补丁包微软解决了VS2008中的很多问题,

</p>
<p>

具体可参看如下链接:

http://support.microsoft.com/kb/2468183
</p>
<p>

<br />

</p>
<p>

<p>
    <!--more-->
</p>
<p>
    <br />
</p>

  1. 在2节新建的工程上单击右键,选择“属性”菜单,弹出如下菜单:
    </p>

<p>

<img src="/wp-content/uploads/2014/10/20141007083104_64126.jpg" alt="" /> 

</p>
<p>

<br />

点击你当前项目的属性-》C/C++-》常规-》 附加包含目录:
</p>
<p>

<span style="line-height:1.5;">&nbsp;</span> ce7的安装目录下的include和altmfc\include;该路径因CE安装路径的不同而不同。单击“确定”,关闭该对话框,重新编译工程,1节描述的错误不再出现。

</p>
<p>

<br />

</p>
<p>

<span style="color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;line-height:normal;background-color:#FFFFFF;">头文件会更新在以下位置:</span><br />



<span style="color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;line-height:normal;background-color:#FFFFFF;">对于 32 位操作系统:</span>
</p>
<div class="indent" style="margin:0px;padding:0px 20px 10px;color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;background-color:#FFFFFF;">

&nbsp;<b><i>&lt;system drive=""&gt;:&lt;/system&gt;</i>\Program Files\Microsoft Visual Studio 9.0\VC\ce7</b> 

</div>
<span style="color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;line-height:normal;background-color:#FFFFFF;">对于 64 位操作系统:</span>

<div class="indent" style="margin:0px;padding:0px 20px 10px;color:#333333;font-family:'Segoe UI', Arial, Verdana, Tahoma, sans-serif;font-size:13px;background-color:#FFFFFF;">

<b>&lt;system drive=""&gt;:&lt;/system&gt;\Program 文件 (x86) \Microsoft Visual Studio 9.0\VC\ce7</b> 

</div>
<p>

<br />

</p>
<p>

<br />

</p>























Read >>


.NET 窗口句柄操作

<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。</span><br />



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">1、如何获得一个窗口的句柄?</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">例如获取窗口PictureBox控件(其他控件也可以)的句柄,</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">IntPtr handle = pictureBox.Handle;</span>

<p>
    <!--more-->
</p>
<p>
    <br />
</p>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">2、注意:窗口创建和窗口创建完毕即有句柄完全是两回事!!!</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">窗口创建时,窗口并没有创建句柄,只有Application.Run(form)或者form.Show()之后才有句柄,即窗口只有显示或者启动消息循环后才有句柄!如果创建form之后Form. form. = new Form(),主线程中调用form.Handle,如果句柄尚未创建,引用该属性将强制创建句柄,对系统内的逻辑将产生致命的影响。</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">3、如何判断一个窗口的句柄创建完毕?</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">利用IsHandleCreated 属性:此属性指示控件是否有与他关联的句柄,如果已经为控件分配了句柄,则为 true;否则为 false。</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">4、一些属性:</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(1)、CreateControl :强制创建控件,包括句柄和任何子控件</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(2)、CreateHandle :为该控件创建句柄,</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">通常,不应该直接调用 CreateHandle 方法。首选的方法是调用CreateControl方法,此方法在创建控件时强制为该控件及其子控件创建一个句柄。给继承者的说明 在派生类中重写 CreateHandle 时,请确保调用了基类的 CreateHandle 方法,以便确保已创建该句柄。</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(3)、DestroyHandle :毁坏与该控件关联的句柄</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(4)、FromChildHandle :检索包含指定句柄的控件</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(5)、FromHandle :返回当前与指定句柄关联的控件</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(6)、Handle :获取控件绑定到的窗口句柄,Handle 属性的值是 Windows HWND。如果句柄尚未创建,引用该属性将强制创建句柄。</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(7)、IsHandleCreated :指示控件是否有与他关联的句柄,如果已经为控件分配了句柄,则为 true;否则为 false。</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(8)、RecreateHandle :强制为控件重新创制句柄</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">(9)、RecreatingHandle :指示当前是否在重创句柄</span>



<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">5.注意:</span>

<span style="color:#464646;font-family:simsun;font-size:13.63636302947998px;line-height:21px;">句柄是随机量,两次运行一般都会得到两次不同的结果</span>

</span>
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><br />

</span>
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>1. c#里FindWindow的用法</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

FindWindow()函数的用法。要在C#里使用该API,写出FindWindow()函数的声明:<br />

            [DllImport("coredll.dll", EntryPoint = "FindWindow")]

            private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。 看例子
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr ParenthWnd = new IntPtr(0);

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParenthWnd = FindWindow(null,"Word Mobile");<br />

            //判断这个窗体是否有效

            if (ParenthWnd != IntPtr.Zero)

            {

                MessageBox.Show("找到窗口");

            }
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show("没有找到窗口");<br />

   
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上面的讨论中可以看出,如果要搜索的外部程序的窗口标题比较容易得到,问题是比较简单的。可如果窗口的标题不固定或者根本就没有标题,怎么得到窗口的类呢?如果你安装了Visual C++,你可以使用其中的Spy,在Spy++中有一个FindWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口的类。<br />

    在Win32 API中还有一个FindWindowEx,它非常适合寻找子窗口。
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

本文摘自:&nbsp;<a href="http://blog.csdn.net/enginetanmary/archive/2007/04/20/1572319.aspx">http://blog.csdn.net/enginetanmary/archive/2007/04/20/1572319.aspx</a> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>2. FindWindowEx用法</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;函数原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;参数:

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;hwndParent:要查找子窗口的父窗口句柄。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;&nbsp;&nbsp;&nbsp;lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

C#中使用该函数首先导入命名空间:<br />

view plaincopy to clipboardprint?

using System.Runtime.InteropServices; 

using System.Runtime.InteropServices;
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

然后写API引用部分的代码,放入 class 内部

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;view plaincopy to clipboardprint?<br />

[DllImport("user32.dll", EntryPoint = "FindWindow")]  

private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow ) 

[DllImport("user32.dll", EntryPoint = "FindWindow")]

private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow )
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

例如:

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

view plaincopy to clipboardprint?<br />

const int BM_CLICK = 0xF5;  

IntPtr maindHwnd = FindWindow(null, "QQ用户登录"); //获得QQ登陆框的句柄  

if (maindHwnd != IntPtr.Zero)  

{  

    IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登录");   //获得按钮的句柄  

    if (childHwnd != IntPtr.Zero)  

    {  

        SendMessage(childHwnd, BM_CLICK, 0, 0);     //发送点击按钮的消息  

    }  

    else 

    {  

        MessageBox.Show("没有找到子窗口");  

    }  

}  

else 

{  

    MessageBox.Show("没有找到窗口");  

}  
</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

&nbsp;

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

本文摘自:<a href="http://blog.csdn.net/coolszy/archive/2010/04/24/5523784.aspx">http://blog.csdn.net/coolszy/archive/2010/04/24/5523784.aspx</a> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

以及&nbsp;<a href="http://topic.csdn.net/u/20100105/22/6369868a-93b4-4ae5-b522-93536fa3fc23.html">http://topic.csdn.net/u/20100105/22/6369868a-93b4-4ae5-b522-93536fa3fc23.html</a>&nbsp;中的经典<span>回答</span>。

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>3. c#通过SendMessage发送消息</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

请查看:&nbsp;<a href="http://blog.csdn.net/spo22/archive/2009/11/16/4816811.aspx">http://blog.csdn.net/spo22/archive/2009/11/16/4816811.aspx</a> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span>4. 全部的Windows消息</span> 

</p>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><span>请查看:&nbsp;&nbsp;</span>&nbsp;<a href="http://topic.csdn.net/t/20050713/18/4142641.html">http://topic.csdn.net/t/20050713/18/4142641.html</a><br />



</span>
</p>
<h2 style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span><span style="color:#526673;font-family:微软雅黑, 黑体;font-size:18.18181800842285px;line-height:20px;background-color:#E2E2E2;">C#&nbsp;获得窗口控件句柄</span></span> 

</h2>
<p style="color:#555555;font-family:simsun;font-size:13.63636302947998px;background-color:#FFFFFF;">

<span> </span> 

</p>

[DllImport("User32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);

    [DllImport("user32.dll", EntryPoint = "FindWindowEx",SetLastError = true)]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hWnd,int Msg, IntPtr wParam, string lParam);

    const int WM_GETTEXT = 0x000D;
    const int WM_SETTEXT = 0x000C;
    const int WM_CLICK = 0x00F5;

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        int retval = 0; //增加一个返回值用来判断操作是否成功
        //string lpszParentClass = "#32770"; //整个窗口的类名
        string lpszParentWindow = "Form1"; //窗口标题
        string lpszClass = "WindowsForms10.EDIT.app.0.b7ab7b"; //需要查找的子窗口的类名,也就是输入框
        //string lpszClass = "Edit";
        string lpszClass_Submit = "WindowsForms10.BUTTON.app.0.b7ab7b"; //需要查找的Button的类名
        //string lpszClass_Submit = "Button";
        string lpszName_Submit = "确定"; //需要查找的Button的标题
        string text = "";

        IntPtr ParenthWnd = new IntPtr(0);
        IntPtr EdithWnd = new IntPtr(0);

        //查到窗体,得到整个窗体
        ParenthWnd = FindWindow(null, lpszParentWindow);

        //判断这个窗体是否有效
        if (!ParenthWnd.Equals(IntPtr.Zero))
        {
          //得到Form1这个子窗体的文本框,并设置其内容
          EdithWnd = FindWindowEx(ParenthWnd, EdithWnd, lpszClass, "");   [color=#FF0000]这里获取到的EdithWnd始终为0;[/color]
        
          if (!EdithWnd.Equals(IntPtr.Zero))
          {
            text = "test1";
            //调用SendMessage方法设置其内容
            SendMessage(EdithWnd, WM_SETTEXT, IntPtr.Zero, text);
            retval++;
          }
        
          //得到Button这个子窗体,并触发它的Click事件
          EdithWnd = FindWindowEx(ParenthWnd,
          (IntPtr)0, lpszClass_Submit, lpszName_Submit);
          if (!EdithWnd.Equals(IntPtr.Zero))
          {
            SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
            retval++;
          }
        }
    }



<p>

<br />

</p>






































































































Read >>


短消息的Text模式以及PDU模式的区别

发送短消息常用Text和PDU(Protocol Data
Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。


Read >>