博文

[置顶] vc编译器各选项含义及说明(2007-04-13 19:35:00)

摘要:=====vc编译器各选项含义及说明(值得收藏)========
 
  -优化-    
  /O1   最小化空间   minimize   space  
  /Op[-] 改善浮点数一致性   improve   floating-pt   consistency  
  /O2   最大化速度   maximize   speed  
  /Os   优选代码空间   favor   code   space  
  /Oa   假设没有别名   assume   no   aliasing  
  /Ot   优选代码速度   favor   code   speed  
  /Ob   内联展开(默认   n=0)   inline   expansion   (default   n=0)  
  /Ow   假设交叉函数别名   assume   cross-function   aliasing  
  /Od   禁用优化(默认值)   disable   optimizations&nb......

阅读全文(5157) | 评论:0 | 复制链接

Direct2D入门(2011-01-22 13:41:00)

摘要: Direct2D入门 一. 资源管理(Resource management) 和Direct3D一样,Direct2D程序需要处理设 备丢失(Device lost)问题。Direct2D中的资源分为设备独立资源(Device independent resource)和设备依赖资源(Device dependent resource)。 设备独立资源包括: ID2D1DrawingStateBlock ID2D1Factory ID2D1Geometry 和由此继承而来的接口 ID2D1GeometrySink and ID2D1SimplifiedGeometrySink ID2D1StrokeStyle 设备依赖资源包括: ID2D1Brush 和由此继承而来的接口 ID2D1Layer ID2D1RenderTarget 和由此继承而来的接口 其他资源 具体参见:http://msdn.microsoft.com/en-us/library/dd756757(v=VS.85).aspx 二. Direct2D程序的结构 在程序初始化函数处创建设备独立资源,如ID2D1Factory,IDWriteFactory等; 创建设备依赖资源,如果运行过程中出现设备丢失,需要重新创建; 响应WM_PAINT消息,在OnPaint()或OnDraw()等处,用创建的资源Render; 响应WM_SIZE消息,在OnSize()处调用ID2D1RenderTarget::Resize(); 响应WM_ERASEBKGND,在OnEraseBkgnd()处返回FALSE,阻止GDI重绘客户区背景色,设置背景色的工作交给Direct2D在Render时设置,否则在Resize时会出现窗口闪烁的问题; 退出程序前,清理资源。 为提高程序的性能,尽量减少资源的创建和销毁操作,将能够重复利用的资源接口变量申明为View类的成员变量。 三. Direct2D demo 一个简单的MFC程序,用于演示Direct2D程序的结构和一些简单绘图操作。 1.Direct2D prerequisite D......

阅读全文(3714) | 评论:0 | 复制链接

创建纯资源 DLL(2011-01-18 11:00:00)

摘要:纯资源 DLL 是仅包含资源(如图标、位图、字符串和对话框)的 DLL。使用纯资源 DLL 是在多个程序之间共享同一组资源的好方法。提供其资源被针对多种语言进行本地化的应用程序也是一种好方法(请参见 MFC 应用程序中的本地化资源:附属 DLL)。 若要创建纯资源 DLL,请创建一个新的 Win32 DLL(非 MFC)项目,并将资源添加到此项目。 在“新建项目”对话框中选择“Win32 项目”,并在“Win32 项目向导”中指定 DLL 项目类型。 为 DLL 创建一个包含资源(如字符串或菜单)的新资源脚本,并保存该 .rc 文件。 在“项目”菜单上单击“添加现有项”,然后在项目中插入这个新的 .rc 文件。 指定 /NOENTRY 链接器选项。/NOENTRY 防止链接器将 _main 引用链接到 DLL 中;此选项是创建纯资源 DLL 所必需的。 生成 DLL。 使用纯资源 DLL 的应用程序应调用 LoadLibrary 来显式链接到 DLL。若要访问资源,请调用一般函数 FindResource 和 LoadResource,这两个函数对任何类型的资源都有效,或调用下列资源特定的函数之一: FormatMessage LoadAccelerators LoadBitmap LoadCursor LoadIcon LoadMenu LoadString 使用完资源后,应用程序应调用 FreeLibrary。 ......

阅读全文(1813) | 评论:0 | 复制链接

[z]程序员调试能力和相关书籍(2011-01-15 15:08:00)

