<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_mazhenyu</title><subtitle type="text">男，28，北京 邮箱：malin213@tom.comVC++ .net OpenGLQQ:274955617</subtitle><id>http://feed.cnblogs.com/blog/u/13254/rss</id><updated>2012-05-15T02:59:19Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/13254/rss"/><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501142.html</id><title type="text">BitBlt 注意事项(CAPTUREBLT) (转)</title><summary type="text">BitBlt 注意事项(CAPTUREBLT) 分类： C/C++ VC 2011-08-01 17:29 BitBlt 函数用于在设备间传递某块像素，例如向窗口表面呈现位图，或是复制屏幕 (截屏) 。这篇文字讲述了复制屏幕过程中需要注意的问题。基本过程：创建源设备上下文 (hDC = CreateDC,GetDC,GetWindowDC) 。创建兼容的设备上下文 (hMemDC = CreateCompatibleDC) 。创建兼容位图 (hBmp = CreateCompatibleBitmap) 。将 hBmp 选入 hMemDC (hOldBmp = SelectObject) 。进.</summary><published>2012-05-15T02:59:00Z</published><updated>2012-05-15T02:59:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501142.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501142.html"/><content type="html">&lt;div class="article_title"&gt;&lt;span class="ico ico_type_Repost"&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;&lt;span class="link_title"&gt;&lt;a href="http://blog.csdn.net/cay22/article/details/6651532"&gt;BitBlt 注意事项(CAPTUREBLT) &lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="article_manage"&gt;&lt;span class="link_categories"&gt;分类： &lt;a href="http://blog.csdn.net/cay22/article/category/484438"&gt;C/C++&lt;/a&gt; &lt;a href="http://blog.csdn.net/cay22/article/category/489447"&gt;VC&lt;/a&gt; &lt;/span&gt;&lt;span class="link_postdate"&gt;2011-08-01 17:29&lt;/span&gt;&amp;nbsp; &lt;/div&gt;&lt;div id="article_content" class="article_content"&gt;&amp;nbsp; &lt;p align="left"&gt;BitBlt 函数用于在设备间传递某块像素，例如向窗口表面呈现位图，或是复制屏幕 (截屏) 。&lt;br /&gt;&lt;br /&gt;这篇文字讲述了复制屏幕过程中需要注意的问题。&lt;br /&gt;&lt;br /&gt;基本过程：&lt;br /&gt;&lt;br /&gt;创建源设备上下文 (hDC = CreateDC,GetDC,GetWindowDC) 。&lt;br /&gt;创建兼容的设备上下文 (hMemDC = CreateCompatibleDC) 。&lt;br /&gt;创建兼容位图 (hBmp = CreateCompatibleBitmap) 。&lt;br /&gt;将 hBmp 选入 hMemDC (hOldBmp = SelectObject) 。&lt;br /&gt;进行拷贝 (BitBlt) 。&lt;br /&gt;将 hOldBmp 还原给 hMemDC (hBmp = SelectObject) 。&lt;br /&gt;删除释放设备上下文 (DeleteDC,ReleaseDC) 。&lt;br /&gt;&lt;br /&gt;一般在 BitBlt 过程中指定 SRCCOPY 形式的光栅操作，这样做没有错，事实上也得到了当前屏幕的拷贝，现在观察下面两幅图像：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;这是整个屏幕的一部分，左边的图像指定了 SRCCOPY ，右边的图像似乎多了点东西，那是上下文菜单的阴影，截获这层阴影需要用 CAPTUREBLT 与 SRCCOPY 合并。&lt;br /&gt;&lt;br /&gt;CAPTUREBLT：&lt;br /&gt;Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window. Note that this generally cannot be used for printing device contexts.&lt;br /&gt;&lt;br /&gt;(生成的图像中包含您的窗口上层叠的那些窗口。默认情况下，该图像仅包含您的窗口。请注意，这通常无法用于打印设备上下文。)&lt;br /&gt;&lt;br /&gt;另外，如果不使用 CAPTUREBLT 光栅操作，结果将不会包含透明度 &amp;lt; 255 的窗口。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C Code - :&lt;br /&gt;&lt;br /&gt;HDC hDC, hMemDC;&lt;br /&gt;HANDLE hBmp, hOldBmp;&lt;br /&gt;DWORD w, h;&lt;br /&gt;&lt;br /&gt;w = GetSystemMetrics(SM_CXSCREEN);&lt;br /&gt;h = GetSystemMetrics(SM_CYSCREEN);&lt;br /&gt;&lt;br /&gt;hDC = CreateDC("DISPLAY", NULL, NULL, NULL);&lt;br /&gt;hMemDC = CreateCompatibleDC(hDC);&lt;br /&gt;hBmp = CreateCompatibleBitmap(hDC, w, h);&lt;br /&gt;hOldBmp = SelectObject(hMemDC, hBmp);&lt;br /&gt;&lt;br /&gt;BitBlt(hMemDC, 0, 0, w, h, hDC, 0, 0, CAPTUREBLT | SRCCOPY);&lt;br /&gt;&lt;br /&gt;hBmp = SelectObject(hMemDC, hOldBmp);&lt;br /&gt;&lt;br /&gt;DeleteDC(hDC);&lt;br /&gt;DeleteDC(hMemDC);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有一个窗体A，指定了WS_EX_LAYERED风格，&lt;/p&gt;&lt;p&gt;通过&lt;/p&gt;&lt;p&gt;BitBlt + SRCCOPY 可以截取该窗口后面的图像，但是不能截取到该窗口后面的半透明的窗口&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;网上找了很多资料，通过&lt;/p&gt;&lt;p&gt;BitBlt + SRCCOPY | CAPTUREBLT可以截获半透明窗体&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为了截获窗体后面的图像并包含半透明窗体，我想了两个办法&lt;/p&gt;&lt;p&gt;方法一: 我把窗体A透明，再通过BitBlt + SRCCOPY | CAPTUREBLT截取，截取完再设成不透明&lt;/p&gt;&lt;p&gt;方法二: 我把窗体A移走，再通过BitBlt + SRCCOPY | CAPTUREBLT截取，截取完再移回来&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但是这两个方法都会闪的很厉害，&lt;/p&gt;&lt;p&gt;请问还有没有别的方法能够取得窗体后面的图像并包含半透明窗体&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;备注:上面说的半透明窗体就是指定了WS_EX_LAYERED风格的窗体 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;///&lt;/p&gt;&lt;p&gt;我记得直接GetDC(NULL)、BitBlt获取的就是窗口后面的图象。 &lt;/p&gt;&lt;p&gt;///&lt;/p&gt;&lt;p&gt;直接使用BitBlt + SRCCOPY可以获得LAYERED窗体背后的图像，但是不能获得该窗体后面的LAYERED窗体的图像&lt;/p&gt;&lt;p&gt;///&lt;/p&gt;&lt;p&gt;Vista带的放大镜可以放大后面的LAYERED窗口，不知道怎么实现的&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hi.baidu.com/dedicatus545/blog/item/3fc552811060dadf9023d97a.html"&gt;http://hi.baidu.com/dedicatus545/blog/item/3fc552811060dadf9023d97a.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://topic.csdn.net/u/20081007/18/86a3c0dd-d180-4334-a5f0-6a548019a90b.html"&gt;http://topic.csdn.net/u/20081007/18/86a3c0dd-d180-4334-a5f0-6a548019a90b.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2501142.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501142.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501020.html</id><title type="text">VC++ MFC DLL动态链接库编写详解 (转)</title><summary type="text">VC++ MFC DLL动态链接库编写详解 MFCVC++CC++C#虽然能用DLL实现的功能都可以用COM来替代，但DLL的优点确实不少，它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL，以及如何使用他们。一、DLL的不同类型使用VC++可以生成两种类型的DLL：MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL，但不是这里讨论的主要对象。1、MFC扩展DLL每个DLL都有某种类型的接口：变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL，MFC扩展DLL可以有C++的接口。也就是它可以导</summary><published>2012-05-15T02:21:00Z</published><updated>2012-05-15T02:21:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501020.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501020.html"/><content type="html">&lt;div class="blog_title"&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://peirenlei.iteye.com/blog/305115"&gt;VC++ MFC DLL动态链接库编写详解&lt;/a&gt; &lt;em class="actions"&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class="news_tag"&gt;&lt;a href="http://www.iteye.com/blogs/tag/MFC"&gt;MFC&lt;/a&gt;&lt;a href="http://www.iteye.com/blogs/tag/VC++"&gt;VC++&lt;/a&gt;&lt;a href="http://www.iteye.com/blogs/tag/C"&gt;C&lt;/a&gt;&lt;a href="http://www.iteye.com/blogs/tag/C++"&gt;C++&lt;/a&gt;&lt;a href="http://www.iteye.com/blogs/tag/C%23"&gt;C#&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="blog_content" class="blog_content"&gt;虽然能用DLL实现的功能都可以用COM来替代，但DLL的优点确实不少，它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL，以及如何使用他们。&lt;br /&gt;&lt;br /&gt;一、DLL的不同类型&lt;br /&gt;使用VC++可以生成两种类型的DLL：MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL，但不是这里讨论的主要对象。&lt;br /&gt;1、MFC扩展DLL&lt;br /&gt;每个DLL都有某种类型的接口：变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL，MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值，导出一个类时客户端能创建类对象或者派生这个类。同时，在DLL中也可以使用DLL和MFC。&lt;br /&gt;Visual C++使用的MFC类库也是保存在一个DLL中，MFC扩展DLL动态连接到MFC代码库的DLL，客户程序也必须要动态连接到MFC代码库的DLL。（这里谈到的两个DLL，一个是我们自己编写的DLL，一个装MFC类库的DLL）现在MFC代码库的DLL也存在多个版本，客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作，扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。&lt;br /&gt;2、常规DLL&lt;br /&gt;使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作，如果需要一个使用更广泛的DLL，最好采用常规DLL，因为它不受MFC的某些限制。常规DLL也有缺点：它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC，但在DLL和客户程序的内部还是可以使用MFC。&lt;br /&gt;当在常规DLL的内部使用MFC代码库的DLL时，可以是动态连接/静态连接。如果是动态连接，也就是常规DLL需要的MFC代码没有构建到DLL中，这种情况有点和扩展DLL类似，在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接，常规DLL里面已经包含了需要的MFC代码，这样DLL的体积将比较大，但它可以在没有MFC代码库DLL的计算机上正常运行。&lt;br /&gt;&lt;br /&gt;二、建立DLL&lt;br /&gt;利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL，这里就不多讲了，主要的任务是如何给DLL添加功能，以及在客户程序中利用这个DLL&lt;br /&gt;1、导出类&lt;br /&gt;用向导建立好框架后，就可以添加需要导出类的.cpp .h文件到DLL中来，或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类，在类声明的时候要加&amp;#8220;_declspec(dllexport)&amp;#8221;,如： &lt;br /&gt;class _declspec(dllexport) CMyClass&lt;br /&gt;{&lt;br /&gt;...//声明 &lt;br /&gt;}&lt;br /&gt;如果创建的MFC扩展DLL，可以使用宏：AFX_EXT_CLASS:&lt;br /&gt;class AFX_EXT_CLASS CMyClass&lt;br /&gt;{&lt;br /&gt;...//声明 &lt;br /&gt;}&lt;br /&gt;这样导出类的方法是最简单的，也可以采用.def文件导出，这里暂不详谈。&lt;br /&gt;2、导出变量、常量、对象&lt;br /&gt;很多时候不需要导出一个类，可以让DLL导出一个变量、常量、对象，导出它们只需要进行简单的声明：_declspec(dllexport) int MyInt; &lt;br /&gt;_declspec(dllexport) extern const COLORREF MyColor=RGB(0,0,0); &lt;br /&gt;_declspec(dllexport) CRect rect(10,10,20,20); &lt;br /&gt;要导出一个常量时必须使用关键字extern，否则会发生连接错误。&lt;br /&gt;注意：如果客户程序识别这个类而且有自己的头文件，则只能导出一个类对象。如果在DLL中创建一个类，客户程序不使用头文件就无法识别这个类。&lt;br /&gt;当导出一个对象或者变量时，载入DLL的每个客户程序都有一个自己的拷贝。也就是如果两个程序使用的是同一个DLL，一个应用程序所做的修改不会影响另一个应用程序。 &lt;br /&gt;我们在导出的时候只能导出DLL中的全局变量或对象，而不能导出局部的变量和对象，因为它们过了作用域也就不存在了，那样DLL就不能正常工作。如： &lt;br /&gt;MyFunction()&lt;br /&gt;{&lt;br /&gt;_declspec(dllexport) int MyInt; &lt;br /&gt;_declspec(dllexport) CMyClass object; &lt;br /&gt;}&lt;br /&gt;3、导出函数&lt;br /&gt;导出函数和导出变量/对象类似，只要把_declspec(dllexport)加到函数原型开始的位置：&lt;br /&gt;_declspec(dllexport) int MyFunction(int);&lt;br /&gt;如果是常规DLL，它将和C写的程序使用，声明方式如下：&lt;br /&gt;extern "c" _declspec(dllexport) int MyFunction(int);&lt;br /&gt;实现：&lt;br /&gt;extern "c" _declspec(dllexport) int MyFunction(int x)&lt;br /&gt;{&lt;br /&gt;...//操作 &lt;br /&gt;}&lt;br /&gt;如果创建的是动态连接到MFC代码库DLL的常规DLL，则必须插入AFX_MANAGE_STATE作为导出函数的首行，因此定义如下：&lt;br /&gt;extern "c" _declspec(dllexport) int MyFunction(int x)&lt;br /&gt;{&lt;br /&gt;AFX_MANAGE_STATE(AfxGetStaticModuleState()); &lt;br /&gt;...//操作 &lt;br /&gt;}&lt;br /&gt;有时候为了安全起见，在每个常规DLL里都加上，也不会有任何问题，只是在静态连接的时候这个宏无效而已。这是导出函数的方法，记住只有MFC扩展DLL才能让参数和返回值使用MFC的数据类型。&lt;br /&gt;4、导出指针&lt;br /&gt;导出指针的方式如下：&lt;br /&gt;_declspec(dllexport) int *pint;&lt;br /&gt;_declspec(dllexport) CMyClass object = new CMyClass;&lt;br /&gt;如果声明的时候同时初始化了指针，就需要找到合适的地方类释放指针。在扩展DLL中有个函数DllMain()。（注意函数名中的两个l要是小写字母），可以在这个函数中处理指针：&lt;br /&gt;# include "MyClass.h"&lt;br /&gt;_declspec(dllexport) CMyClass *pobject = new CMyClass;&lt;br /&gt;DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)&lt;br /&gt;{&lt;br /&gt;if(dwReason == DLL_PROCESS_ATTACH) &lt;br /&gt;{ &lt;br /&gt;.....// &lt;br /&gt;} &lt;br /&gt;else if(dwReason == DLL_PROCESS_DETACH) &lt;br /&gt;{ &lt;br /&gt;delete pobject; &lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;常规DLL有一个从CWinApp派生的类对象处理DLL的开和关，可以使用类向导添加InitInstance/ExitInstance函数。&lt;br /&gt;int CMyDllApp::ExitInstance()&lt;br /&gt;{&lt;br /&gt;delete pobject; &lt;br /&gt;return CWinApp::ExitInstance(); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;三、在客户程序中使用DLL&lt;br /&gt;编译一个DLL时将创建两个文件.dll文件和.lib文件。首先将这两个文件复制到客户程序项目的文件夹里，这里需要注意DLL和客户程序的版本问题，尽量使用相同的版本，都使用RELEASE或者都是DEBUG版本。 &lt;br /&gt;接着就需要在客户程序中设置LIB文件，打开Project Settings--- &amp;gt;Link---&amp;gt;Object/library Modules中输入LIB的文件名和路径。如：Debug/SampleDll.lib。除了DLL和LIB文件外，客户程序需要针对导出类、函数、对象和变量的头文件，现在进行导入添加的关键字就是：_declspec(dllimport)，如：&lt;br /&gt;_declspec(dllimport) int MyFunction(int);&lt;br /&gt;_declspec(dllimport) int MyInt;&lt;br /&gt;_declspec(dllimport) CMyClass object;&lt;br /&gt;extern "C" _declspec(dllimport) int MyFunction(int);&lt;br /&gt;在有的时候为了导入类，要把相应类的头文件添加到客户程序中，不同的是要修改类声明的标志：&lt;br /&gt;class _declspec(dllimport) CMyClass，如果创建的是扩展DLL，两个位置都是:&lt;br /&gt;class AFX_EXT_CLASS CMyClass。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;使用DLL的一个比较严重的问题就是编译器之间的兼容性问题。不同的编译器对c++函数在二进制级别的实现方式是不同的。所以对基于C++的DLL，如果编译器不同就有很麻烦的。如果创建的是MFC扩展DLL，就不会存在问题，因为它只能被动态连接到MFC的客户应用程序。这里不是本文讨论的重点。&lt;br /&gt;&lt;br /&gt;一、重新编译问题&lt;br /&gt;我们先来看一个在实际中可能遇到的问题：&lt;br /&gt;比如现在建立好了一个DLL导出了CMyClass类，客户也能正常使用这个DLL，假设CMyClass对象的大小为30字节。如果我们需要修改DLL中的CMyClass类，让它有相同的函数和成员变量，但是给增加了一个私有的成员变量int类型，现在CMyClass对象的大小就是34字节了。当直接把这个新的DLL给客户使用替换掉原来30字节大小的DLL，客户应用程序期望的是30字节大小的对象，而现在却变成了一个34字节大小的对象，糟糕，客户程序出错了。&lt;br /&gt;类似的问题，如果不是导出CMyClass类，而在导出的函数中使用了CMyClass，改变对象的大小仍然会有问题的。这个时候修改这个问题的唯一办法就是替换客户程序中的CMyClass的头文件，全部重新编译整个应用程序，让客户程序使用大小为34字节的对象。&lt;br /&gt;这就是一个严重的问题，有的时候如果没有客户程序的源代码，那么我们就不能使用这个新的DLL了。&lt;br /&gt;&lt;br /&gt;二、解决方法 &lt;br /&gt;为了能避免重新编译客户程序，这里介绍两个方法：（1）使用接口类。（2）使用创建和销毁类的静态函数。&lt;br /&gt;1、使用接口类&lt;br /&gt;接口类的也就是创建第二个类，它作为要导出类的接口，所以在导出类改变时，也不需要重新编译客户程序，因为接口类没有发生变化。&lt;br /&gt;假设导出的CMyClass类有两个函数FunctionA FunctionB。现在创建一个接口类CMyInterface，下面就是在DLL中的CMyInterface类的头文件的代码：&lt;br /&gt;# include "MyClass.h"&lt;br /&gt;class _declspec(dllexport) CMyInterface&lt;br /&gt;{&lt;br /&gt;CMyClass *pmyclass;&lt;br /&gt;CMyInterface();&lt;br /&gt;~CMyInterface();&lt;br /&gt;public:&lt;br /&gt;int FunctionA(int);&lt;br /&gt;int FunctionB(int);&lt;br /&gt;};&lt;br /&gt;而在客户程序中的头文件稍不同，不需要INCLUDE语句，因为客户程序没有它的拷贝。相反，使用一个CMyClass的向前声明，即使没有头文件也能编译：&lt;br /&gt;class _declspec(dllexport) CMyInterface&lt;br /&gt;{&lt;br /&gt;class CMyClass;//向前声明&lt;br /&gt;CMyClass *pmyclass;&lt;br /&gt;CMyInterface();&lt;br /&gt;~CMyInterface();&lt;br /&gt;public:&lt;br /&gt;int FunctionA(int);&lt;br /&gt;int FunctionB(int);&lt;br /&gt;};&lt;br /&gt;在DLL中的CMyInterface的实现如下：&lt;br /&gt;CMyInterface::CMyInterface()&lt;br /&gt;{&lt;br /&gt;pmyclass = new CMyClass();&lt;br /&gt;}&lt;br /&gt;CMyInterface::~CMyInterface()&lt;br /&gt;{&lt;br /&gt;delete pmyclass;&lt;br /&gt;}&lt;br /&gt;int CMyInterface::FunctionA()&lt;br /&gt;{&lt;br /&gt;return pmyclass-&amp;gt;FunctionA();&lt;br /&gt;}&lt;br /&gt;int CMyInterface::FunctionB()&lt;br /&gt;{&lt;br /&gt;return pmyclass-&amp;gt;FunctionB(); &lt;br /&gt;}&lt;br /&gt;.....&lt;br /&gt;对导出类CMyClass的每个成员函数，CMyInterface类都提供自己的对应的函数。客户程序与CMyClass没有联系，这样任意改CMyClass也不会有问题，因为CMyInterface类的大小没有发生变化。即使为了能访问CMyClass中的新增变量而给CMyInterface类加了函数也不会有问题的。&lt;br /&gt;但是这种方法也存在明显的问题，对导出类的每个函数和成员变量都要对应实现，有的时候这个接口类会很庞大。同时增加了客户程序调用所需要的时间。增加了程序的开销。&lt;br /&gt;&lt;br /&gt;2、使用静态函数&lt;br /&gt;还可以使用静态函数来创建和销毁类对象。创建一个导出类的时候，增加两个静态的公有函数CreateMe()/DestroyMe()，头文件如下：&lt;br /&gt;class _declspec(dllexport) CMyClass&lt;br /&gt;{&lt;br /&gt;CMyClass(); &lt;br /&gt;~CMyClass(); &lt;br /&gt;public: &lt;br /&gt;static CMyClass *CreateMe(); &lt;br /&gt;static void DestroyMe(CMyClass *ptr); &lt;br /&gt;};&lt;br /&gt;实现函数就是：&lt;br /&gt;CMyClass * CMyClass::CMyClass()&lt;br /&gt;{&lt;br /&gt;return new CMyClass; &lt;br /&gt;}&lt;br /&gt;void CMyClass::DestroyMe(CMyClass *ptr)&lt;br /&gt;{&lt;br /&gt;delete ptr; &lt;br /&gt;}&lt;br /&gt;然后象其他类一样导出CMyClass类，这个时候在客户程序中使用这个类的方法稍有不同了。如若想创建一个CMyClass对象，就应该是：&lt;br /&gt;CMyClass x;&lt;br /&gt;CMyClass *ptr = CMyClass::CreateMe();&lt;br /&gt;在使用完后删除：&lt;br /&gt;CMyClass::DestroyMe(ptr);&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2501020.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/05/15/2501020.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/05/14/2499573.html</id><title type="text">实现MFC扩展DLL中导出类和对话框 (转)</title><summary type="text">实现MFC扩展DLL中导出类和对话框 2006-03-02 15:54作者：江上飞鸟出处：vckbase责任编辑：方舟如果要编写模块化的软件，就要对对动态链接库(DLL)有一定的了解，本人这段时间在修改以前的软件时，决定把重复用的类和对话框做到DLL中，下面就从一个简单的例子讲起，如何实现MFC扩展DLL中导出类和对话框。 一、创建MFC扩展DLL 步骤： 运行Visual Studio 6.0-&gt;File-&gt;New...-&gt;Projects； 选择Mfc AppWizard(dll),在右边Project name下输入ExportClass,单击“下一步”； 选择Mfc</summary><published>2012-05-14T08:32:00Z</published><updated>2012-05-14T08:32:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/14/2499573.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/14/2499573.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实现MFC扩展DLL中导出类和对话框 &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;2006-03-02 15:54&lt;/span&gt;&lt;span&gt;作者：江上飞鸟&lt;/span&gt;&lt;span&gt;出处：vckbase&lt;/span&gt;&lt;span&gt;责任编辑：方舟&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;　如果要编写模块化的软件，就要对对动态链接库(DLL)有一定的了解，本人这段时间在修改以前的软件时，决定把重复用的类和对话框做到DLL中，下面就从一个简单的例子讲起，如何实现MFC扩展DLL中导出类和对话框。 &lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;img border="0" src="http://image.tianjimedia.com/imagelist/06/03/g9na85o6o1re.jpg"  alt="" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一、创建MFC扩展DLL&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;步骤： &lt;br /&gt;&lt;br /&gt;运行Visual Studio 6.0-&amp;gt;File-&amp;gt;New...-&amp;gt;Projects； &lt;br /&gt;&lt;br /&gt;选择Mfc AppWizard(dll),在右边Project name下输入ExportClass,单击&amp;#8220;下一步&amp;#8221;； &lt;br /&gt;&lt;br /&gt;选择Mfc Extension DLL (using share MFC DLL) 单击&amp;#8220;finish&amp;#8221;； &lt;br /&gt;&lt;br /&gt;以上完成建立扩展DLL的框架，下面接着建立输出类：&lt;br /&gt;&lt;br /&gt;Insert-&amp;gt; New Class...在打开的对话框中，"Class Type" 选择"Generic Class",Class Name 中输入&lt;br /&gt;&lt;br /&gt;CDogClass(当然你可以用其它的名称，我喜欢小狗，所有用它了，在"Base Class"下输入CObject，然后"OK";&lt;br /&gt;&lt;br /&gt;为类添加两个测试用的变量 int m_nNum;CString m_sData;完全的类信息如下：&lt;br /&gt;&lt;br /&gt;DogClass.h头文件：&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;class CDogClass : public CObject&lt;br /&gt;{&lt;br /&gt;　private :&lt;br /&gt;int m_nNum;&lt;br /&gt;CString m_sData;&lt;br /&gt;　public:&lt;br /&gt;int ShowDlg();&lt;br /&gt;void Init();&lt;br /&gt;CDogClass();&lt;br /&gt;virtual ~CDogClass();&lt;br /&gt;void SetNum(int num) { m_nNum = num;};&lt;br /&gt;int GetNum() { return m_nNum; };&lt;br /&gt;void SetData(CString data) { m_sData = data;};&lt;br /&gt;CString GetData() { return m_sData; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;DogClass.cpp实现文件：&lt;br /&gt;&lt;br /&gt;CDogClass::CDogClass()&lt;br /&gt;{&lt;br /&gt;　Init();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CDogClass::~CDogClass()&lt;br /&gt;{}&lt;br /&gt;&lt;br /&gt;void CDogClass::Init()&lt;br /&gt;{&lt;br /&gt;　m_nNum = 0;&lt;br /&gt;　m_sData = "";&lt;br /&gt;} &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;编辑DogClass.h头文件修改下面一行；class AFX_EXT_CLASS CDogClass : public CObject&lt;br /&gt;&lt;br /&gt;以上完成类的建立，下面建立输出对话框；Insert-&amp;gt; Resouce...新建立一个对话框，添加两个编辑框IDC_EDIT1,IDC_EDIT2,然后建立CDlgDog对话框类并为两编辑框添加int m_nNum和CString m_sData的变量。&lt;br /&gt;&lt;br /&gt;在DogClass.cpp的#include "DogClass.h"下加入#include "DlgDog.h"&lt;br /&gt;&lt;br /&gt;在DogClass类中添加int ShowDlg();函数用来调用对话框，并在int CDogClass::ShowDlg()中添加如下代码：&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CDlgDog dlg;&lt;br /&gt;dlg.m_nNum = GetNum();&lt;br /&gt;dlg.m_sData = GetData();&lt;br /&gt;if (IDOK==dlg.DoModal())&lt;br /&gt;{&lt;br /&gt;　SetNum(dlg.m_nNum);&lt;br /&gt;　SetData(dlg.m_sData);&lt;br /&gt;　return 1;&lt;br /&gt;}&lt;br /&gt;return 0; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;然后编译Dll,会发现有几个错误，不用怕，好解决的，首先，去掉DlgDog.cpp中的 #include &amp;#8220;\ add additional includes here&amp;#8221;这一行；其次，在stdax.h中加入include "resource.h",再编译,OK。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二、建立DLL 测试程序&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;步骤：&lt;br /&gt;&lt;br /&gt;新建一个基于对话框的MFC应用程序，添加一按钮IDC_BUTTON1,并在按钮事件中添加如如下代码：&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;void CTestExportClassDlg::OnButton1()&lt;br /&gt;{&lt;br /&gt;　CDogClass dog;&lt;br /&gt;&lt;br /&gt;　dog.Init();&lt;br /&gt;　if (dog.ShowDlg()!=0)&lt;br /&gt;　{&lt;br /&gt;CString str;&lt;br /&gt;str.Format("Num is: %d Data is: %s" dog.GetNum(), dog.GetData());&lt;br /&gt;AfxMessageBox(str);&lt;br /&gt;　}&lt;br /&gt;} &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;从ExportClass文件目录拷贝DogClass.h和ExportClass.lib文件到测试程序目录下；&lt;br /&gt;&lt;br /&gt;在TestExportClassDlg.cpp中加入#include &amp;#8220;DogClass.h&amp;#8221;行；往连接程序的导入库中添加ExportClass.lib，在VS的Project-&amp;gt;Settings下的Setting For选择All Configuration.,然后在下面的页面Object/Library Conttrol中加入ExportClass.lib；&lt;br /&gt;&lt;br /&gt;别忘了把ExportClass.dll复制到系统目录或当前应用程序目录；然后编译就OK了。 &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2499573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/05/14/2499573.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/05/11/2496082.html</id><title type="text">转载-VFW编程实例（详）</title><summary type="text">转载-VFW编程实例（详） VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包，VFW的核心是AVI文件标准。AVI(Audio Video Interleave)文件中的音、视频数据帧交错存放。围绕AVI文件，VFW推出了一整套完整的视频采集、压缩、解压缩、回放和编辑的应用程序接口(API)。由于AVI文件格式推出较早且在数字视频技术中有广泛的应用，所以VFW仍然有很大的实用价值，而且进一步发展的趋势。 在VC++开发环境中调用VFW和使用其它开发包没有什么不同，只是需要将VFW32.lib文件加入工程中，但在开放视频捕捉与压缩管理程序时需要.</summary><published>2012-05-11T06:47:00Z</published><updated>2012-05-11T06:47:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/11/2496082.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/05/11/2496082.html"/><content type="html">&lt;div id="main"&gt;&lt;div class="post"&gt;&lt;p&gt;&lt;strong&gt;&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/oskycar/archive/2009/08/10/1543064.html"&gt;&lt;font color="#0000ff"&gt;转载-VFW编程实例（详）&lt;/font&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包，VFW的核心是AVI文件标准。AVI(Audio Video Interleave)文件中的音、视频数据帧交错存放。围绕AVI文件，VFW推出了一整套完整的视频采集、压缩、解压缩、回放和编辑的应用程序接口(API)。由于AVI文件格式推出较早且在数字视频技术中有广泛的应用，所以VFW仍然有很大的实用价值，而且进一步发展的趋势。&lt;/p&gt;&lt;p&gt;在VC++开发环境中调用VFW和使用其它开发包没有什么不同，只是需要将VFW32.lib文件加入工程中，但在开放视频捕捉与压缩管理程序时需要其它软件硬件设置。VFW为AVI文件提供了丰富的处理函数和宏定义，AVI文件的特点在于它是典型的数据流文件，它由视频流、音频流、文本流组成。所以对AVI文件的处理主要是处理文件流。&lt;/p&gt;&lt;p&gt;编程实例&lt;br /&gt;为了能够捕获视频帧，要启动一个捕获帧回调函数VideoStreamCallBack。&lt;br /&gt;捕获一个视频流或当前设备状态时分别使用以下函数： &lt;br /&gt;//捕获一个视频流 &lt;br /&gt;CapSetCallbackOnVideoStream;&amp;nbsp; &lt;br /&gt;//得到一个设备错误 &lt;br /&gt;CapSetCallbackOnError;&amp;nbsp; &lt;br /&gt;//得到一个设备状态 &lt;br /&gt;CapSetCallbackOnStatus&amp;nbsp; &lt;br /&gt;} 自定义的函数1 //定义一个帧捕获回调函数&lt;br /&gt;CapSetCallbackOnFrame (ghCapWnd,LongInt(@VideoStreamCallBack));&amp;nbsp; &lt;br /&gt;//将一个捕获窗口与一个设备驱程相关联，第二个参数是个序号，当系统中装有多个显视驱动程序时，其值分别依次为0到总个数 &lt;br /&gt;CapDriverConnect(ghCapWnd, 0);&amp;nbsp; &lt;br /&gt;//设置设备属性的结构变量 &lt;br /&gt;CapParms.dwRequestMicroSecPerFrame:=40000; &lt;br /&gt;CapParms.fLimitEnabled := FALSE; &lt;br /&gt;CapParms.fCaptureAudio := FALSE; // NO Audio &lt;br /&gt;CapParms.fMCIControl := FALSE; &lt;br /&gt;CapParms.fYield := TRUE; &lt;br /&gt;CapParms.vKeyAbort := VK_ESCAPE; &lt;br /&gt;CapParms.fAbortLeftMouse := FALSE; &lt;br /&gt;CapParms.fAbortRightMouse := FALSE; &lt;br /&gt;//使设置生效 &lt;br /&gt;CapCaptureSetSetup(ghCapWnd,LongInt(@CapParms),sizeof(TCAPTUREPARMS));&amp;nbsp; &lt;br /&gt;//设置预览时的比例 &lt;br /&gt;CapPreviewScale(ghCapWnd, 1); &lt;br /&gt;//设置预览时的帧频率 &lt;br /&gt;CapPreviewRate(ghCapWnd,66); &lt;br /&gt;//如果要捕获视频流，则要使用函数指定不生成文件。否则将会自动生成AVI文件 &lt;br /&gt;CapCaptureSequenceNoFile(ghCapWnd); &lt;br /&gt;//指定是否使用叠加模式，使用为1，否则为0 &lt;br /&gt;CapOverlay(ghCapWnd, 1); &lt;br /&gt;//打开预览 &lt;br /&gt;CapPreview(ghCapWnd, 1); &lt;br /&gt;//停止捕获 &lt;br /&gt;capCaptureAbort(ghCapWnd);&amp;nbsp; &lt;br /&gt;//将捕获窗同驱动器断开 &lt;br /&gt;capDriverDisconnect(ghCapWnd); &lt;/p&gt;&lt;p&gt;自定义的函数2 //定义捕获帧回调函数： &lt;br /&gt;function FrameCallBack(hWnd:HWND; lpVHdr:LongInt) :LongInt; stdcall; &lt;br /&gt;var&amp;nbsp; &lt;br /&gt;DataPoint:^byte;&amp;nbsp; &lt;br /&gt;DibLen,RectWidth,RectHeight:integer; &lt;br /&gt;begin&amp;nbsp; &lt;br /&gt;//转换从回调函数中得到的指针 &lt;br /&gt;VideoStr:=LPVIDEOHDR(lpVHdr); &lt;br /&gt;//得到返回的数据大小&amp;nbsp; &lt;br /&gt;DibLen:=VideoStr^.dwBufferLength;&amp;nbsp; &lt;br /&gt;GetMem(DataPoint,64000); &lt;br /&gt;//将帧数据COPY到一个内存中，注意DATAPOINT要先分配空间 &lt;br /&gt;CopyMemory(DataPoint,VideoStr^.lpData,Diblen);&amp;nbsp; &lt;br /&gt;//一些其他处理 &lt;br /&gt;&amp;#8230;&amp;#8230; &lt;br /&gt;end; &lt;br /&gt;灵活地使用AVICap窗口类的回调函数可以满足各种不同的需求，但要注意从视频卡中捕获的视频数据的格式和图像的长宽要参考视频卡的参数。而且有些视频卡通过设置可支持多种的格式和图像长宽，所以在还原图像时要注意参考所用的视频卡的参数。&lt;/p&gt;&lt;p&gt;与视频捕获相关的编程。&lt;br /&gt;1、定义全局变量：&lt;br /&gt;HWND ghWndCap ; //捕获窗的句柄&lt;br /&gt;CAPDRIVERCAPS gCapDriverCaps ; //视频驱动器的能力&lt;/p&gt;&lt;p&gt;CAPSTATUS gCapStatus ; //捕获窗的状态&lt;br /&gt;2、处理WM_CREATE消息：&lt;br /&gt;//创建捕获窗,其中hWnd为主窗口句柄&lt;br /&gt;ghWndCap = capCreateCaptureWindow（（LPSTR）"Capture Window",WS_CHILD | WS_VISIBLE, 0, 0, 300,240, （HWND） hWnd, （int） 0）;&lt;br /&gt;//登记三个回调函数，它们应被提前申明&lt;br /&gt;capSetCallbackOnError（ghWndCap, （FARPROC）ErrorCallbackProc）; capSetCallbackOnStatus（ghWndCap, （FARPROC）StatusCallbackProc）; capSetCallbackOnFrame（ghWndCap, （FARPROC）FrameCallbackProc）;&lt;/p&gt;&lt;p&gt;capDriverConnect（ghWndCap,0）; // 将捕获窗同驱动器连接&lt;br /&gt;//获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中&lt;br /&gt;capDriverGetCaps（ghWndCap,&amp;amp;gCapDriverCaps,sizeof（CAPDRIVERCAPS）） ;&lt;br /&gt;3、处理WM_CLOSE消息:&lt;br /&gt;//取消所登记的三个回调函数&lt;br /&gt;capSetCallbackOnStatus（ghWndCap, NULL）;&lt;br /&gt;capSetCallbackOnError（ghWndCap, NULL）;&lt;br /&gt;capSetCallbackOnFrame（ghWndCap, NULL）;&lt;br /&gt;capCaptureAbort（ghWndCap）;//停止捕获&lt;br /&gt;capDriverDisconnect（ghWndCap）; //将捕获窗同驱动器断开&lt;/p&gt;&lt;p&gt;4、处理菜单项Preview:&lt;br /&gt;capPreviewRate（ghWndCap, 66）; // 设置Preview模式的显示速率&lt;br /&gt;capPreview（ghWndCap, TRUE）; //启动Preview模式&lt;br /&gt;5、处理菜单项Overlay:&lt;br /&gt;if（gCapDriverCaps.fHasOverlay） //检查驱动器是否有叠加能力&lt;br /&gt;capOverlay（ghWndCap,TRUE）; //启动Overlay模式&lt;br /&gt;6、处理菜单项Exit:&lt;br /&gt;SendMessage（hWnd,WM_CLOSE,wParam,lParam）;&lt;br /&gt;7、分别处理Setting下的三个菜单项，它们可分别控制视频源、视频格式及显示：&lt;br /&gt;if （gCapDriverCaps.fHasDlgVideoSource）&lt;br /&gt;capDlgVideoSource（ghWndCap）; //Video source 对话框&lt;br /&gt;if （gapDriverCaps.fHasDlgVideoFormat）&lt;br /&gt;capDlgVideoFormat（ghWndCap）; // Video format 对话框&lt;br /&gt;if （CapDriverCaps.fHasDlgVideoDisplay）&lt;br /&gt;capDlgVideoDisplay（ghWndCap）; // Video display 对话框&lt;br /&gt;8、处理Video Stream菜单项,它捕获视频流到一个.AVI文件:&lt;br /&gt;char szCaptureFile[] = "MYCAP.AVI";&lt;br /&gt;capFileSetCaptureFile（ ghWndCap, szCaptureFile）; //指定捕获文件名&lt;br /&gt;capFileAlloc（ ghWndCap, （1024L * 1024L * 5））; //为捕获文件分配存储空间&lt;br /&gt;capCaptureSequence（ghWndCap）; //开始捕获视频序列&lt;br /&gt;9、处理Single Frame菜单项:&lt;br /&gt;capGrabFrame（ghWndCap）; //捕获单帧图像&lt;br /&gt;10、定义三个回调函数：&lt;br /&gt;LRESULT CALLBACK StatusCallbackProc（HWND hWnd, int nID, LPSTR lpStatusText）&lt;br /&gt;{&lt;br /&gt;if （!ghWndCap） return FALSE;&lt;br /&gt;//获得捕获窗的状态&lt;br /&gt;capGetStatus（ghWndCap, &amp;amp;gCapStatus, sizeof （CAPSTATUS））;&lt;br /&gt;//更新捕获窗的大小&lt;br /&gt;SetWindowPos（ghWndCap, NULL, 0, 0, gCapStatus.uiImageWidth,&lt;br /&gt;gCapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE）;&lt;br /&gt;if （nID == 0） { // 清除旧的状态信息&lt;br /&gt;SetWindowText（ghWndCap, （LPSTR） gachAppName）;&lt;br /&gt;return （LRESULT） TRUE;&lt;br /&gt;}&lt;br /&gt;// 显示状态 ID 和状态文本&lt;br /&gt;wsprintf（gachBuffer, "Status# %d: %s", nID, lpStatusText）;&lt;br /&gt;SetWindowText（ghWndCap, （LPSTR）gachBuffer）;&lt;br /&gt;return （LRESULT） TRUE;&lt;br /&gt;}&lt;br /&gt;LRESULT CALLBACK ErrorCallbackProc（HWND hWnd, int nErrID,LPSTR lpErrorText）&lt;br /&gt;{&lt;br /&gt;if （!ghWndCap）&lt;br /&gt;return FALSE;&lt;br /&gt;if （nErrID == 0）&lt;br /&gt;return TRUE;// 清除旧的错误&lt;br /&gt;wsprintf（gachBuffer, "Error# %d", nErrID）; //显示错误标识和文本&lt;br /&gt;MessageBox（hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION）;&lt;br /&gt;return （LRESULT） TRUE;&lt;br /&gt;}&lt;br /&gt;LRESULT CALLBACK FrameCallbackProc（HWND hWnd, LPVIDEOHDR lpVHdr）&lt;/p&gt;&lt;p&gt;{&lt;br /&gt;if （!ghWndCap）&lt;br /&gt;return FALSE;&lt;br /&gt;//假设fp为一打开的.dat文件指针&lt;br /&gt;fwrite（fp,lpVHdr-&amp;gt;lpData,lpVHdr-&amp;gt;dwBufferLength,1）;&lt;br /&gt;return （LRESULT） TRUE ;&lt;br /&gt;}&lt;br /&gt;值得注意的是：应在.cpp文件中加入#include 一句,在Link设置中加入vfw32.lib。&lt;br /&gt;上述的回调函数FrameCallbackProc是将视频数据直接从缓冲写入文件，也可利用memcpy函数将视频数据直接拷贝到另一缓存。同理，可 定义VideoStreamCallbackProc。capSetCallbackOnVideoStream的使用比 capSetCallbackOnFrame稍微复杂一些。在捕获过程中，当一个新的视频缓冲可得时，系统就调用它所登记的回调函数。在缺省情况下，捕获 窗在捕获过程中不允许其它应用程序继续运行。为了取消这个限制，可以设置CAPTUREPARMS的成员fYield为TRUE或建立一个Yield回调 函数。为了解决潜在的重入（reentry）问题，可在YieldCallbackProc中用PeekMessage过滤掉一些消息，例如鼠标消息。&lt;/p&gt;&lt;p&gt;常用问题代码&lt;/p&gt;&lt;p&gt;Q:利用网上的代码做了一个视频采集的小程序，现在需要实现如下功能&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 已有如下函数：&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; /*******************************************************************************&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp; EnablePreviewVideo&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arguments&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp; Parent&amp;nbsp;&amp;nbsp; (input)&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; Parent&amp;nbsp;&amp;nbsp; window&amp;nbsp;&amp;nbsp; that&amp;nbsp;&amp;nbsp; will&amp;nbsp;&amp;nbsp; display&amp;nbsp;&amp;nbsp; video.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x&amp;nbsp;&amp;nbsp; (input)&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; X&amp;nbsp;&amp;nbsp; Location&amp;nbsp;&amp;nbsp; in&amp;nbsp;&amp;nbsp; parent&amp;nbsp;&amp;nbsp; where&amp;nbsp;&amp;nbsp; video&amp;nbsp;&amp;nbsp; will&amp;nbsp;&amp;nbsp; be&amp;nbsp;&amp;nbsp; shown.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y&amp;nbsp;&amp;nbsp; (input)&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; Y&amp;nbsp;&amp;nbsp; location&amp;nbsp;&amp;nbsp; in&amp;nbsp;&amp;nbsp; parent&amp;nbsp;&amp;nbsp; where&amp;nbsp;&amp;nbsp; video&amp;nbsp;&amp;nbsp; will&amp;nbsp;&amp;nbsp; be&amp;nbsp;&amp;nbsp; shown.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width&amp;nbsp;&amp;nbsp; (input)&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; Width&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; preview&amp;nbsp;&amp;nbsp; window.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Height&amp;nbsp;&amp;nbsp; (input)&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; Height&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; preview&amp;nbsp;&amp;nbsp; window.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PreviewRate&amp;nbsp;&amp;nbsp; (input)&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; Rate&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; preview&amp;nbsp;&amp;nbsp; in&amp;nbsp;&amp;nbsp; FPS.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp; TRUE&amp;nbsp;&amp;nbsp; Success,&amp;nbsp;&amp;nbsp; FALSE&amp;nbsp;&amp;nbsp; Failed.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description:&amp;nbsp;&amp;nbsp; Enables&amp;nbsp;&amp;nbsp; preview&amp;nbsp;&amp;nbsp; video&amp;nbsp;&amp;nbsp; mode.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; *******************************************************************************/&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; BOOL&amp;nbsp;&amp;nbsp; CVFWImageProcessor::EnablePreviewVideo(HWND&amp;nbsp;&amp;nbsp; Parent,&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp; x,&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp; y,&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp; Width,&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp; Height,&amp;nbsp;&amp;nbsp; INT&amp;nbsp;&amp;nbsp; PreviewRate)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp; Reset&amp;nbsp;&amp;nbsp; any&amp;nbsp;&amp;nbsp; error&amp;nbsp;&amp;nbsp; conditions.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetPreviousError(NULL,NULL,TRUE);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetParent(m_hWndVideo,Parent);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetWindowPos(m_hWndVideo,NULL,x,y,&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width,&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Height,&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SWP_NOZORDER);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ShowWindow(m_hWndVideo,SW_SHOW);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; capPreviewRate(m_hWndVideo,&amp;nbsp;&amp;nbsp; PreviewRate);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&amp;nbsp;&amp;nbsp; capPreview(m_hWndVideo,TRUE);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 现在已经通过获取预览窗口CRect&amp;nbsp;&amp;nbsp; rectVideo的大小，但是视频显示的还是与视频格式设置大小一致，只能在窗口内显示视频左上角的一部分，没有实现视频的缩放，所以显示不全。我现在就想缩放视频预览显示到设定区域，但实际的视频大小不要改变，因为抓图还是要实际大小的。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;A:自动缩放视频到视频窗口大小:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 在你的capPreviewRate(...)之后加上capPreviewScale(hwnd,TRUE)试试&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 附MSDN：&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; BOOL&amp;nbsp;&amp;nbsp; capPreviewScale(&amp;nbsp;&amp;nbsp; hwnd,&amp;nbsp;&amp;nbsp; f&amp;nbsp;&amp;nbsp; );&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Parameters&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; hwnd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Handle&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; a&amp;nbsp;&amp;nbsp; capture&amp;nbsp;&amp;nbsp; window.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Preview&amp;nbsp;&amp;nbsp; scaling&amp;nbsp;&amp;nbsp; flag.&amp;nbsp;&amp;nbsp; Specify&amp;nbsp;&amp;nbsp; TRUE&amp;nbsp;&amp;nbsp; for&amp;nbsp;&amp;nbsp; this&amp;nbsp;&amp;nbsp; parameter&amp;nbsp;&amp;nbsp; to&amp;nbsp;&amp;nbsp; stretch&amp;nbsp;&amp;nbsp; preview&amp;nbsp;&amp;nbsp; frames&amp;nbsp;&amp;nbsp; to&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; size&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; capture&amp;nbsp;&amp;nbsp; window&amp;nbsp;&amp;nbsp; or&amp;nbsp;&amp;nbsp; FALSE&amp;nbsp;&amp;nbsp; to&amp;nbsp;&amp;nbsp; display&amp;nbsp;&amp;nbsp; them&amp;nbsp;&amp;nbsp; at&amp;nbsp;&amp;nbsp; their&amp;nbsp;&amp;nbsp; natural&amp;nbsp;&amp;nbsp; size.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Return&amp;nbsp;&amp;nbsp; Values&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Returns&amp;nbsp;&amp;nbsp; TRUE&amp;nbsp;&amp;nbsp; if&amp;nbsp;&amp;nbsp; successful&amp;nbsp;&amp;nbsp; or&amp;nbsp;&amp;nbsp; FALSE&amp;nbsp;&amp;nbsp; otherwise.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Remarks&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Scaling&amp;nbsp;&amp;nbsp; preview&amp;nbsp;&amp;nbsp; images&amp;nbsp;&amp;nbsp; controls&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; immediate&amp;nbsp;&amp;nbsp; presentation&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; captured&amp;nbsp;&amp;nbsp; frames&amp;nbsp;&amp;nbsp; within&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; capture&amp;nbsp;&amp;nbsp; window.&amp;nbsp;&amp;nbsp; It&amp;nbsp;&amp;nbsp; has&amp;nbsp;&amp;nbsp; no&amp;nbsp;&amp;nbsp; effect&amp;nbsp;&amp;nbsp; on&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; size&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; frames&amp;nbsp;&amp;nbsp; saved&amp;nbsp;&amp;nbsp; to&amp;nbsp;&amp;nbsp; file.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Scaling&amp;nbsp;&amp;nbsp; has&amp;nbsp;&amp;nbsp; no&amp;nbsp;&amp;nbsp; effect&amp;nbsp;&amp;nbsp; when&amp;nbsp;&amp;nbsp; using&amp;nbsp;&amp;nbsp; overlay&amp;nbsp;&amp;nbsp; to&amp;nbsp;&amp;nbsp; display&amp;nbsp;&amp;nbsp; video&amp;nbsp;&amp;nbsp; in&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; frame&amp;nbsp;&amp;nbsp; buffer.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 另：&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 抓图时候设置大小：&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; HWND&amp;nbsp;&amp;nbsp; m_capwnd=capCreateCaptureWindow(.......);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; BITMAPINFO&amp;nbsp;&amp;nbsp; m_bmpinfo;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; capGetVideoFormat(m_capwnd,&amp;amp;m_bmpinfo,sizeof(m_bmpinfo));&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; m_bmpinfo.bmiHeader.biWidth和m_bmpinfo.bmiHeader.biHeight就是你想要的视频宽度和高度&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; 设置大小:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; m_bmpinfo.bmiHeader.biWidth=176;//320&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; m_bmpinfo.bmiHeader.biHeight=144;//240&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; BOOL&amp;nbsp;&amp;nbsp; ret=capSetVideoFormat(m_capwnd,&amp;amp;m_bmpinfo,sizeof(m_bmpinfo));&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本文来自CSDN博客，转载请标明出处：&lt;a href="http://blog.csdn.net/byxdaz/archive/2009/07/16/4352820.aspx"&gt;&lt;font color="#336699"&gt;http://blog.csdn.net/byxdaz/archive/2009/07/16/4352820.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2496082.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/05/11/2496082.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455869.html</id><title type="text">Windows下编译 OpenSceneGraph（转）</title><summary type="text">http://gislu.blog.sohu.com/141650761.htmlWindows下编译 OpenSceneGraph 的方法,主要实现从源代码逐步编译出一个可调试的运行环境. 我主要使用VMWare Server 1.0.7+XP+.NET 2003来测试OSG软件,我也是用这种方法来测试新的软件,原因在于装错了,可以删除后拷贝备份的文件继续试试软件,不用重新装操作系统,很方便啊.需要下载的软件包:OpenSceneGraph.zip 下载地址http://www.openscenegraph.org/downloads/stable_releases/OpenSceneGra</summary><published>2012-04-18T12:11:00Z</published><updated>2012-04-18T12:11:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455869.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455869.html"/><content type="html">&lt;p&gt;&lt;a href="http://gislu.blog.sohu.com/141650761.html"&gt;http://gislu.blog.sohu.com/141650761.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Windows下编译 OpenSceneGraph 的方法,主要实现从源代码逐步编译出一个可调试的运行环境.&amp;nbsp; &lt;/p&gt;&lt;p&gt;我主要使用VMWare Server 1.0.7+XP+.NET 2003来测试OSG软件,我也是用这种方法来测试新的软件,原因在于装错了,可以删除后拷贝备份的文件继续试试软件,不用重新装操作系统,很方便啊.&amp;nbsp;&lt;/p&gt;&lt;p&gt;需要下载的软件包:&amp;nbsp;&lt;/p&gt;&lt;p&gt;OpenSceneGraph.zip 下载地址&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://www.openscenegraph.org/downloads/stable_releases/OpenSceneGraph-2.6/OpenSceneGraph.zip&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3rdParty_Win32binaries_2005_05_10.zip 下载地址&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://www.openscenegraph.org/downloads/dependencies/3rdParty_Win32binaries_2005_05_10.zip&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;cmake-2.4.7-win32-x86.exe 下载地址&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://www.tntdown.cn/download.asp?id=19650&amp;amp;dp=1&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;msvcr71d.dll 下载地址&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://www.zhaodll.net/dll/download.asp?softid=463&amp;amp;downid=2&amp;amp;id=461&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;msvcp71d.dll 下载地址&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://www.zhaodll.net/dll/download.asp?softid=458&amp;amp;downid=2&amp;amp;id=456&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;.NET版本是Microsoft Visual Studio .NET 2003(VC7,Microsoft开发环境 2003版本,Version 7.1.3091)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;具体步骤如下:&amp;nbsp;&lt;/p&gt;&lt;p&gt;1、解压缩 OpenSceneGraph.zip ,3rdParty_Win32binaries_2005_05_10.zip两个文件(方法是解压到当前文件夹(X)).&amp;nbsp;&lt;/p&gt;&lt;p&gt;2、把3rdParty_Win32binaries_2005_05_10.zip 解压缩出来的文件夹 3rdParty拷贝到 OpenSceneGraph.zip解压缩出来的文件夹OpenSceneGraph(需要改个名字,不用2.6.0后缀)下面.&amp;nbsp;&lt;/p&gt;&lt;p&gt;3、在C:盘下创建一个OSG文件夹,然后把OpenSceneGraph拷贝到这个文件夹下面.&amp;nbsp;&lt;/p&gt;&lt;p&gt;4、安装 cmake-2.4.7-win32-x86.exe ,一切都是缺省.&amp;nbsp;&lt;/p&gt;&lt;p&gt;5、通过 开始--&amp;gt;程序--&amp;gt;CMake2.4--&amp;gt;CMake 运行CMake程序.&amp;nbsp;&lt;/p&gt;&lt;p&gt;6、将C:\OSG\OpenSceneGraph\CMakeLists.txt拖到CMake窗口中.&amp;nbsp;&lt;/p&gt;&lt;p&gt;7、这时在Where is the source code:中会显示C:\OSG\OpenSceneGraph,在Where to build the binaries:中会显示C:\OSG\OpenSceneGraph,修改binaries这一项,变成C:\OSG\OpenSceneGraph\build,点击Configure,会弹出一个编译器的选项,自动就行,不用改变,然后按ok,弹出Create Directory窗口,按 确定.&amp;nbsp;&lt;/p&gt;&lt;p&gt;8、修改 ACTUAL_3DPARTY_DIR这项,由C:/OSG/3rdparty指向C:\OSG\OpenSceneGraph\3rdParty&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;修改 BUILD_OSG_ARAPPERS这项,由OFF 改成 ON&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;其他不动&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;如果你想这时编译例子程序,可以修改BUILD_OSG_EXAMPLES这项,由OFF 改成 ON&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;参数解释:&amp;nbsp;&lt;/p&gt;&lt;p&gt;ACTUAL_3DPARTY_DIR：即整合的第三方开发库所在目录,如果下载了OSG提供的整合好的第三方开发库,那么可以在这里设置解压缩之后它的位置,CMake将在下次配置时自动搜索所需的Lib文件和头文件路径.&amp;nbsp;&lt;/p&gt;&lt;p&gt;BUILD_OSG_EXAMPLES：是否编译OSG所有例子程序的选项.&amp;nbsp;&lt;/p&gt;&lt;p&gt;BUILD_OSG_ARAPPERS: 这一项要选,不然后面编译自己的测试程序的时候,会报无法打开文件"osgIntrospectiond.lib"错误.&amp;nbsp;&lt;/p&gt;&lt;p&gt;CMAKE_CONFIGURATION_TYPES：定义了工程文件中工程配置的种类,缺省值包括Debug,Release,MinSizeRel和RelWithDebInfo四种类型.注意不同的配置类型在工程中对应不同的编译选项,可以在CMAKE_CXX_FLAGS和CMAKE_EXE_LINKER_FLAGS中进行修改.&amp;nbsp;&lt;/p&gt;&lt;p&gt;CMAKE_INSTALL_PREFIX：用于以后保存编译生成的EXE,DLL和LIB文件的路径,在这个路径下会自动建立bin和lib目录,以便区分存放结果.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;9、按下"Configure",进入第二次配置&amp;nbsp;&lt;/p&gt;&lt;p&gt;10、按下"Configure",就会出现 OK可点击的状态&amp;nbsp;&lt;/p&gt;&lt;p&gt;11、先不要急于按下"Configure",点击右上的选框"Show Advanced Values",可以看到列表框中的选项增加了.这其中很多选项是之前未经选择的.这其中需要重新进行配置的主要是各个第三方开发库的头文件路径和Lib文件路径;如果用户平台上还有其他GUI库,例如Qt,Fltk,wxWidgets等,那么也需要在这里重新进行配置.&amp;nbsp;&lt;/p&gt;&lt;p&gt;配置第三方开发库的相关参数时,主要需要配置以下两个参数的值：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;#8230;&amp;#8230;_INCLUDE_DIR：头文件的位置.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;#8230;&amp;#8230;_LIBRARY：需要链接的静态库文件.&amp;nbsp;&lt;/p&gt;&lt;p&gt;12、按下OK键&amp;nbsp;&lt;/p&gt;&lt;p&gt;13、进入C:\OSG\OpenSceneGraph\build文件夹下,选择OpenSceneGraph.sln,在Debug模式下,选择 生成(B)--&amp;gt;生成 ALL_BUILD (U),然后耐心等待,编译好后,在Release模式下,选择 生成(B)--&amp;gt;生成 ALL_BUILD (U),然后耐心等待,最后的效果是,生成了Debug和Release下的lib和dll库.&amp;nbsp;&lt;/p&gt;&lt;p&gt;我用了一个网吧的计算机安装测试,环境是Intel x4 8700+VMware 5.0+XP(1024MB)(VMware上的系统)+XP(主系统)(2048MB),只编译Debug,花费时间1小时25分钟.&amp;nbsp;&lt;/p&gt;&lt;p&gt;14、编译完成后,就开始我们建立环境了.&amp;nbsp;&lt;/p&gt;&lt;p&gt;15、首先在C:\OSG\建一个目录,OSG2.6,在这个目录下分别建debug,release目录,在这些目录下建lib,bin目录,还要在OSG2.6目录下建一个include目录&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体目录结构如下:&amp;nbsp;&lt;/p&gt;&lt;p&gt;C:\OSG\OSG2.6&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;debug&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;bin&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;release&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;bin&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;include&amp;nbsp;&lt;/p&gt;&lt;p&gt;16、开始拷贝相关文件:&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤如下:&amp;nbsp;&lt;/p&gt;&lt;p&gt;a、include下文件:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\3rdParty\include\下,把所有的文件拷贝到C:\OSG\OSG2.6\include下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\include\下,把所有的文件拷贝到C:\OSG\OSG2.6\include下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\build\include 下有Config.h文件,把这些文件拷贝到C:\OSG\OSG2.6\include下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;b、debug文件夹下的bin中的文件:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;把下载后的msvcpd71.dll和msvcr71d.dll文件解压后,拷贝到debug\bin下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\3rdParty\bin\下,把所有D.dll结尾的文件拷贝到debug\bin下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\build\bin\下,把所有的.dll和.exe结尾的文件结尾的文件拷贝到debug\bin下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\build\bin\osgPlugins-2.6.0\下,把所有的.dll结尾的文件结尾的文件拷贝到debug\bin下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;c、debug文件夹下的lib中的文件:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\3rdParty\lib\下,把所有D.lib结尾的文件,拷贝到debug\lib下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;到C:\OSG\OpenSceneGraph\build\lib\debug\下,把所有lib结尾的文件,拷贝到debug\lib下.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;17、设置环境变量 系统变量&amp;nbsp;&lt;/p&gt;&lt;p&gt;(我的电脑--&amp;gt;属性--&amp;gt;高级--&amp;gt;环境变量--&amp;gt;系统环境变量--&amp;gt;编辑(I))&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;Path在后面添加 &amp;nbsp;;C:\OSG\OSG2.6\debug\bin;&amp;nbsp;&lt;/p&gt;&lt;p&gt;新建(W)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;OSG_NOTIFY_LEVEL DEBUG_FP&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;OSG_ROOT &amp;nbsp; &amp;nbsp; C:\OSG\OSG2.6\debug\&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;OSG_FILE_PATH &amp;nbsp; &amp;nbsp;C:\OSG\OSG2.6\data\&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;18、修改屏幕属性(属性--&amp;gt;设置--&amp;gt;颜色(C)--&amp;gt;选择 真彩色(32位)--&amp;gt;确定)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;然后注销用户,重新登录系统就可以了.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;19、开始配置VC7项目&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;启动Microsoft Visual Studio .NET 2003(VC7,Microsoft开发环境 2003版本,Version 7.1.3091),建立一个Win32控制台项目,在应用程序设置选项卡里,选择空项目,点击完成.为了在工程选项里出现C/C++的选项,先给工程添加一个空的C++源文件.&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤:文件(F)--&amp;gt;新建(N)--&amp;gt;项目(P)--&amp;gt;Visual C++项目--&amp;gt;Win32项目--&amp;gt;名称(N):Test--&amp;gt;确定--&amp;gt;应用程序设置--&amp;gt;选中 控制台应用程序(O)--&amp;gt;选中 空项目(E) --&amp;gt;完成--&amp;gt;在右边 解决方案"Test"下 选择 源文件 右击--&amp;gt;添加(D)--&amp;gt;添加新项(W)--&amp;gt;C++文件(.cpp)--&amp;gt;名称(N): Test--&amp;gt;打开(O)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;OpenSceneGraph运行需要多线程DLL的运行时库和RTTI,所以,在建立每个OpenSceneGraph工程后,第一件事就是更改工程设置.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(由于我们现在使用的是Release版本,所以只用填写Release信息)&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤:项目(Test) 属性--&amp;gt;配置(C)--&amp;gt;Release&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;打开项目属性,在C/C++选项卡里,点击代码生成页,更改运行时库,对于Debug版,用多线程调试 DLL (/Mdd),对于Release版,用多线程 DLL (/MD).&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤:C/C++--&amp;gt;代码生成--&amp;gt;运行时库--&amp;gt;Debug版多线程调试 DLL (/Mdd)&amp;nbsp;&lt;/p&gt;&lt;p&gt;//Release版,用多线程 DLL(/MD)这里只提出来,不用设置&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;设置C/C++选项卡里的语言页的启用运行时类型信息为:是(/GR).(Debug版下设置)&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤:C/C++--&amp;gt;语言--&amp;gt;启用运行时类型信息--&amp;gt;是(/GR)--&amp;gt;确定&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;会出现这个无法解析的外部符号 _winmain@16 错误信息&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤:链接器--&amp;gt;System--&amp;gt;子系统--&amp;gt;选择 控制台(/SUBSYSTEM:CONSOLE)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;OpenSceneGraph程序需要链接对应的库文件,打开链接器选项卡里的输入页,设置附加依赖项,对于Debug版,是OpenThreadsd.lib,osgd.lib,osgDBd.lib,osgFXd.lib,osgGAd.lib,osgIntrospectiond.lib,osgManipulatord.lib,osgParticled.lib,osgShadowd.lib,osgSimd.lib,osgTerraind.lib,osgTextd.lib,osgUtild.lib,osgViewerd.lib,对于Release版,设置这些lib文件不带"d"的版本.&amp;nbsp;&lt;/p&gt;&lt;p&gt;(由于我们现在使用的是Debug版本,所以只用填写Debug信息)&amp;nbsp;&lt;/p&gt;&lt;p&gt;具体步骤:链接器--&amp;gt;输入--&amp;gt;附加依赖项 中填写&amp;nbsp;&lt;/p&gt;&lt;p&gt;OpenThreadsd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgDBd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgFXd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgGAd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgIntrospectiond.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgManipulatord.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgParticled.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgShadowd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgSimd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgTerraind.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgTextd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgUtild.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;osgViewerd.lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;--&amp;gt;确定--&amp;gt;确定&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;设置编译时头文件路径&amp;nbsp;&lt;/p&gt;&lt;p&gt;工具--&amp;gt;选项--&amp;gt;项目--&amp;gt;VC++ 目录--&amp;gt;显示以下内容的目录(S)--&amp;gt;包含文件--&amp;gt;在最后面创建一个新的目录--&amp;gt;最后行的地方双击,添上 C:\OSG\OSG2.6\include 一项&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;设置编译时库文件路径&amp;nbsp;&lt;/p&gt;&lt;p&gt;工具--&amp;gt;选项--&amp;gt;项目--&amp;gt;VC++ 目录--&amp;gt;显示以下内容的目录(S)--&amp;gt;库文件--&amp;gt;在最后面创建一个新的目录--&amp;gt;最后行的地方双击,添上 C:\OSG\OSG2.6\debug\lib&amp;nbsp;&lt;/p&gt;&lt;p&gt;这样,工程属性就设置好了.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2455869.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455869.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455860.html</id><title type="text">OSG静态编译 (转)</title><summary type="text">搞了大半天，终于用静态编译的方式把OSG核心库、IVE插件和一个sample程序编译成功了，期间遇到一些问题，在此记录下来。1.OSG的CMake工程支持使用动态链接和静态链接两种方式编译OSG库，所使用的两个开关是DYNAMIC_OPENSCENEGRAPH和DYNAMIC_OPENTHREADS，如下图：要想静态编译OSG库，首先需要确保这两个开关不被勾选。2.配置好CMake工程，生成VC工程后，需要对工程配置做一些手动修改。1）修改所有工程的配置类型（Configuration Type）为静态库（Static Library (.lib)），这一步CMake已经做了。2）修改所有工程</summary><published>2012-04-18T12:03:00Z</published><updated>2012-04-18T12:03:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455860.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455860.html"/><content type="html">&lt;p&gt;搞了大半天，终于用静态编译的方式把OSG核心库、IVE插件和一个sample程序编译成功了，期间遇到一些问题，在此记录下来。&lt;/p&gt;&lt;p&gt;1.OSG的CMake工程支持使用动态链接和静态链接两种方式编译OSG库，&amp;nbsp;所使用的两个开关是DYNAMIC_OPENSCENEGRAPH和DYNAMIC_OPENTHREADS，如下图：&lt;/p&gt;&lt;p align="left"&gt;&lt;img style="margin: 0px 10px 0px 0px; float: none; cssfloat: none" src="http://www.cnblogs.com/mazhenyu/admin/file:///C:/DOCUME~1/rlw/LOCALS~1/Temp/]JYJX7MT6BTI4]3WB$VFWXX.jpg" __1334750438359__="ev_9271167708"  alt="" /&gt;&lt;/p&gt;&lt;p align="left"&gt;要想静态编译OSG库，首先需要确保这两个开关不被勾选。&lt;/p&gt;&lt;p align="left"&gt;2.配置好CMake工程，生成VC工程后，需要对工程配置做一些手动修改。&lt;/p&gt;&lt;p align="left"&gt;1）修改所有工程的配置类型（Configuration Type）为静态库（Static Library (.lib)），这一步CMake已经做了。&lt;/p&gt;&lt;p align="left"&gt;2）修改所有工程的运行时库（Runtime Library）为MT或MTd。&lt;/p&gt;&lt;p align="left"&gt;3）要想正确编译OSG静态库工程，必须在工程中加入两个预编译宏：&lt;strong&gt;OSG_LIBRARY_STATIC&lt;/strong&gt; 和 &lt;strong&gt;OT_LIBRARY_STATIC&lt;/strong&gt;，一般前者已经被自动添加了，而后者则需要手动添加。在工程配置的C/C++ -&amp;gt;Preprocessor中的Preprocessor Definitions中添加即可。（我就是一开始没有添加OT_LIBRARY_STATIC宏，导致一大堆关于OpenThreads库中对象的链接错误）&lt;/p&gt;&lt;p align="left"&gt;3.可以直接编译OSG自带的静态库例子程序-osgstaticviewer，也可以自己写一个简单的osg程序编译，自己写程序时需要注意：&lt;/p&gt;&lt;p align="left"&gt;如果使用窗口系统，需要添加USE_GRAPHICSWINDOW()宏。&lt;/p&gt;&lt;p align="left"&gt;如果使用某个OSG插件，需要添加对应插件的USE_OSGPLUGIN(plugin name)&lt;/p&gt;&lt;p align="left"&gt;一切搞定，就可以运行你的程序而不用担心一大堆的依赖库找不到了。而静态链接的exe文件，并没有想象中的大，因为它只包含了需要的程序，而不是简单的是所有lib文件的总和。&lt;/p&gt;&lt;p align="left"&gt;另外，一个需要特别注意的问题是，如果使用静态编译的OSG库，需要首先保证所有插件依赖库（如zip、curl、freetype等）都是静态链接库。&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;a href="http://king8010.popo.blog.163.com/blog/static/1088321320106283568982/"&gt;http://king8010.popo.blog.163.com/blog/static/1088321320106283568982/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2455860.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/04/18/2455860.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/04/13/2445897.html</id><title type="text">(转)一个简单的osg控件开发例子</title><summary type="text">作者：boqing经常需要在对话框上添加osg的浏览功能，一开始是仿照osgviewerMFC的例子去写，可是每次在对话框上添加此功能的时候都要重复复制很多处代码，且位置和大小控制也不是很方便。因此写了个简单的OSG Active控件解决此问题。 开发工具：vc2005OSG版本：osg2.2具体开发步骤：一 建立Active工程项目类型选择：MFC，模板选择MFC ActiveX Control下一步的向导中保持默认，点完成二 配置viewer定义viewer为成员函数osg::ref_ptr&lt;osgViewer::Viewer&gt;viewer;构造函数中初始化viewer=new</summary><published>2012-04-13T07:42:00Z</published><updated>2012-04-13T07:42:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/04/13/2445897.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/04/13/2445897.html"/><content type="html">&lt;div id="article_content" class="article_content"&gt;&lt;p&gt;作者：boqing&lt;/p&gt;&lt;p&gt;经常需要在对话框上添加osg的浏览功能，一开始是仿照osgviewerMFC的例子去写，可是每次在对话框上添加此功能的时候都要重复复制很多处代码，且位置和大小控制也不是很方便。因此写了个简单的OSG Active控件解决此问题。 &lt;/p&gt;&lt;p&gt;开发工具：vc2005&lt;/p&gt;&lt;p&gt;OSG版本：osg2.2&lt;/p&gt;&lt;p&gt;&amp;nbsp;具体开发步骤：&lt;/p&gt;&lt;p&gt;一 建立Active工程&lt;br /&gt;项目类型选择：MFC，模板选择MFC ActiveX Control&lt;/p&gt;&lt;p&gt;下一步的向导中保持默认，点完成&lt;/p&gt;&lt;p&gt;&lt;br /&gt;二 配置viewer&lt;br /&gt;定义viewer为成员函数&lt;/p&gt;&lt;p&gt;osg::ref_ptr&amp;lt;osgViewer::Viewer&amp;gt;viewer;&lt;/p&gt;&lt;p&gt;构造函数中初始化&lt;/p&gt;&lt;p&gt;viewer=new osgViewer::Viewer;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;为了使得其能正常显示在拖动的空间中，大小和位置与拖出区域的大小和位置一致。编写configViewer函数&lt;/p&gt;&lt;p&gt;#include &amp;lt;osgViewer/api/win32/GraphicsWindowWin32&amp;gt;&lt;/p&gt;&lt;p&gt;void COSGControlCtrl::configViewer(HWND m_hWnd)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RECT rect;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //得到控件的大小&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ::GetWindowRect(m_hWnd, &amp;amp;rect);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; osg::ref_ptr&amp;lt;osg::GraphicsContext::Traits&amp;gt; traits = new osg::GraphicsContext::Traits;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; osg::ref_ptr&amp;lt;osg::Referenced&amp;gt; windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;x = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;y = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;width = rect.right - rect.left;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;height = rect.bottom - rect.top;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;windowDecoration = false;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;doubleBuffer = true;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;sharedContext = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;setInheritedWindowPixelFormat = true;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traits-&amp;gt;inheritedWindowData = windata;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; osg::ref_ptr&amp;lt;osg::Camera&amp;gt; camera = new osg::Camera;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; camera-&amp;gt;setGraphicsContext(gc);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; camera-&amp;gt;setViewport(new osg::Viewport(traits-&amp;gt;x, traits-&amp;gt;y, traits-&amp;gt;width, traits-&amp;gt;height));&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewer.addSlave(camera.get());&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;三 添加自定义方法setSceneData&lt;br /&gt;在类视图中展开OSGControlLib，右键单击_DOSGControl，选择添加-&amp;gt;添加方法，按照下图进行填写&lt;/p&gt;&lt;p&gt;确定后，在类COSGControlCtrl的实现中添加以下代码：&lt;/p&gt;&lt;p&gt;void COSGControlCtrl::setSceneData(ULONG* data)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AFX_MANAGE_STATE(AfxGetStaticModuleState());&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO: Add your dispatch handler code here&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!isSetSceneData)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; configViewer(m_hWnd);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; osg::Node *node=(osg::Node *)data;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewer-&amp;gt;setSceneData(node);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; isSetSceneData=true;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;isSetSceneData是类成员，构造函数中初始化为false，记录着是否曾经调用过viewer-&amp;gt;setSceneData函数&lt;/p&gt;&lt;p&gt;四 写静态线程函数&lt;br /&gt;在函数里主要是加入viewer.run()语句，这样的话osg的运行和程序的其它响应才能同时进行。&lt;/p&gt;&lt;p&gt;声明：&lt;/p&gt;&lt;p&gt;static UINT ThreadRun(LPVOID lparam);&lt;/p&gt;&lt;p&gt;实现：&lt;/p&gt;&lt;p&gt;UINT COSGControlCtrl::ThreadRun(LPVOID lparam)//请求状态。&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((osgViewer::Viewer *)(lparam))-&amp;gt;run();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;五 启动线程&lt;br /&gt;本来想在OnInitDialog函数中启动，可是检查后发现，COSGControlCtrl类并不提供此函数的重载，因此，只好写在OnDraw函数里，因为OnDraw函数一旦当前区域移动、被遮挡等情况下都要调用，因此我们还要保证OnDraw只运行一次。&lt;/p&gt;&lt;p&gt;void COSGControlCtrl::OnDraw(&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CDC* pdc, const CRect&amp;amp; rcBounds, const CRect&amp;amp; rcInvalid)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!pdc)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO: Replace the following code with your own drawing code.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static bool flag=true;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (flag)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox("OnDraw");&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag=false;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!isSetSceneData)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; configViewer(m_hWnd);//配置默认的viewer&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewer-&amp;gt;setSceneData(osgDB::readNodeFile("cow.osg"));//默认数据 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE hHandle=CreateThread(NULL,0,ThreadRun,(LPVOID)(viewer.get()),0,NULL);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseHandle(hHandle);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;六 程序退出后结束run函数的循环&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;void COSGControlCtrl::OnDestroy()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COleControl::OnDestroy();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO: Add your message handler code here&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewer-&amp;gt;setDone(true);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sleep(1000);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewer-&amp;gt;stopThreading();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;七 测试&lt;br /&gt;F7，编译通过，生成了解决方案，新打开vc，建一个对话框程序，右键点击&amp;#8220;插入Active控件&amp;#8221;，选择&amp;#8220;OSGControl&amp;#8221;，确定&lt;/p&gt;&lt;p&gt;在对话框上拖出一个合适的区域，Ctrl+F5，运行，结果如下：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;给控件添加变量m_osg&lt;/p&gt;&lt;p&gt;在合适的位置调用&lt;/p&gt;&lt;p&gt;m_osg.setSceneData((ULONG*)(osgDB::readNodeFile("axes.osg")));&lt;/p&gt;&lt;p&gt;就可以改变viewer的数据了&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本文来自CSDN博客，转载请标明出处：&lt;a href="http://blog.csdn.net/yangdelong/archive/2009/07/14/4348212.aspx"&gt;http://blog.csdn.net/yangdelong/archive/2009/07/14/4348212.aspx&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2445897.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/04/13/2445897.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/03/29/2423839.html</id><title type="text">一款不错的开源屏幕(窗口)录制软件 CamStudio</title><summary type="text">参考网址 ： http://www.funchords.com/In my Favorite Freeware aisle, I'm sharing those programs that:I use a lotRecommend to othersAre totally free to use and distribute CamStudio records activity from your screen into .avi or .swf movie files. It is ideal for demonstrating software, creating training</summary><published>2012-03-29T10:05:00Z</published><updated>2012-03-29T10:05:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/03/29/2423839.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/03/29/2423839.html"/><content type="html">&lt;p&gt;参考网址 ： &lt;a href="http://www.funchords.com/"&gt;http://www.funchords.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In my Favorite Freeware aisle, I'm sharing those programs that:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;I use a lot&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Recommend to others&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Are totally free to use and distribute&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;!--webbot bot="Include" i-checksum="46423" endspan --&gt;&lt;/p&gt;&lt;p&gt;&lt;img border="0" align="right" src="http://www.funchords.com/favorite/freeware/camstudio/image004.png" width="280" height="292"  alt="" /&gt;&lt;strong&gt;CamStudio&lt;/strong&gt; records activity from your screen into .avi or .swf movie files. It is ideal for demonstrating software, creating training, capturing a meeting, or recording buggy behavior. &lt;/p&gt;&lt;p&gt;The program is insanely easy to use, generates relatively small files, and records sound from a microphone or your system speakers. &lt;/p&gt;&lt;p&gt;Version 2.0 seems to be the last freeware version, and many copies disappeared from the internet as a training company seems to have taken a commercial interest in the technology.&amp;nbsp; However, the license.txt of these full-featured versions provides for free use and distribution.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;CamStudio 2.0 (&lt;span style="font-family: Arial"&gt;95, 98, Me, NT 4.0, 2000, XP&lt;/span&gt;)* &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/Camstudio2-0.exe"&gt;.EXE Setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/Camstudio2-0.zip"&gt;.ZIP Version&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The below files are all optional.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/vscap20s.zip"&gt;CamStudio 2.0 Source Code&lt;/a&gt; (program code, only useful for geeks) ... I actually have two different versions of the source, and I have not investigated how these are different.&amp;nbsp; Both versions are here. &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/vscap20s.zip"&gt;vscap20s.zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/Camstudio-2.0-src.zip"&gt;Camstudio-2.0-src.zip&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;CamStudio Lossless Codec 1.0... optional software that improves the clarity of the picture, but has to be on the systems of both the creator and viewer of the file. This is usually not convenient. &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/CamstudioCodec-1.0-w32.zip"&gt;Codec Binaries&lt;/a&gt; (.ZIP with install instructions enclosed)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.funchords.com/favorite/freeware/camstudio/CamstudioCodec-1.0-src.zip"&gt;Source Code&lt;/a&gt; (program code, only useful for geeks) &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;p&gt;我的话：&lt;/p&gt;&lt;p&gt;下了一个2.6版的，试着用了一下，效果不错。源代码只能找到2.0版的，就是从上面的网址找到的。用钩子实现的，开始研究源代码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2423839.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/03/29/2423839.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/02/08/2342609.html</id><title type="text">概要设计和详细设计的区别与联系 (转)</title><summary type="text">http://www.blogjava.net/wealupa/archive/2009/04/27/267692.html软件设计采用自顶向下、逐次功能展开的设计方法，首先完成总体设计，然后完成各有机组成部分的设计。 根据工作性质和内容的不同，软件设计分为概要设计和详细设计。概要设计实现软件的总体设计、模块划分、用户界面设计、数据库设计等等；详细设计则根据概要设计所做的模块划分，实现各模块的算法设计，实现用户界面设计、数据结构设计的细化，等等。 概要设计是详细设计的基础，必须在详细设计之前完成，概要设计经复查确认后才可以开始详细设计。概要设计，必须完成概要设计文档，包括系统的总体设计文档、.</summary><published>2012-02-08T05:58:00Z</published><updated>2012-02-08T05:58:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/02/08/2342609.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/02/08/2342609.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.blogjava.net/wealupa/archive/2009/04/27/267692.html" rel="nofollow"&gt;http://www.blogjava.net/wealupa/archive/2009/04/27/267692.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;软件设计采用自顶向下、逐次功能展开的设计方法，首先完成总体设计，然后完成各有机组成部分的设计。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 根据工作性质和内容的不同，软件设计分为概要设计和详细设计。概要设计实现软件的总体设计、模块划分、用户界面设计、数据库设计等等；详细设计则根据概要设计所做的模块划分，实现各模块的算法设计，实现用户界面设计、数据结构设计的细化，等等。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计是详细设计的基础，必须在详细设计之前完成，概要设计经复查确认后才可以开始详细设计。概要设计，必须完成概要设计文档，包括系统的总体设计文档、以及各个模块的概要设计文档。每个模块的设计文档都应该独立成册。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细设计必须遵循概要设计来进行。详细设计方案的更改，不得影响到概要设计方案；如果需要更改概要设计，必须经过项目经理的同意。详细设计，应该完成详细设计文档，主要是模块的详细设计方案说明。和概要设计一样，每个模块的详细设计文档都应该独立成册。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计里面的数据库设计应该重点在描述数据关系上，说明数据的来龙去脉，在这里应该结合我们的一下结果数据，说明这些结果数据的源点，我们这样设计的目的和原因。详细设计里的数据库设计就应该是一份完善的数据结构文档，就是一个包括类型、命名、精度、字段说明、表说明等内容的数据字典。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计里的功能应该是重点在功能描述，对需求的解释和整合，整体划分功能模块，并对各功能模块进行详细的图文描述，应该让读者大致了解系统作完后大体的结构和操作模式。详细设计则是重点在描述系统的实现方式，各模块详细说明实现功能所需的类及具体的方法函数，包括涉及到的sql语句等。&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.csdn.net/skyly84/archive/2009/06/02/4236569.aspx" rel="nofollow"&gt;http://blog.csdn.net/skyly84/archive/2009/06/02/4236569.aspx&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;概要设计与详细设计的区别&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计就是设计软件的结构，包括组成模块，模块的层次结构，模块的调用关系，每个模块的功能等等。同时，还要设计该项目的应用系统的总体数据结构和数据库结构，即应用系统要存储什么数据，这些数据是什么样的结构，它们之间有什么关系。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细设计阶段就是为每个模块完成的功能进行具体的描述，要把功能描述转变为精确的、结构化的过程描述。&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计阶段通常得到软件结构图&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细设计阶段常用的描述方式有：流程图、N-S图、PAD图、伪代码等&lt;/p&gt;&lt;p&gt;概要设计和详细设计&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在软件设计中，大家经常问到的一个问题是：概要设计应该怎样一个概要法，详细设计应该怎样一个详细法？ &lt;/p&gt;&lt;p&gt;这个问题在公司内部经常有人问。现在陈述一下。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们公司的研发流程是瀑布型的，这个模型中的分析、设计阶段是基于经典的结构化方法。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;结构化设计方法的基本思路是：按照问题域，将软件逐级细化，分解为不必再分解的的模块，每个模块完成一定的功能，为一个或多个父模块服务（即接受调用），也接受一个或多个子模块的服务（即调用子模块）。模块的概念，和编程语言中的子程序或函数是对应的。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样一来，设计可以明显地划分成两个阶段： &lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要（结构）设计阶段：把软件按照一定的原则分解为模块层次，赋予每个模块一定的任务，并确定模块间调用关系和接口。&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细设计阶段：依据概要设计阶段的分解，设计每个模块内的算法、流程等。&lt;/p&gt;&lt;p&gt;概要设计阶段：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在这个阶段，设计者会大致考虑并照顾模块的内部实现，但不过多纠缠于此。&lt;font color="#0000ff"&gt;主要集中于划分模块、分配任务、定义调用关系。模块间的接口与传参在这个阶段要定得 十分细致明确，应编写严谨的数据字典，避免后续设计产生不解或误解。&lt;/font&gt;&lt;font color="#ff0000"&gt;概要设计一般不是一次就能做到位，而是反复地进行结构调整。&lt;/font&gt;典型的调整是合并功能重复的模块，或者进一步分解出可以复用的模块。在概要设计阶段，应最大限度地提取可以重用的模块，建立合理的结构体系，节省后续环节的工作量。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt; 概要设计文档最重要的部分是分层数据流图、结构图、数据字典以及相应的文字说明等。&lt;/font&gt;以概要设计文档为依据，各个模块的详细设计就可以并行展开了。&lt;/p&gt;&lt;p&gt;详细设计阶段:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在这个阶段，各个模块可以分给不同的人去并行设计。在详细设计阶段，设计者的工作对象是一个模块，根据概要设计赋予的局部任务和对外接口，设计并表达出模块的算法、流程、状态转换等内容。这里要注意，如果发现有结构调整（如分解出子模块等）的必要，必须返回到概要设计阶段，将调整反应到概要设计文档中，而不 能就地解决，不打招呼。详细设计文档最重要的部分是模块的流程图、状态图、局部变量及相应的文字说明等。一个模块一篇详细设计文档。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计文档相当于机械设计中的装配图，而详细设计文档相当于机械设计中的零件图。文档的编排、装订方式也可以参考机械图纸的方法。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们公司对模块的认识和传统定义有所不同，认为是较大的软件功能单元才可以称作模块。这种认识使大家对概要设计和详细设计的分工产生了混乱的理解，降低了文档的可用性，应该予以纠正。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&amp;nbsp; 概要设计中较顶层的部分便是所谓的方案。方案文档的作用是在宏观的角度上保持设计的合理性。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有的项目采用面向对象的分析、设计方法。可能在概要设计、详细设计的分工上疑问更多。其实，面向对象的分析、设计方法并没有强调结构化方法那样的阶段性，因此一般不引入概要、详细设计的概念。如果按照公司的文档体系，非要有这种分工的话，&lt;font color="#0000ff"&gt;可以将包的划分、类及对象间的关系、类的对外属性、方法及协作设计看做 概要设计；类属性、方法的内部实现看做详细设计。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 1.需求分析--产生软件功能规格说明书,需要确定用户对软件的需求,要作到明确、无歧义。不涉及具体实现方法。用户能看得明白，开发人员也可据此进行下面的工作（概要设计）。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 2.概要设计--产生软件概要设计说明书，说明系统模块划分、选择的技术路线等，整体说明软件的实现思路。并且需要指出关键技术难点等。&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 3.详细设计--产生软件详细设计说明书，对概要设计的进一步细化，一般由各部分的担当人员依据概要设计分别完成，然后在集成，是具体的实现细节。理论上要求可以照此编码。&lt;/p&gt;&lt;p&gt;概要设计和详细设计的区别与联系&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 软件设计采用自顶向下、逐次功能展开的设计方法，首先完成总体设计，然后完成各有机组成部分的设计。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 根据工作性质和内容的不同，软件设计分为概要设计和详细设计。概要设计实现软件的总体设计、模块划分、用户界面设计、数据库设计等等；详细设计则根据概要设计所做的模块划分，实现各模块的算法设计，实现用户界面设计、数据结构设计的细化，等等。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概要设计是详细设计的基础，必须在详细设计之前完成，概要设计经复查确认后才可以开始详细设计。概要设计，必须完成概要设计文档，包括系统的总体设计文档、以及各个模块的概要设计文档。每个模块的设计文档都应该独立成册。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细设计必须遵循概要设计来进行。详细设计方案的更改，不得影响到概要设计方案；如果需要更改概要设计，必须经过项目经理的同意。详细设计，应该完成详细设计文档，主要是模块的详细设计方案说明。和概要设计一样，每个模块的详细设计文档都应该独立成册。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 概要设计里面的数据库设计应该重点在描述数据关系上，说明数据的来龙去脉，在这里应该结合我们的一下结果数据，说明这些结果数据的源点，我们这样设计的目的和原因。详细设计里的数据库设计就应该是一份完善的数据结构文档，就是一个包括类型、命名、精度、字段说明、表说明等内容的数据字典。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 概要设计里的功能应该是重点在功能描述，对需求的解释和整合，整体划分功能模块，并对各功能模块进行详细的图文描述，应该让读者大致了解系统作完后大体的结构和操作模式。详细设计则是重点在描述系统的实现方式，各模块详细说明实现功能所需的类及具体的方法函数，包括涉及到的sql语句等。&lt;/p&gt;&lt;p&gt;概要设计，详细设计之间的关系是什么？&lt;/p&gt;&lt;p&gt;Q:&lt;/p&gt;&lt;p&gt;我的看法：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt; 概要设计只说明系统有多少个模块，各模块之间的接口和个模块本身的功能&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 详细设计说明某个具体模块如何实现，粒度应该比程序略高一些&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但是问题来了，各个模块之间是有层次关系的，也有先后逻辑关系。这就说明，在概要设计中，还必须考虑模块的实现细节，否则，你怎么知道这个模块下面要划分子模块？你怎么知道各子模块的调用顺序？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这就说明，概要设计和详细设计是重叠进行的，而软件工程书上说的确是顺序进行的，不知道是不是我的理解有问题。&lt;/p&gt;&lt;p&gt;举个例子，例如排序程序，如果设计2个模块：&lt;/p&gt;&lt;p&gt;一个主模块用于排序子模块用于交换2个变量，主模块调用子模块，但是子模块是怎么设计出来的呢？肯定是你先想到了用冒泡等排序方式的时候需要交换数据，这已经考虑了主模块足够多的细节，似乎属于"详细设计"了，但是目前进行的是概要设计，这就产生了我所说的重叠的情况。&lt;/p&gt;&lt;p&gt;A:&lt;/p&gt;&lt;p&gt;看看上面的帖子，有意思的居多。&lt;/p&gt;&lt;p&gt;上面也有朋友说到用建筑的例子来比喻。&lt;/p&gt;&lt;p&gt;软件的概要设计，主要是建立软件系统的整体架构，也就是我们在盖房子时候，需要先将房子的整个架子构建起来。&lt;/p&gt;&lt;p&gt;软件的详细设计，主要是将软件系统的各个部分的具体设计方法、逻辑、功能采用文字方式进行表述。这样在实现过程中，Coding人员原则上严格按此进行代码实现即可。&lt;/p&gt;&lt;p&gt;这样的一个最为简单的例证：我们可以将代码交付第三方来做。验证与跟踪采取设计来。&lt;/p&gt;&lt;p&gt;我看上面还有一个朋友说：快速做代码。这个本身没有值得批评之处。但只要想一下，你写的代码没有任何设计思想、文档留下的情况，一旦你离开，如何维护？重新设计吗？还是花费几倍人力去研究你写的几千/万，甚至几十万行代码？如果是这样的，你没错，关键是你们老板太对了，钱算什么。&lt;/p&gt;&lt;p&gt;另外的一个问题是：中国人如此聪明，但中国为什么没有出现巨型软件产品呢？个人英雄主义依然很严重，老板的短视利益行为大行其道。&lt;/p&gt;&lt;p&gt;本文来自CSDN博客，转载请标明出处：&lt;a href="http://blog.csdn.net/skyly84/archive/2009/06/02/4236569.aspx" rel="nofollow"&gt;http://blog.csdn.net/skyly84/archive/2009/06/02/4236569.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2342609.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/02/08/2342609.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mazhenyu/archive/2012/01/06/2314001.html</id><title type="text">2011年投资总结及感悟</title><summary type="text">2011年对我而言是个“坑爹”的一年，总资产缩水20%左右，是一个失败的年头。体会一： 深刻体会到“君子不立危墙之下”这句话的道理。 中国的投资市场是一个很不规范的投机市场，几乎已经没有了投资回报的理念，钱都被大股东和原始股东圈走了，所有的市场投资人都是为他们买单的对象，减持已经成为这个市场的断头刃，正所谓“圣人不死，大盗不止”，应该是对这个市场彻底死心的时候了。体会二： 没有最坏只有更坏。市场的最后一跌是相当恐怖的，不要试图猜测这个市场的底线在哪里，其实市场的真实底线是没有底线，当看到形式不对早些离场才是上策。我是吃了很大的亏的，硬抗的感觉很受伤呀，呵呵。体会三： 与其把资金和精力放在中国的</summary><published>2012-01-06T02:13:00Z</published><updated>2012-01-06T02:13:00Z</updated><author><name>3D入魔</name><uri>http://www.cnblogs.com/mazhenyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mazhenyu/archive/2012/01/06/2314001.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mazhenyu/archive/2012/01/06/2314001.html"/><content type="html">&lt;p&gt;2011年对我而言是个&amp;#8220;坑爹&amp;#8221;的一年，总资产缩水20%左右，是一个失败的年头。&lt;/p&gt;&lt;p&gt;体会一： 深刻体会到&amp;#8220;君子不立危墙之下&amp;#8221;这句话的道理。 中国的投资市场是一个很不规范的投机市场，几乎已经没有了投资回报的理念，钱都被大股东和原始股东圈走了，所有的市场投资人都是为他们买单的对象，减持已经成为这个市场的断头刃，正所谓&amp;#8220;圣人不死，大盗不止&amp;#8221;，应该是对这个市场彻底死心的时候了。&lt;/p&gt;&lt;p&gt;体会二： 没有最坏只有更坏。市场的最后一跌是相当恐怖的，不要试图猜测这个市场的底线在哪里，其实市场的真实底线是没有底线，当看到形式不对早些离场才是上策。我是吃了很大的亏的，硬抗的感觉很受伤呀，呵呵。&lt;/p&gt;&lt;p&gt;体会三： 与其把资金和精力放在中国的股市中不如选择一门实业从小做起，未来（2012年4月份中旬前）打算全面从股市中撤出，不再玩了。以后的基金投资也只投资货币式基金了。&lt;/p&gt;&lt;p&gt;体会四： 当市场跌得一片惨绿，票价低廉时，手中却没有现金，这种感觉是很痛苦的。这是一个很深刻的教训，&amp;#8220;耐心&amp;#8221;是很重要的，现金为王，安全为上。&lt;/p&gt;&lt;p&gt;体会五： 越来越不看好未来5年的中国股票市场了，决定出局观望，歇歇心。即使有机会也不再赚这份钱了，呵呵。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;未来打算：&lt;/p&gt;&lt;p&gt;经过一年的痛苦折磨，决定再死扛一段时间等待2012.4月份市场反弹到一个高点减仓80%，最多保留10%-20%的仓位了，对这个市场已经缺少了最基本的信心，这实在是一个坑爹的市场，风险远远大于收益，到处都是骗局，我为鱼肉人为刀俎呀，本人的道行真的是玩过不他们，也不值得再跟他们玩下去了。在未来的5年内将不再把超过30%的资金投入此市场，甚至可以考虑空仓以对。&lt;/p&gt;&lt;p&gt;未来的精力将致力于实业的发展和个人能力的发展。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2012年我将暂时告别股市，也许4年后我会回来，呵呵。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2012.1.6&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mazhenyu/aggbug/2314001.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mazhenyu/archive/2012/01/06/2314001.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
