博文

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......

阅读全文(4701) | 评论: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。 ......

阅读全文(2535) | 评论: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......

阅读全文(3285) | 评论: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......

阅读全文(6009) | 评论: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......

阅读全文(4063) | 评论: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? /******************************************************************......

阅读全文(4260) | 评论: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......

阅读全文(4866) | 评论: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行了。但是有时候这一信息......

阅读全文(4541) | 评论:3

防止CListCtrl闪烁的几种方法(2011-01-05 10:39:00)

摘要:原文:http://www.eggsheller.com/blog/?p=34
1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘 m_ctlList.SetRedraw(FALSE); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.SetRedraw(TRUE); 2.使用LockWindowUpdate禁止窗口重绘,操作完成后,用UnlockWindowUpdate恢复窗口重绘 m_ctlList.LockWindowUpdate(); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.UnlockWindowUpdate(); 3.使用ListCtrl的内部双缓冲 m_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER); VC6未定义LVS_EX_DOUBLEBUFFER宏,使用者可以自定义,如下: #define LVS_EX_DOUBLEBUFFER 0×00010000 4.Virtual List 首先要设置ListCtrl风格为LVS_REPORT | LVS_OWNERDATA或在ListCtrl属里中的More Styles页面中选中Owner data复选框。 其次要向应LVN_GETDISPINFO消息; void OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; LV_ITEM *pItem = &(pDispInfo)->item;
char szText[128] = {0};
if (pItem->mask & LVIF_TEXT)
{ //使缓冲区数据与表格子项对应 //m_ArrayBuff为二维数组 //定义如下 int m_ArrayBuff[2048][4];
_stprintf(szText,_T(“%d”),m_ArrayBuff[p......

阅读全文(2861) | 评论:0

python 50个有用的modules(2010-12-31 14:43:00)

摘要:Python具有强大的扩展能力,列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images, Sound, OS interaction, Web,以及其他。推荐收藏。 

Graphical interface wxPython http://wxpython.org   
Graphical interface pyGtk http://www.pygtk.org   
Graphical interface pyQT http://www.riverbankcomputing.co.uk/pyqt/   
Graphical interface Pmw http://pmw.sourceforge.net/   
Graphical interface Tkinter 3000 http://effbot.org/zone/wck.htm   
Graphical interface Tix http://tix.sourceforge.net/   
        
Database MySQLdb http://sourceforge.net/projects/mysql-python   
Database PyGreSQL http://www.pygresql.org/   
Database Gadfly http://gadfly.sourceforge.net/   
Database SQLAlchemy http://www.sqlalchemy.org/   
Database psycopg http://www.initd.or......

阅读全文(4348) | 评论:1