摘要:在软件行业中,个人觉得每个Coder、Leader(那些当了Leader以后就不需要Code的除外)都应该除了具有良好的编码能力以外,最为 主要的就是Debug的能力要坚实。千万不要告诉我Debug工作是Tester和QA的事情,首先你要认识到Debug的能力是一个并不简单的能力,能 帮助你提高你的开发能力,加快开发速度,节约开发成本;其次你更应该知道,你所掌握的Debug的能力和技术并不可能抢去Tester或者QA的饭碗,他 们做的工作更仔细、全面,更富有创造力。由于本人数年来一直使用VC6,所以下面使用的观点和相关的描述都是从VC出发的,肯定有所偏颇、错误之处,还望 各位看官不吝啬地指出,本人定虚心接受,共同讨论,共同学习,共同进步。个人觉得Debug能力包括以下三个个方面:  
   
  1、良好的编码习惯,良好的逻辑结构能力,对Bug的预见能力。一个成熟的程序员,应该有一个良好的编程习惯,不仅需要有良好的编码格式规范,更为需要的 是对于程序中的逻辑实现时候有一种良好的结构。编程其实就是数据和逻辑的集合,数据的处理较为简单,或者说是需要的逻辑思维能力比较少,当算法逻辑要在数 据上实现的时候,同一种逻辑,让不同的程序员来实现可能有各种各样的不同实现结构,从这个角度来说,这里所说的“良好的编码习惯”就应该指的是对于逻辑实 现时候使用的良好的编程结构,一个好的编程结构应该是能预防错误的发生,对错误的预见和错误出现以后的错误处理与异常处理的良好安排。也许有人说这不好办 吗?每个逻辑判断的地方添加条件判断或者异常处理不就行了?个人觉得不是那么回事,过多的if、assert、ASSERT等语句或者是宏,尤其是并列的 if语句需要耗费很多判断、执行的时间,对于一个子程序(函数),尤其是调用频率比较频繁的子程序(函数),一次浪费了一点点时间,多次、频繁地调用浪费 的时候就显得可观了,所以并不是if语句使用的多,程序出错的可能性就小,过犹不及!如果确实需要使用多个if语句进行条件判断,最好能使用嵌套的if语 句,逐步的缩小判断范围,这样消耗的时间要比并列的if语句要小,还要注意的是if语句的条件判断也不是万能的;assert、ASSERT等判断宏也不 是万能的,它会造成Debu......

阅读全文(2605) | 评论:0 | 复制链接

[z]A2W和W2A :很好的多字节和宽字节字符串的转换宏(2011-01-15 15:06:00)

摘要:作者:朱金灿 来源:http://blog.csdn.net/clever101            以前看《Window核心编程》,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。近日接触了ATL的一个很好的字符串的转换宏:A2W和W2A。        用法很简单,A2W的用法:        view plaincopy to clipboardprint?         #include <atlconv.h>   DoSomething(LPWSTR str);  //  函数声明      USES_CONVERSION;   DoSomething(A2W("SomeString"));   #include <atlconv.h> DoSomething(LPWSTR str); // 函数声明 USES_CONVERSION; DoSomething(A2W("SomeString"));        W2A的用法:     view plaincopy to clipboardprint? #include <atlconv.h>   DoSomething(LPCSTR str); //  函数声明       USES_CONVERSI......

阅读全文(4993) | 评论:2 | 复制链接

[z]DLL封装框架视图经验总结二(2011-01-15 15:05:00)

摘要:现在说说如何外部调用。新建一个调用该DLL 的单文档工程Ower ,现在Ower 工程,在框架类 CMainFrame 类定义一个CCustomManage2 类的私有变量:
view plaincopy to clipboardprint? private:       CCustomManage2 m_CustomManage2;   private: CCustomManage2 m_CustomManage2;
然后新建一个菜单项,在菜单项的命令响应函数里弹出新建窗口,具体代码如下:
void CMainFrame::OnTest2() { // TODO: 在此添加命令处理程序代码 m_CustomManage2.CreateDocTemple(); }
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4   下面谈谈如何销毁窗口防止内存泄露。这时我们需要考虑用户是怎么关闭新建窗口,用户就是要么是单击调用程序的关闭按钮把两个窗口都关闭;要么单击DLL 弹出的新建窗口的关闭按钮。用户先关新建窗口,再关闭调用程序,这个是没有内存泄露的。但是如果用户一下关闭应用程序(就是同时关闭两个窗口),就会出现内存泄露。为此我们需要重写 CMainFrame 类的WM_CLOSE 消息:
       void CMainFrame::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 // 获取框架窗口指针 CCus......

阅读全文(3465) | 评论:1 | 复制链接

[z]DLL封装框架视图经验总结-(2011-01-15 15:04:00)

摘要:作者:朱金灿 来源:http://blog.csdn.net/clever101         有关VC编程中DLL封装对话框的资料网上多如牛毛,现在我想探究一下如何在DLL中封装框架窗口、文档和视图,略有所得,与诸君共享。我找到了两种DLL封装框架视图的方式。实际上用DLL封装框架视图涉及到两点:一是如何封装;二是确保窗口销毁之后的不出现内存泄露。(下面所有代码的开发环境为:VS C++ 2005+sp1, Win XP + sp2)   方式一 动态创建窗口        请不要误会,我不是指用C语言开发SDK的方式动态创建窗口的方式,当然这样是完全可以的,问题是这种太过于方式太过于复杂。微软已经封装好了MFC,我们没必要不领微软的情。我采用的是一种API和MFC结合的方式。我们把调用DLL模块的程序叫宿主程序,把封装窗体的DLL叫客户程序。   首先我们建一个使用共享MFC的规则DLL工程Custom1。我的基本想法是这样的:定义三个类: 类名 描述 备注 CCustomManage1 对外接口类,该类负责动态窗口的创建和销毁。   CCustomFrameWnd1   派生自CFrameWnd,为动态创建的框架窗口类。   CCustomView1   派生自CView,为动态创建的视图类。           大致的设计是这样的:在CCustomManage1类定义一个CCustomFrameWnd1类的指针,在CCustomFrameWnd1类定义一个CCustomView1类的指针。   主要创建代码如下: view plaincopy to clipboardprint? /******************************************************************......

阅读全文(3415) | 评论:1 | 复制链接

[z]对话框的OnPaint函数的两种写法的区别(2011-01-15 15:02:00)

摘要:作者:朱金灿
来源:http://blog.csdn.net/clever101/
       下面是对话框的OnPaint函数(就是WM_PAINT消息的响应函数)的两种写法。
写法一:
view plaincopy to clipboardprint? void CMyDlg::OnPaint()   {       CDC *pDC = GetDC();       // 我的绘制代码       MyDrawFunction(pDC);       ReleaseDC(pDC);   }   void CMyDlg::OnPaint() { CDC *pDC = GetDC(); // 我的绘制代码 MyDrawFunction(pDC); ReleaseDC(pDC); }
写法二:
 view plaincopy to clipboardprint? void CMyDlg::OnPaint()   {        CPaintDC  dc(this);       // 我的绘制代码       MyDrawFunction(&dc);   }    void CMyDlg::OnPaint......

阅读全文(4000) | 评论:1 | 复制链接

[z]如何调试MFC中的内存泄漏(2011-01-15 15:00:00)

摘要:转载地址:http://www.cnitblog.com/martin/archive/2006/04/21/9460.html     首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。           我们来看看: F:\CodeSample\Test\TestPipe\LeakTest\MainFrm.cpp( 54 ) : { 86 } normal block at  0x00422E80 ,  10  bytes  long .
 Data:  <            >  1F 1F 1F 1F 1F CD CD CD CD CD 

         F:\CodeSample\Test\TestPipe\LeakTest\MainFrm.cpp( 54 ) 告诉我们MFC认为是在该文件的54行,发生了内存泄漏。你双击改行就可以转到该文件的54行了。但是有时候这一信息......

阅读全文(3859) | 评论:3 | 复制链接

[译文]三重缓冲:为什么我们爱它(2010-11-25 17:35:00)

摘要:文章来源:http://www.anandtech.com/video/showdoc.aspx?i=3591&p=1
文章标题:Triple Buffering: Why We Love It
文章作者:Derek Wilson
文章时间:2009年6月26日

引子

我们往往不愿过多讨论哪些选项在游戏中应该开启。相反,我们往往把重点放在我们的评测内容上。老实说,我们对玩游戏的建议设置与我们的评测设置非常相似,除了一个非常重要的选项:三重缓冲(这同时意味着开启垂直同步V-sync )。虽然这不是一个所有的游戏都有的选项——但它真的很必要要。我们现在来说为什么要开启三重缓冲以及为什么开发商应该支持它。

对大多数游戏玩家来说,当涉及到任何关于垂直同步(V-sync)的时候 ,都会在驱动程序或游戏中关闭它。事实上,我们做评测时也会这样做,因为它使我们更清楚地看到游戏的真实性能。而那些喜欢打开垂直同步的玩家,则是为了避免在某些情况下发生视觉“撕裂”效果。

我们想尝试一些不同的写作方式。下文中将包括两个投票调查,首页以及文章的末尾。第一个调查报告的目的反馈我们的读者对垂直同步、双重与三重缓冲的了解程度。


这个投票结果取之于2009年6月27日下午5点

看完正文后后,我们的读者可以参与另一个投票,其目的是本文对读者的影响是否会左右将来的游戏设置。

首先将是审视一下双重缓冲和垂直同步的概念,然后我们会谈论三重缓冲。对于那些执着于细节的读者(需要更多的有说服力的证据),我们将提供丰富的插图更深入的剖析每种方法。


什么是双重缓冲,垂直同步和三重缓冲?

当电脑需要在显示器上显示东西时,它按照它的想法画一幅需要显示的图像(我们称之为缓冲区Buffer)并传输给显示器。在过去,只有一个缓冲区并不断的被电脑绘制和发送给显示器。这种做法有一些优势,但也有非常大的缺点。最值得注意的是,当物体在屏幕上进行了更新,他们往往会导致闪烁。
......

阅读全文(3739) | 评论:4 | 复制链接