DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 541 评论 :: 1614万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

11 2013 档案

摘要:《白手起家Win32SDK应用程序》目录《白手起家Win32SDK应用程序》第一篇、预备知识第二篇、创建Win32工程和主函数第三篇、增加一个回调函数第四篇、注册一个窗口类第五篇、利用已注册的窗口类来创建一个窗口第六篇、显示你创建的窗口第七篇、获取消息及对消息缺省处理第八篇、关闭窗口的同时退出程序第九篇、窗口标题栏上显示自定义图标(手动编辑代码)第一篇、预备知识 白云小飞1 说在前面由于VC6及MFC的特点,我们许多人从标准C++学习到VC6MFC应用程序的编程学习的过度会有一个很大的夸跃,从而感到非常的吃力。究其原因之一:MFC类库设计虽然精巧,但我们在使用MFC设计程序时,会发现MFC到处 阅读全文
posted @ 2013-11-29 19:15 DoubleLi 阅读(7283) 评论(0) 推荐(3) 编辑

摘要:在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:第一种方法:CMYClass::CSomeClass(){ x=0; y=1;}第二种方法:CSomeClass::CSomeClass() : x(0), y(1){}本文将要探讨这两种方法的异同以及如何使用这两种方法。 从技术上说,第二种方法比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑。 让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数... 阅读全文
posted @ 2013-11-28 10:04 DoubleLi 阅读(652) 评论(0) 推荐(0) 编辑

摘要:在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等 阅读全文
posted @ 2013-11-28 10:01 DoubleLi 阅读(959) 评论(0) 推荐(0) 编辑

摘要:这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下:一 .两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收。2.短连接 Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.二 .什么时候需要考虑粘包问题?1:如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题(因为只有一种包结构,类似 阅读全文
posted @ 2013-11-28 09:59 DoubleLi 阅读(805) 评论(0) 推荐(0) 编辑

摘要:当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API)。TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagram protocol,用户数据报协议)是无连接的,提供高效率服务。在实际工程应用中,对可靠性和效率的选择取决于应用的环境和需求。一般情况下,普通数据的网络传输采用高效率的udp,重要数据的网络传输采用高可靠性的TCP。在应用开发过程中,笔者发现基于TCP网络传输的应用程序有时会出现粘包现象(即发送方 阅读全文
posted @ 2013-11-28 09:56 DoubleLi 阅读(807) 评论(0) 推荐(0) 编辑

摘要:转载:http://hi.baidu.com/ah__fu/blog/item/9c5b1236934f84240b55a92b.html下面是他写的无锁队列的文章:Michael &Scott 无锁队列 C++ 实现:http://www.cnblogs.com/napoleon_liu/archive/2010/08/07/1794566.html 这个MS-Queue实现了安全的多个线程入队,多个线程出队。不过因为阶段需要new出来,会有一点影响性能。GCC 之 cas和cas2:http://www.cnblogs.com/napoleon_liu/articles/2006428.h 阅读全文
posted @ 2013-11-28 09:54 DoubleLi 阅读(480) 评论(0) 推荐(0) 编辑

摘要:MFC中有不少的全局函数,方便在不同对象中获取不同的内容或创建不同的对象。主要全局函数有:AfxWinInit() AfxBeginThread() AfxEndThread() AfxFormatString1() AfxFormatString2()AfxMessageBox() AfxOutPutDebugString() AfxGetApp() AfxGetMainWnd() AfxGetInstance()AfxRegisterClass()这些函数从名称上可见豹斑(功能)。本文是学习深入浅出MFC后的第一个笔记,解析AfxGetApp()函数在AFXWIN.H中是这么定义的: CW 阅读全文
posted @ 2013-11-28 09:52 DoubleLi 阅读(4475) 评论(0) 推荐(0) 编辑

摘要:MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快。为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一。 同MFC消息映射机制有关的宏有下面几个: DECLARE_MESSAGE_MAP()宏 BEGIN_MESSAGE_MAP(theClass,baseClass)和END_MESSAGE_MAP()宏 弄懂MFC消息映射机制的最好办法是将找出一个具体的实例,将这些宏展开,并找出相关的数据结构。 DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()宏... 阅读全文
posted @ 2013-11-28 09:51 DoubleLi 阅读(421) 评论(0) 推荐(0) 编辑

摘要:一、什么是窗口类 在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC在调用Windows的API(CreateWindow或者CreateWindowEx)创建窗口之前,要求程序员必须定义一个窗口类(不是传统C++意义上的类)来规定所创建该窗口所需要的各种信息,主要包括:窗口的消息处理函数、窗口的风格、图标、鼠标、菜单等。其定义如下:typedefstructtagWNDCLASSA(注:该结构为ANSII版本){UINTstyle;WNDPROClpfnWndP. 阅读全文
posted @ 2013-11-28 09:50 DoubleLi 阅读(1153) 评论(0) 推荐(0) 编辑

摘要:话题引入:在C语言时代,当人们使用纯粹的C开发windows应用程序时,只需要通过窗口句柄HWND【HWND是WND的内存句柄,而WND是Windows是一个内部私有数据结构,存储着窗口的相关信息:尺寸信息、标题信息等。一般来说开发人员无法访问这个数据结构,不过可以以HWND为参数调用windows的API函数如:GetWindowRect、GetWindowText等获得对其的访问】即可完成有关窗口的操作。MFC类是C++类机制,MFC的类通过C++的对象方法将窗口的句柄封装起来。存在着窗口句柄(Windows对象)到MFC中C++窗口对象(MFC对象)之间的映射机制,该机制保证了HWND与 阅读全文
posted @ 2013-11-28 09:49 DoubleLi 阅读(530) 评论(0) 推荐(0) 编辑

摘要:侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了。而李久进的<mfc深入浅出>,听说的人可能就少得多。原因听说是这本书当时没有怎么宣传,而自从1999年第1版后,似乎也没有重印过,现在市面上根本找不到,所以大部分人都不知道。我手里现在恰好有一本,是从图书馆借的。这本书全名为<mfc深入浅出——从mfc设计到mfc编程>李久进编著,华中理工大学出版。此书极佳!我这本书是1999年9月第一版,印数居然只有5000册。这么好的书只印5000册,而市面上都让一堆破烂玩意充斥着……这本书在写作目的上和侯捷的那本<深入浅出mfc>很相像。都是具体介绍mfc的原理和mfc 阅读全文
posted @ 2013-11-28 09:48 DoubleLi 阅读(637) 评论(0) 推荐(0) 编辑

摘要:main是C/C++的标准入口函数名WinMain是windows API窗体程序的入口函数。(int WINAPI WinMain()) 中 WINAPI是__stdcall宏,在windef.h中定义的。_tmain _tWinMain 是Unicode版本函数别名,对应与wmain和wWinMain。*****************************************************************************************中有如下几行:#ifdef _UNICODE#define _tmain wmain#define _tWinMa 阅读全文
posted @ 2013-11-28 09:47 DoubleLi 阅读(541) 评论(0) 推荐(0) 编辑

摘要:文档视图结构(Document/ViewArchitecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/ViewArchitecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFCAppWizard就可以很轻松地获得一个支持Document/ViewArchitecture的MFC程序框架,Document/ViewArchitecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自拔。加上我们更多的人都没有经过WindowsSDKProgramming的学习和经历就直接进行MF 阅读全文
posted @ 2013-11-28 09:46 DoubleLi 阅读(384) 评论(0) 推荐(0) 编辑

摘要:CWnd::FromHandlePermanent ——根据窗口句柄得到CWnd*指针This function, unlikeFromHandle, does not create temporary objects.CWnd::FromHandle——根据窗口句柄得到CWnd*指针CWnd* PASCAL CWnd::FromHandle(HWND hWnd){CHandleMap* pMap = afxMapHWND(TRUE); //create map if not existASSERT(pMap != NULL);CWnd* pWnd = (CWnd*)pMap->From 阅读全文
posted @ 2013-11-28 09:45 DoubleLi 阅读(1073) 评论(0) 推荐(0) 编辑

摘要:1、创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。 工作者线程CWinThread *AfxBeginThread( AFX_THREADPROC pfnThreadProc, //控制函数 LPVOID pParam, //传递给控制函数的参数 int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级 UINT nStackSize = 0, //线程的堆栈大小 DWORD dwCreateFlags = 0, //线程的创建标志 L.. 阅读全文
posted @ 2013-11-28 09:44 DoubleLi 阅读(1545) 评论(0) 推荐(0) 编辑

摘要:CL.exe是控制Microsoft C和C++编译器与链接器的32位工具。编译器产生通用对象文件格式(COFF)对象(.obj)文件。链接器产生可执行文件(.exe)或动态链接库文件(DLL)。注意,所有编译器选项都区分大小写。若要编译但不链接,请使用/c。使用NMAKE生成输出文件。使用BSCMAKE支持类浏览。以下是一个完整的编译器选项分类列表。优化选项 作用/O1 创建小代码/O2 创建快速代码/Oa 假设没有别名/Ob 控制内联展开/Od 禁用优化/Og 使用全局优化/Oi 生成内部函数/Op 改善浮点数一致性/Os 代码大小优先/Ot 代码速度优先/Ow 假定在函数调用中使用别名/ 阅读全文
posted @ 2013-11-28 09:43 DoubleLi 阅读(1336) 评论(0) 推荐(0) 编辑

摘要:在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具。link.exe的输入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件等等,而输出的文件一般是exe文件、dll文件、sys文件等可执行程序文件。1、命令行参数link.exe运行参数如下:LINK [options] files参数包括选项和文件名,选项和文件名可按任意顺序指定。link会首先处理选项,然后是文件。各参数间必须使用一个或多个空格或制表符来分隔。2、输入文件参数中的files是指链接器的输入文件 阅读全文
posted @ 2013-11-28 09:42 DoubleLi 阅读(5326) 评论(0) 推荐(0) 编辑

摘要:Windows应用程序中,图标、菜单、畏途、图标、工具条、对话框等是以资源的形式存在的。开发人员也可以自定义资源类型。如果一个程序使用了资源,那么它在构建时需要对资源进行编译。程序所使用的资源会在资源脚本文件(*.rc)中进行描述编写,编译时,资源编译器会将*.rc文件编译为可链接的.res文件。(资源中可以包括字符串)1、命令行参数使用如下方式在命令行中运行rc.exeRC [options] srcipt-fileoptions是编译选项,script-file是需要编译的资源脚本文件。用户可以使用如下方式调用:rc.exe /n /fo Hello.res Hello.rc2、资源编译器 阅读全文
posted @ 2013-11-28 09:41 DoubleLi 阅读(2358) 评论(0) 推荐(0) 编辑

摘要:这一章节介绍的全是VC编译器选项,option参数是cl.exe的编译选项,是cl.exe命令行参数中最复杂、也是最常用的。下面介绍一些常用的编译选项:1、代码生成有关这些选项将影响编译完成后生成的机器代码:2、调试有关与调试有关的编译选项如下图,/Z7、/Zi、/ZI这三个选项是对程序进行调试时所必需的选项,同时注意,在生成调试版本的程序时,需要指定/Od选项以禁用优化:3、程序优化有关与程序优化有关的选项如下图,优化选项将影响编译器对代码的优化,最选择代码体积最小还是选择运行速度最快等需要使用这些选项:4、输出文件有关与生成的输出文件有关的选项如下图,输入文件在参数中需要使用字符串来指定其 阅读全文
posted @ 2013-11-28 09:40 DoubleLi 阅读(595) 评论(0) 推荐(0) 编辑

摘要:cl.exe的功能是将源代码文件编译为可提供链接器使用的obj对象文件。cl.exe命令行参数形式如下:CL (option...) file... [option | file]... [lib...] [@command-file] [/link link-opt...]各命令行参数的意义如下 :1、option命令行中的"option"是指一个或多个编译选项。在指定选项时,需要在选项前加正斜杠(/)或一个短划线(-)。有一些选项还会带有参数,使用":"来指定选项的参数。比如"/sybsystem:windows,5.0"是一个编 阅读全文
posted @ 2013-11-28 09:39 DoubleLi 阅读(873) 评论(0) 推荐(0) 编辑

摘要:资源档有什麽用处呢?最重要的有两个地方1.国际发行:我们将Application中所有的文字从Resource用读取,那麽,只要更动 Resource档的内容,就可以用不同语言的方式来显示。2.管理资源:例如说,我们的AP中用了数百张的图片或声音,不用Resource档的话, 在发行出去的AP中,就必需有数百个图形、声音档,那似乎不太好,使 用Resource档,便可以将这些图形、声音放进一个.Res档。使用RC.exe来Compiler我们所定义的Resource档, RC.EXE在vb5.0光碟中的/TOOLS/RESOURCEResources 可分成两大部份:- String reso 阅读全文
posted @ 2013-11-28 09:38 DoubleLi 阅读(1148) 评论(0) 推荐(0) 编辑

摘要:MS Windows操作系统是一个世界上广泛使用的操作系统,对于不同语种的国家MS Windows有相应语种的版本。在不同语种的Windows平台上应该运行相应语种的应用程序。也就是说程序的用户界面(如菜单、对话框、状态条)中的提示文字应该使用和Windows操作系统所使用的语种一致。当然英语用户界面的程序可以运行在其它语言平台上,但比较复杂的程序或多或少都有问题,如对话框的尺寸不对,特殊的ASCII字符显示为文字,输入字符串可能会导致死机等。如果不一致却还想使用,则需要动态翻译软件。例如,在英文Windows平台上运行中文版的MS Office就需要像中文之星或四通利方这样的中文动态翻译软件 阅读全文
posted @ 2013-11-28 09:37 DoubleLi 阅读(828) 评论(0) 推荐(0) 编辑

摘要:DDX/DDV 通过使用ClassWizard向对话类添加成员变量,你可以利用ClassWizard所提供的高效特征,为对话数据交换和对话数据验证自动生成源代码,也就是人们所熟知的DDX/DDV。 数据交换和验证仅仅应用于为之选定了Value类别的成员变量。也就是CString,BOOL,数字,COleDateTime或COLeCurrency。 对话数据交换负责数据在控件中的进出。当对话首次出现的时候,每个控件窗口自动用相应的成员变量的值进行初始化。当用户通过单击OK按钮,或通过按Enter键关闭对话的时候,该控件无论是包含哪一个值或文本,都将被复制回该变量。 对话数据验证可以确保值落在规定 阅读全文
posted @ 2013-11-28 09:36 DoubleLi 阅读(3253) 评论(0) 推荐(0) 编辑

摘要:在Windows应用程序中,窗体是由一种称为“UI线程(User Interface Thread)”的特殊类型的线程创建的。 首先,UI线程是一种“线程”,所以它具有一个线程应该具有的所有特征,比如有一个线程函数和一个线程ID。 其次,“UI线程”又是“特殊”的,这是因为UI线程的线程函数中会创建一种特殊的对象——窗体,同时,还一并负责创建窗体上的各种控件。 窗体和控件大家都很熟悉了,这些对象具有接收用户操作的功能,它们是用户使用整个应用程序的媒介,没有这样一个媒介,用户就无法控制整个应用程序的运行和停止,往往也无法直接看到程序的运行过程和最终结果。 那么,窗体和控件又是如何作到对用... 阅读全文
posted @ 2013-11-28 09:35 DoubleLi 阅读(1429) 评论(0) 推荐(0) 编辑

摘要:说到消息,在MFC中,“最熟悉的神秘”可算是消息映射,那是我们刚开始接触MFC时就要面对的东西。有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了样。特别是窗口消息及对消息的处理跟以前相比,更是风马牛不相及的。如文档不是窗口,是怎样响应命令消息的呢?初次用MFC编程,我们只会用MFC ClassWizard为我们做大量的东西,最主要的是添加消息响应。记忆中,如果是自已添加消息响应,我们应何等的小心翼翼,对BEGIN_MESSAGE_MAP()……END_MESSAGE_MAP()更要奉若神灵。它就是一个魔盒子,把我们的咒语放入恰当的地方,就会发生神奇的力量,放错了,自己的程序就 阅读全文
posted @ 2013-11-28 09:29 DoubleLi 阅读(445) 评论(0) 推荐(0) 编辑

摘要://////////////////////////////////////////////////////////////////////////////////// /********* 文章系列:MFC技术内幕系列***********/ /************MFC技术内幕系列之(四)***********/ /*****文章题目:MFC消息映射与消息传递内幕******/ /* All rights Reserved */ / *********关键字:消息映射,消息传递************/ /* 注释:本文所涉及的程序源代码均在Microsoft */ / Visual. 阅读全文
posted @ 2013-11-28 09:28 DoubleLi 阅读(552) 评论(0) 推荐(0) 编辑

摘要:在上一课的表5.1已经列出了Windows的传统控件及其对应的控件类。在这些控件中,读者应该重点掌握命令按钮、选择框、单选按钮、编辑框、列表框和组合框。.1.1 传统控件的控件通知消息 控件通过向父窗口发送控件通知消息来表明发生了某种事件.例如,当用户在按钮上单击鼠标时,按钮控件会向父窗口发送BN_CLICKED消息.传统控件的通知消息实际上是通过WM_COMMAND消息发给父窗口的(滚动条除外),在该消息的wParam中含有通知消息码(如BN_CLICKED)和控件的ID,在lParam中则包含了控件的句柄. 利用ClassWizard可以很容易地为控件通知消息加入消息映射和消息处理函... 阅读全文
posted @ 2013-11-28 09:27 DoubleLi 阅读(1118) 评论(0) 推荐(0) 编辑

摘要:详细说明:Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法。该方法可以在运行时在内存中直接建立对话框资源,使用起来更为灵活。适用于多个开发项目共享有界面的公用程序模块的情况,也适用于编写需要显示大量对话框或对话框风格随着用户输入不断变化的应用程序。下载地址1:http://files.cnblogs.com/lidabo/CDynamicDialogWithoutTemplate.rar下载地址2:http://www.pudn.com/downloads65/sourcecode/windows/dialog/detail233221.html 阅读全文
posted @ 2013-11-28 09:23 DoubleLi 阅读(737) 评论(0) 推荐(0) 编辑

摘要:在MFC程序中使用对话框时首先在资源模版里创建对话框资源,然后DoModal()或者CReate显示出模式对话框或者非模式对话框,这样创建出的对话框移植性差,从一个工程移动到另一个工程比较麻烦。 在MFC中还有另一种创建对话框的方法:1 在内存中建立对话框资源模版DLGTEMPLATE结构体。2 使用InitModalIndirect API函数即可创建模式对话框,非模式对话框使用CreateDialog API函数创建。代码如下:// 创建内存对话框资源模版类,H文件#pragma once#define DLG_TEMPLATE_BUFFER_MAX_LENGT1024class CDlg 阅读全文
posted @ 2013-11-28 09:15 DoubleLi 阅读(1954) 评论(0) 推荐(2) 编辑

摘要:DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面:DDB的颜色模式必需与输出设备相一致。例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的,即一个像素用一个字节表示。在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。 由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。 11.3.1 DDB的创建MFC的CBitmap类封装了DDB。该类提供了几个函数用来创建DDB:BOOL LoadBitmap( LPCTSTR lpszResourceName );BOO 阅读全文
posted @ 2013-11-28 09:10 DoubleLi 阅读(4472) 评论(0) 推荐(0) 编辑

摘要:DDB(设备相关位图)DDB依赖于具体设备:DDB的颜色模式必需与输出设备相一致。例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的。在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中DIB的与设备无关性主要体现在以下两个方面:DIB的颜色模式与设备无关。例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用。256色以下(包括256色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。由于DIB不依赖于具体设备,因此可以用来永 阅读全文
posted @ 2013-11-28 09:09 DoubleLi 阅读(979) 评论(0) 推荐(0) 编辑

摘要:*[标题]:Skin++通用界面换肤系统V2.0.1破解探讨*[作者]:gz1X *[来自]:中国黑客联盟*[前言]:skin技术,大家都不会陌生,比如winamp,可以灵活的更换界面风格。早期的实现定制的外观方法都需要程序本身做许多处理,编码太麻烦。后来出现了专门的Skin插件,ActiveSkin什么的。再后来dll调用的skin软件出现,需要Skin支持的程序调用几个方法,就可以使自己的程序外观完全改变,不需要编程者对skin技术有任何的了解。Skin++通用界面换肤系统V2.0.1就是其中比较出名的一款。但是让很多“贫民”用户来说,要收费还是比较让人烦的。恰好我前几天做了个小项目,顺便 阅读全文
posted @ 2013-11-28 09:08 DoubleLi 阅读(1174) 评论(0) 推荐(0) 编辑

摘要:Poco::TCPServer框架解析POCO C++ Libraries提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程、文件、流,网络协议包括:HTTP、FTP、SMTP 等,还提供 XML 的解析和 SQL 数据库的访问接口。不仅给我的工作带来极大的便利,而且设计巧妙,代码易读,注释丰富,也是非常好的学习材料,我个人非常喜欢。POCO的创始人在这个开源项目的基础上做了一些收费产品,也成立了自己的公司,"I am in the lucky position to work for my own company",真是让人羡慕啊。POCO C++ 阅读全文
posted @ 2013-11-28 09:05 DoubleLi 阅读(1576) 评论(0) 推荐(0) 编辑

摘要:Wooce Yang收集整理POCO的优点:1) 比boost更好的线程库,特别是一个活动的方法的实现,并且还可设置线程的优先级。2) 比 boost:asio更全面的网络库。但是boost:asio也是一个非常好的网络库。3) 包含了一些Boost所不包含的功能,像XML,数据库接口等。4) 跟Boost相比,集成度更高,是更加统一的一个库。5) Poco的c++代码更清洁,现代和易理解。对不是模板编程专家的人来说,POCO的代码比大多数Boost库容易理解得多6) 可以在许多平台上使用POCO的缺点:1) 文档有限。但这一定程度上是因为代码的容易理解。2) 跟Boost相比用户社群小得多。 阅读全文
posted @ 2013-11-28 09:04 DoubleLi 阅读(838) 评论(0) 推荐(0) 编辑

摘要:陈硕 (giantchen_AT_gmail)Blog.csdn.net/SolsticeMuduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx我将会写一系列文章,介绍用muduo 网络库完成常见的 TCP 网络编程任务。目前计划如下:UNP中的简单协议,包括 echo、daytime、time、discard 等。Boost.Asio中的示例,包括 timer2~6、chat 等。Java Netty中的示例,包括 discard、echo、uptime 等,其中的 discard 和 echo 带流量统计功能。Py 阅读全文
posted @ 2013-11-28 09:02 DoubleLi 阅读(1119) 评论(0) 推荐(0) 编辑

摘要:转载:http://blog.csdn.net/historyasamirror/article/details/5778378当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。《IO - 同步,异步,阻塞,非阻塞》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的那篇link。写完之后发现很多人都很喜欢,我还是非常开心的,也说明这个问题确实困扰了很多人。随着学习的深入,渐渐的感觉原来的理解有些偏差,但是还是没引起自己的重视,觉着都是一些小错误,无伤大雅。直到有位博友问了一个问题,我重新查阅了一些更权威的资料,才发现原来的文章中有很大的理论 阅读全文
posted @ 2013-11-27 21:00 DoubleLi 阅读(439) 评论(0) 推荐(0) 编辑

摘要:Windows SDK笔记(一):Windows程序基本结构一、概述Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成。程序中只要按一定的格式填写系统留给客户的那一小部分。所需要完成的有:窗口类的定义、窗口的建立、消息函数的书写、消息循环。二、消息处理函数Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。没个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。 阅读全文
posted @ 2013-11-27 20:58 DoubleLi 阅读(1167) 评论(0) 推荐(0) 编辑

摘要:1、字符编码、内码,顺带介绍汉字编码字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB 阅读全文
posted @ 2013-11-27 20:48 DoubleLi 阅读(4397) 评论(0) 推荐(1) 编辑

摘要:fstream,istream,ofstream 三个类之间的继承关系fstream :(fstream继承自istream和ofstream)1.typedefbasic_fstream >fstream;// 可以看出fstream就是basic_fstream2.template classbasic_fstream: publicbasic_iostream3.templateclassbasic_iostream: publicbasic_istream,publicbasic_ostreamistream:1.typedefbasic_ifstream >ifstrea 阅读全文
posted @ 2013-11-27 20:47 DoubleLi 阅读(12191) 评论(1) 推荐(0) 编辑

摘要:深度剖析消息反射机制作者:hustli 摘要:在前面我们分析了控件通知消息WM_NOTIFY,和WM_NOTIFY紧密联系的还有一个MFC新特性:消息反射。本文中,我想就这个问题作一个全面的论述,如果有错误,还望各路大虾批评指正。 什么是消息反射? 在windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR。对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就想是从父窗口反射回来一样,故此得名:消息反射。 消息反射的由来 在windows和MFC4.0版本一下,父窗口(通常是一个对话框)会对 阅读全文
posted @ 2013-11-27 20:46 DoubleLi 阅读(706) 评论(0) 推荐(0) 编辑

摘要:界面美化摘要本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:1.大致了解MFC框架的基本运作原理;2.熟悉Windows消息机制,熟悉MFC的消息映射和反射机制;3.熟悉OOP理论和技术;本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。正文1. 美化界面之开题篇相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:图1 瑞星杀毒软件的精美界面程序的功能如何如何强大是一回事,它的用户界面则是另一回事。千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。 阅读全文
posted @ 2013-11-27 20:44 DoubleLi 阅读(3154) 评论(0) 推荐(0) 编辑

摘要:1.WindowProc是你给自己的窗口定义的窗口处理函数DefWindowProc是windows平台提供的默认窗口处理函数如果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作"2.根据1,显然,你只能定义WindowProc而不能定义DefWindowProc看看MFC的CWnd源码就一目了然了LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// OnWndMsg does most of the wor 阅读全文
posted @ 2013-11-27 20:43 DoubleLi 阅读(362) 评论(0) 推荐(0) 编辑

摘要:首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/20110710/19/5209f358-31c8-4057-b108-02155a417fd0.html1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意。可以在这里改变控件的大小,位置,窗口样式,字体 ,等等.....你能想到的能改的,都可以在这里改.2).关于Edit的补充说明:我最初的自绘方法是 阅读全文
posted @ 2013-11-27 20:42 DoubleLi 阅读(661) 评论(0) 推荐(0) 编辑

摘要:前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教。我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 20051).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButton 对象,然后使用 SubclassDlgItem(UINT nID, CWnd* pParent ); 阅读全文
posted @ 2013-11-27 20:35 DoubleLi 阅读(741) 评论(0) 推荐(0) 编辑

摘要:游戏制作已经开始采用C++了,却鲜有人选择使用MFC。但笔者觉得的 ASSERT(),VERIFY()和 TRACE()这几个宏很好用。所以就想自己写一个版本来适应Windows平台下不同的工程类型。提醒:ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。在 Release 版本的程序中它不起任何作用。VERIFY()和 ASSERT()很相似,区别在于在 Release 版本中它仍然有效(译者注:原作者在这里没有讲清楚,VERIFY()不会打印说明,只是会对参数表达式求值)。ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT()宏在 R 阅读全文
posted @ 2013-11-27 20:19 DoubleLi 阅读(501) 评论(0) 推荐(0) 编辑

摘要:记得原来尝试学MFC的时候觉得有一个TRACE可以在Debug时向VS的调试输出窗口输出字串符,用来调试时跟踪变量很方便。然则如果不是MFC项目或者ATL的项目的话是不能使用这个宏的。这时有一个没有什么额外消耗的办法能够做到向调试输出窗口输出。在项目中额外包含windows.h这个头文件,再使用OutputDebugString()这个函数就能够起到与TRACE()宏相同的效果。在进行一点包装就能和c中的printf一样接受不定项参数。下面程序做为范例。#include #include using namespace std;bool _trace(TCHAR *format, ...){T 阅读全文
posted @ 2013-11-27 20:18 DoubleLi 阅读(3736) 评论(0) 推荐(0) 编辑

摘要:BOOL bResult = FALSE; // 初始化WinInet 环境 HINTERNET hInternet = InternetOpen("CEHTTP", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL); if(hInternet == NULL) return ; // 打开http session HINTERNET hSession = InternetConnect(hInternet, "www.hao123.com", 80, NULL, NULL, INTERNET_SERVICE_HT 阅读全文
posted @ 2013-11-27 15:19 DoubleLi 阅读(1436) 评论(0) 推荐(0) 编辑

摘要:HDC在MSDN中的全称为:The handle of device context。通常,我们都是用来做相应的显示操作。 熟悉WIN32的朋友对于其应该不会陌生,经常采用GetDC,GetWindowDC等等来获取其句柄。而用得最多的,可能就是BeginPaint,如:view plaincopy to clipboardprint?caseWM_PAINT:HDChdc=BeginPaint(hWnd,&ps);...EndPaint(hdc,&ps);break;[cpp]view plaincopy caseWM_PAINT:HDChdc=BeginPaint(hWnd 阅读全文
posted @ 2013-11-27 15:11 DoubleLi 阅读(1436) 评论(0) 推荐(0) 编辑

摘要:个人总结:最近看网络编程是碰到了TRACE语句,不知道在哪里输出,查了一晚上资料也没找出来,今天终于在CSDN上找到了,真是个高地方啊,方法如下:1.在MFC中加入TRACE语句2.在TOOLS->MFC TRACER中选择 “ENABLE TRACING”点击OK3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能看到TRACE内容,是因为不是调试执行,而是‘!’了,切记,切记)4.然后就会在OUTPUT中的DEBUG窗口中看到TRACE内容了,调试执行会自动从BUILD窗口跳到DEBUG窗口,在那里就看到TRACE的内容了,^_^以下是找的TRACE的详细介绍:== 阅读全文
posted @ 2013-11-27 14:56 DoubleLi 阅读(1320) 评论(0) 推荐(0) 编辑

摘要:一 局部变量: 在函数体内声明的变量, 称为 局部变量.二 自动局部变量与静态局部变量 局部变量在声明时, 在类型前可以加 auto 或 static 修饰. auto int a ; 表示 a 是自动局部变量, auto 关键字可以省略, 它与 int a ; 等价. static int b ; 表示 b 是 静态局部变量.三 自动局部变量 与 静态局部变量 的区别 1 自动局部变量 在退出函数时, 该变量及其值将"自动" 消失. 当再次执行这个变量所在的函数时, 系统"自动" 重新建立该变量, 与上一次运行时的结果毫不相干. 自动局部变量在函数内定 阅读全文
posted @ 2013-11-25 20:56 DoubleLi 阅读(1303) 评论(0) 推荐(0) 编辑

摘要:#include #include LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter);int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handl 阅读全文
posted @ 2013-11-25 09:22 DoubleLi 阅读(595) 评论(0) 推荐(0) 编辑

摘要:windows窗口的创建有以下几个步骤:1、创建注册窗口类2、创建窗口句柄3、显示更新窗口4、消息循环1、创建注册窗口类所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始化。之后就要用RegisterClass()函数对该窗口类对象进行注册,以便使某个窗口与该窗口类相关联。关于WNDCLASS的定义如下:typedef struct { UINTstyle; WNDPROClpfnWndProc; intcbClsExtra; intcbWndExtra; HINSTANCEhInstance; HICONhIcon; HCURSORhCursor; HBRUSHhbrBac 阅读全文
posted @ 2013-11-25 09:21 DoubleLi 阅读(5153) 评论(0) 推荐(0) 编辑

摘要://////////////////////////////////////////////////////////////////////////////////////////MFC程序的执行顺序依次是:theApp全局对象定义处、TestApp构造函数、WinMain。程序在加载main函数之前,会先为全局变量和全局对象分配内存空间。对于MFC程序来说,通过产生一个应用程序类的对象来唯一标识应用程序的实例。每一个MFC程序实例有且仅有一个该派生类的实例化对象,也就是theApp全局对象,该对象就表示了应用程序本身。theApp对象的构造函数CtestApp在调用之前,会调用其父类CWin 阅读全文
posted @ 2013-11-25 00:06 DoubleLi 阅读(940) 评论(0) 推荐(0) 编辑

摘要:1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用 OnNotify()消息响应函数。... 阅读全文
posted @ 2013-11-24 23:49 DoubleLi 阅读(283) 评论(0) 推荐(0) 编辑

摘要:下面有三个绘图函数需要一个指向矩形结构的指针:FillRect(hdc,&rect,hbursh);//填充FrameRect(hdc,&rect,hbrush);//掏空InvertRect(hdc,&rect);//内部取反[cpp]view plaincopy caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//GetClientRect(hwnd,&rect);//hrgn=CreateRectRgn(100,100,300,300);//hbrush=CreateSolidBrush(RGB(255,0,0));// 阅读全文
posted @ 2013-11-23 16:42 DoubleLi 阅读(935) 评论(0) 推荐(0) 编辑

摘要:提示1:对“内存结构”表示有疑问或不解的,先参考:http://blog.csdn.net/guogangj/archive/2007/05/25/1625199.aspx,本文使用的表示方法和VC6的Memory视图一致,即:左上表示低位。提示2:下文提到的“类大小”严格上来说是该类经过实例化的对象的大小。当然了,光研究长度的话,两者差别不大,因为:CClassA objA,sizeof(CClassA)和sizeof(objA)得到的结果都是一样的。一、真空类class CNull{};长度:1内存结构:??评注:长度其实为0,这个字节作为内容没有意义,可能每次都不一样。二、空类class 阅读全文
posted @ 2013-11-23 16:27 DoubleLi 阅读(409) 评论(0) 推荐(0) 编辑

摘要:这篇文章始于对这么个程序的思考:intmain(intargc,char*argv[]){inti=1234567;DWORDdwWrite;HANDLEhFile=CreateFile("test.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);WriteFile(hFile, &i,sizeof(int), &dwWrite,NULL);CloseHandle(hFile);return0;}用二进制编辑器(如UltraEdit)打开程序输 阅读全文
posted @ 2013-11-23 16:25 DoubleLi 阅读(979) 评论(0) 推荐(0) 编辑

摘要:(本文尝试通过一些简单的实验,来分析Windows的窗口机制,并对微软的设计理由进行一定的猜测,需要读者具备C++、Windows编程及MFC经验,还得有一定动手能力。文中可能出现一些术语不统一的现象,比如“子窗口”,有时候我写作“child window”,有时候写作“child”,我想应该不会有太大影响,文章太长,不一一更正了)问题开始于我的最近的一次开发经历,我打算把程序的一部分界面放在DLL中,而这部分界面又需要使用到Tooltip,但DLL中的虚函数PreTranslateMessage无法被调用到,原因大家可以在网上搜索一下,这并不是我这篇文章要讲的。PreTranslateMes 阅读全文
posted @ 2013-11-23 16:24 DoubleLi 阅读(1021) 评论(0) 推荐(1) 编辑

摘要:1、GDI名字的意义GDI Graphic Device Interface,我说不清和GUI有什么区别。可能一种针对设备,一种针对用户而言吧,反正以后都说GDI,也就是Windows的图形编程。2、设备描述上下文HDCHandle Device Context这个是关键的关键,可以理解成画图的环境,何谓环境,画板,纸,笔,尺寸,字体,颜色,区域等。反正包括你能想到的和未能想到的了。要画出不同的图形,很大程度上是对HDC的修改。3、HDC的创建方式WM_PAINT消息来的时候,用:hdc = BeginPaint(hwnd, &ps);//......EndPaint(hwnd, &a 阅读全文
posted @ 2013-11-23 16:23 DoubleLi 阅读(676) 评论(0) 推荐(0) 编辑

摘要:全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态。 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后如何退出全屏显示状态。 1) 在CMainFrame类中,增加如下三个成员变量。 class CMainFrame : public CFrameWnd { private: //自己添加的三个成员变量 WI... 阅读全文
posted @ 2013-11-23 15:19 DoubleLi 阅读(940) 评论(0) 推荐(0) 编辑

摘要://删除标题和边框WS_CAPTION和WS_BORDER风格ModifyStyle(WS_CAPTION, 0);ModifyStyle(WS_BORDER, 0); 阅读全文
posted @ 2013-11-23 15:18 DoubleLi 阅读(407) 评论(0) 推荐(0) 编辑

摘要:// TOOLTIPWND.H 添加气球式提示栏#if !defined(AFX_TOOLTIPWND_H__2C52D3E4_2F5B_11D2_8FC9_000000000000__INCLUDED_)#define AFX_TOOLTIPWND_H__2C52D3E4_2F5B_11D2_8FC9_000000000000__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000// ToolTipWnd.h : header file//// Written by Shankar (sshank 阅读全文
posted @ 2013-11-23 15:16 DoubleLi 阅读(1207) 评论(0) 推荐(0) 编辑

摘要:前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教。我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 20051).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButton 对象,然后使用 SubclassDlgItem(UINT nID, CWnd* pParent ); 阅读全文
posted @ 2013-11-22 16:10 DoubleLi 阅读(11049) 评论(1) 推荐(0) 编辑

摘要:随着Microsoft凭借Windows在操作系统上取得的巨大成绩,Windows用户界面也日益成为业界标准。统一的界面给广大用户对应用软件的学习与使用带来了很大方便。但每天都面对同一副面孔,日久天长难免会产生一些厌倦,想开发一些"离经叛道"的应用程序,如果能够一改Windows千篇一律的"标准"界面,一定会给用户带来一种清新的感觉。标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而"异形"对话框/窗口也主要是颜色与外形上动手脚。本实例实现了一个"精灵"窗口,程序编译运行后的界面效果如图一所示:图 阅读全文
posted @ 2013-11-22 16:08 DoubleLi 阅读(844) 评论(0) 推荐(0) 编辑

摘要:前一阵突然想起了9月份电面某公司实习时的二面题,大概就是说怎么用Win32 API实现一个透明的窗口,估计当时我的脑残答案肯定让面试官哭笑不得吧。所以本人决定好好研究下这个问题。经过一下午的摸索,基本掌握了使用Win32 API创建各种匪夷所思的窗口的基本思路。(以下文字基于本人的个人理解,由于本人技术和经验原因不保证正确性,希望各位不吝指正)首先我们需要了解一些基础知识。1、Layered Windows。这是Windows2000开始引入的新概念,重新定义了窗口的Hit Testing方法,以前都是把窗口按rectangle的方式裁剪,而把窗口加上WS_EX_LAYERED的Style后就 阅读全文
posted @ 2013-11-22 15:52 DoubleLi 阅读(5481) 评论(0) 推荐(0) 编辑

摘要:前面提到,我们可以用SetWindowRgn或SetLayeredWindowAttributes实现不规则以及半透明的效果对于SetWindowRgn,它通过一个Rgn来设置区域,这个Rgn一般可以从图片中读取,在这张图片中,将不需要显示的区域标记为一种特殊的颜色,这里有个问题,必须保证这种颜色没有被正常的区域使用,否则会被误伤。为了解决这个问题,可以考虑用两张图片,增加一张单色的掩码图,这种方案带来了额外的管理开销。SetWindowRgn的好处是效率较高,对于大部分自绘的皮肤,一般只有四个角落有一些不规则,所以用SetWindowRgn是最好的选择。SetLayeredWindowAtt 阅读全文
posted @ 2013-11-22 15:49 DoubleLi 阅读(8911) 评论(0) 推荐(0) 编辑

摘要:(声明:Alberl以后说到开源库,一般都是指著名的、或者不著名但维护至少3年以上的。那些把代码一扔就没下文的,Alberl不称之为开源库,只称为开源代码。这里并不是贬低,像Alberl前面那个系列的教程《2013 duilib入门简明教程》,还有本系列教程,还有前面介绍的CodeProject,基本上都是代码往上面一扔,就不用再怎么维护的。这些都称之为开源代码,其实开源代码对新手的帮助更大,因为很简明的说明了代码用法~O(∩_∩)O~) 前面两个教程已经对制作界面的几种方式进行了比较,权威界面库已经比较过了,那么接下来就是上一个教程介绍的那三种方式。 而上一个教程已经说的很明确了,用那三.. 阅读全文
posted @ 2013-11-22 15:40 DoubleLi 阅读(30905) 评论(3) 推荐(2) 编辑

摘要:代码下载:http://download.csdn.net/detail/qq316293804/6502879迅雷播放器教程汇总:仿迅雷播放器教程 -- 基于ffmpeg的C++播放器 (1)仿迅雷播放器教程 -- 媒体播放器对比 (2)仿迅雷播放器教程 -- 媒体播放三大底层架构简析 (3)仿迅雷播放器教程 -- 基于VLC的C++播放器 (4)仿迅雷播放器教程 -- 封装VLC (5)仿迅雷播放器教程 -- 基于VLC的MFC播放器 (6)仿迅雷播放器教程 -- 十年经验大牛对MFC的认识 (7)仿迅雷播放器教程 -- 权威界面库对比 (8)仿迅雷播放器教程 -- C++界面制作方法的对 阅读全文
posted @ 2013-11-22 15:35 DoubleLi 阅读(966) 评论(0) 推荐(1) 编辑

摘要:注:下面有project网站的大部分都有paper和相应的code。Code一般是C/C++或者Matlab代码。最近一次更新:2013-3-17一、特征提取Feature Extraction:·SIFT [1] [Demo program][SIFT Library] [VLFeat]·PCA-SIFT [2] [Project]·Affine-SIFT [3] [Project]·SURF [4] [OpenSURF] [Matlab Wrapper]·Affine Covariant Features [5] [Oxford proje 阅读全文
posted @ 2013-11-22 15:25 DoubleLi 阅读(1352) 评论(0) 推荐(0) 编辑

摘要:以下链接是本人整理的关于计算机视觉(ComputerVision, CV)相关领域的网站链接,其中有CV牛人的主页,CV研究小组的主页,CV领域的paper,代码,CV领域的最新动态,国内的应用情况等等。打算从事这个行业或者刚入门的朋友可以多关注这些网站,多了解一些CV的具体应用。搞研究的朋友也可以从中了解到很多牛人的研究动态、招生情况等。总之,我认为,知识只有分享才能产生更大的价值,真诚希望下面的链接能对朋友们有所帮助。(1)googleResearch;http://research.google.com/index.html(2)MIT博士,汤晓欧学生林达华;http://people. 阅读全文
posted @ 2013-11-22 15:23 DoubleLi 阅读(1256) 评论(0) 推荐(0) 编辑

摘要:前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章。 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝不可,鼠标操作之前已经接触很多了,在MFC,QT,OpenGL,等等中,理论主要就是两点,一是监控鼠标操作,鼠标点击,移动,松开,然后通过mouse_event识别判断出那一种鼠标的操作,根据不同的操作然后进行处理,二是在主函数中加入鼠标的回调函数,将鼠标操作与程序的窗口绑定。 第一节 函数介绍 暂时只接触了两个关于opencv2鼠标响应操作的... 阅读全文
posted @ 2013-11-22 15:02 DoubleLi 阅读(35206) 评论(6) 推荐(1) 编辑

摘要:工作线程,在一些技术文章被称为辅助线程,是相对于主线程而言的。在工作线程中使用界面需要一些技巧。我就曾在工程线程中弹出对话框中遇到过莫名奇妙的错误。下面就我的经验谈谈如何从工作线程中弹出对话框(暂时只讲方法,原理还没彻底弄清楚)。实际上在工作线程中直接弹出模式对话框中在debug模式下有时出错(这里的有时的意思是必然会出错,但是不是每次都出错),弹出模式对话框的代码如下:DWORDWINAPIRecvThread(LPVOIDlpParam)//工作线程函数{CAIDlgProductNamedlg;if(dlg.DoModal()==IDOK){……}}错误截图:如果跟踪DoModal函数, 阅读全文
posted @ 2013-11-21 11:04 DoubleLi 阅读(1370) 评论(0) 推荐(0) 编辑

摘要:信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话。在 C/C++ 应用程序开发过程中,动态分配的内存处理不当是最常见的问题。其中,最难捉摸也最难检测的错误之一就是内存泄漏,即未能正确释放以前分配的内存的错误。偶尔发生的少量内存泄漏可能不会引起我们的注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种 各样的征兆:从性能不良(并且逐渐降低)到内存完全耗尽。更糟的是,泄漏的程序可能会用掉太多内存,导致另外一个程序垮掉,而使用户无从查找问题的真正根源。此外,即使 阅读全文
posted @ 2013-11-21 11:02 DoubleLi 阅读(454) 评论(0) 推荐(0) 编辑

摘要:声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法。非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出。对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerf. 阅读全文
posted @ 2013-11-21 11:01 DoubleLi 阅读(1643) 评论(0) 推荐(0) 编辑

摘要:晚上编一个小程序,涉及到如何设置对话框的背景颜色和静态文本颜色。这在VC6.0中本来是一句话就搞定的事。在应用程序类中的InitInstance()函数添加: //设置对话框背景和文本颜色SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));谁知这在VS 2005上竟不起作用,到网上一查,原来SetDialogBkColor函数在VS 2003中就已经不支持了。只得另辟蹊径。另外的办法就是响应WM_CTLCOLOR消息,在消息映射函数中添加:[cpp]view plaincopy HBRUSHCFileSpltDlg::OnCtlColor(CDC*pDC 阅读全文
posted @ 2013-11-21 10:58 DoubleLi 阅读(3250) 评论(0) 推荐(1) 编辑

摘要:在很多系统中出于美观的需要常常要设置背景图片。下面我介绍一种在客户区设置背景图片的简单方法。1.将背景bmp图片导入到工程,资源ID这里假设为IDB_BITMAP12.在视图类添加如下代码:[cpp]view plaincopy voidCSetBkMapView::OnDraw(CDC*pDC){CSetBkMapDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;//TODO:在此处为本机数据添加绘制代码//获取客户区大小CRectrcClient;GetClientRect(&rcClient);CBitmapbmp 阅读全文
posted @ 2013-11-21 10:56 DoubleLi 阅读(635) 评论(0) 推荐(0) 编辑

摘要:开发时有一个工程的一个文件的断点无效,VS 2005提示说当前不会命中断点。源代码与原始版本不同,请在断点选项里设置允许源代码与原始版本不同。这个是针对单个断点进行设置。如果要对所有的断点进行设置,则要在“工具”——〉“选项”——〉“调试”——〉“要求源文件与原始版本完成匹配”去掉勾。 实际上有比这个办法更好的办法,就是将出问题的文件用notepad打开,然后另存为Unicode编码,覆盖原来的文件。 网上另外有一种办法是:通过重新格式化出问题的源文件亦可以解决,即在VS2005中选择 “编辑”——〉“高级”——〉“设置选定内容的格式”。 阅读全文
posted @ 2013-11-21 10:54 DoubleLi 阅读(872) 评论(0) 推荐(0) 编辑

摘要:以前看《Window核心编程》,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。近日接触了ATL的一个很好的字符串的转换宏:A2W和W2A。用法很简单,A2W的用法:[cpp]view plaincopy #includeDoSomething(LPWSTRstr);//函数声明USES_CONVERSION;DoSomething(A2W("SomeString"));W2A的用法:[cpp]view plaincopy #includeDoSomething( 阅读全文
posted @ 2013-11-21 10:53 DoubleLi 阅读(937) 评论(0) 推荐(0) 编辑

摘要:转载地址:http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Import Libary,以下简称"导入库")。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态 阅读全文
posted @ 2013-11-21 10:49 DoubleLi 阅读(446) 评论(0) 推荐(0) 编辑

摘要:DLL的动态链接有两种方法。一种是加载时动态链接(Load_time dynamic linking)。Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。 前天看到这几句,突然设计出一道自认绝妙的笔试题:"如果采用加载时动态链接的方式,Windows搜索要装入的DLL采用怎样的顺序?"这个是基础题,估计你很容易答出(答案就是上面的)。呵呵,我还有后着呢:"你是如何证明Windows搜索要装入的DLL遵循这样的顺序呢,说出你的证明步骤" 你可以思考一 阅读全文
posted @ 2013-11-21 10:47 DoubleLi 阅读(813) 评论(0) 推荐(0) 编辑

摘要:本文阅读基础:有一定的C++基础知识(了解继承、回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解。一. 前言 ActiveX控件和它的容器程序如何通讯是一个值得研究的问题,因为这涉及到ActiveX控件和它的容器程序如何交互的问题。VC知识库的杨老师写了一系列博客介绍了一些通讯方式。链接如下:COM 组件设计与应用(十三)--事件和通知(VC6.0)COM 组件设计与应用(十四)--事件和通知(vc.net)COM 组件设计与应用(十五)--事件和通知(VC6.0)COM 组件设计与应用(十六)--事件和通知(vc.net) 这些文章写得真 阅读全文
posted @ 2013-11-21 10:44 DoubleLi 阅读(2716) 评论(0) 推荐(0) 编辑

摘要:使用VS 2008新建一个MFC ActiveX工程,因为在工程里要用到GDI+。我习惯把初始化GDI+库的代码放在应用程序类的InitInstance函数,对应的销毁代码放在ExitInstance函数。具体如下:先在应用程序类里定义一个数据成员:[cpp]view plaincopy ULONG_PTRm_gdiplusToken;然后添加初始化GDI+库的代码和对应的销毁代码:[cpp]view plaincopy BOOLCImagePreviewXApp::InitInstance(){BOOLbInit=COleControlModule::InitInstance();if(bI 阅读全文
posted @ 2013-11-21 10:41 DoubleLi 阅读(1382) 评论(0) 推荐(0) 编辑

摘要:1、不同线程的处理方法如何在2K/xp下使窗口获取焦点在2K/XP下我们可以用 AttachThreadInput 和SetForegroundWindow来有效的获取焦点。//捕捉并设置当前焦点窗口为我们的窗口AttachThreadInput( GetWindowThreadProcessId( ::GetForegroundWindow(),NULL), GetCurrentThreadId(),TRUE);//置我们的为焦点窗口SetForegroundWindow();SetFocus(); //释放threadAttachThreadInput( G... 阅读全文
posted @ 2013-11-21 10:36 DoubleLi 阅读(930) 评论(0) 推荐(0) 编辑

摘要:转载地址:http://www.cnitblog.com/martin/archive/2006/04/21/9460.html 首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。我们来看看:F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp(54):{86}normalblockat0x00422E80,10byteslong.Data:1F1F1F1F1FCDCDCDCDCDF:/CodeSample/Test/TestPipe/LeakTest/MainF 阅读全文
posted @ 2013-11-21 10:34 DoubleLi 阅读(1445) 评论(0) 推荐(0) 编辑

摘要:基于文档视图结构程序的双缓冲绘图框架比较多,那么如何在对话框上绘图呢?以前通常的做法是拖一个静态文本控件或其它控件当作绘图区域或者在这个区域上创建一个视图出来。看了微软的一个示例程序DrawCli(一个绘图的单文档程序),产生了一些灵感,决心把它移植到对话框绘图上,摸索了一下,搞了一个基于对话框的简单双缓冲绘图框架。 具体代码如下,对话框头文件代码:[cpp]view plaincopy #include//@brief直线结构体structstLine{stLine(CPoint&Begin,CPoint&End){m_Begin=Begin;m_End=End;}//@br 阅读全文
posted @ 2013-11-21 10:32 DoubleLi 阅读(744) 评论(0) 推荐(0) 编辑

摘要:MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图:因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到:MFC Grid control2.27源码下载 MFC Gridcontrol的作者并没有将其封装为DLL,因为在程序的多个模块复用这个控件比较麻烦(需要在多个工程中加入其源码),因此最好将其封装为一个DLL。今天有同事反映在DLL的对话框中无法使用封装好的MFC Grid control,于是上网查了下资料,晚上摸索了一下,解决了这个问题。 MFC Grid control的作者在设计该控件并没考虑到在DLL中使用该控件,因此在其控件类CG 阅读全文
posted @ 2013-11-21 10:29 DoubleLi 阅读(575) 评论(0) 推荐(0) 编辑

摘要:一般而言,在 Windows编程中创建对话框需要先定义一个对话框资源。我想能不能不用资源文件单纯通过代码创建对话框呢?晚上搜索了一些资料,研究了一下,基本实现了。我写了一个KDialog,代码如下(代码中有一些注释,相信大家能基本看懂):头文件的代码:[cpp]view plaincopy //kdialog.h#ifndefKDIALOG_H_INCLUDED#defineKDIALOG_H_INCLUDED#defineID_HELP150#defineID_EDIT180#defineID_TEXT200classKDialog{public:KDialog(HINSTANCEhinst 阅读全文
posted @ 2013-11-21 10:28 DoubleLi 阅读(850) 评论(0) 推荐(0) 编辑

摘要:最近需要一个浮点数编辑框。所谓浮点数编辑框,就是限制输入只在”-1234567890.” 这些字符,其它字符不予输入(用户输错了冒一个气泡进行提示)。本想使用BCG库的CBCGPMaskEdit类,无奈该类允许重复输入小数点,不满足我的需求。于是上网搜了一个,发现是基于VS2010的。VS 2010的编辑框已经实现了自动冒泡提示了。但是我的工程是VS 2005的。于是我设法在VS 2005实现编辑框的冒泡提示。实际上这个也不难,主要是使用Edit_ShowBalloonTip宏。下面是编辑框的主体代码:[cpp]view plaincopy BEGIN_MESSAGE_MAP(CMyFloat 阅读全文
posted @ 2013-11-21 10:22 DoubleLi 阅读(943) 评论(0) 推荐(0) 编辑

摘要:在CodeProject上找到一个动态调整对话框窗口大小的窗口类的资源:Dynamicchild window positioning,我感觉挺好用的。窗口基类是:cdxCDynamicWnd, cdxCDynamicWndEx。假如链接无效之后可以搜下这个。 阅读全文
posted @ 2013-11-21 10:20 DoubleLi 阅读(292) 评论(0) 推荐(0) 编辑

摘要:根据我的实践,在Windows平台下设计并实现一个C++插件系统,需要解决几个关键技术问题。下面我谈谈需要解决的几个关键技术问题以及我想到的简单的解决思路。由于我主要专注于Windows平台C++程序的开发,这里假设以VS为编译环境,MFC界面库来说明。1. 主程序和插件的关系问题 插件架构一般可以用下面的图来表示:(注:此图来自李先静的博客文章:http://blog.csdn.net/absurd/archive/2006/07/04/877063.aspx,略有修改,特向李大侠表示感谢) 一般来说:应用程序框架所完成的功能应为一个软件系统的核心和基础,这些基本功能主要包括一些核心功能,即 阅读全文
posted @ 2013-11-21 10:17 DoubleLi 阅读(1749) 评论(0) 推荐(0) 编辑

摘要:C++编写的桌面软件中传统的App+Dll的架构已经显现出的模块之间的强耦合、维护性差、升级不方便等诸多弊端,为此我进行了一些思考,有兴趣的朋友请看我以前的一个思考片断:《Windows平台下C++插件系统实现的几个关键技术问题及其解决思路》,今天则具体介绍的我的一个具体设计和实现。 我的目标是要去除功能模块的相互依赖,在模块调用必须采用动态加载的办法,但同时各个模块可以进行自由地进行通讯。我的设想大致是这样的:在动态加载各个模块后调用统一接口后生成插件对象,在某个插件对象都能通过标识符找到其它的插件对象,通过统一的接口将数据传给它们。系统架构图如下:系统流程图如下: 大家可以看到,要构建这样 阅读全文
posted @ 2013-11-21 10:16 DoubleLi 阅读(891) 评论(0) 推荐(0) 编辑

摘要:一.《Google C++ 编程风格指南》里的观点 公司在推行编码规范,领导提议基本上使用《Google C++ 编程风格指南》。其中《Google C++ 编程风格指南》对于头文件的包含顺序是这样的:Names and Order of Includeslink ▽Use standard order for readability and to avoid hidden dependencies:C library, C++ library, other libraries' .h, your project's .h.All of a project's head 阅读全文
posted @ 2013-11-21 10:12 DoubleLi 阅读(854) 评论(0) 推荐(0) 编辑

摘要:在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是一套数据库访问C++模板库,全部代码都在otlv4.h头文件中,通过OTL不但可以访问Oracle数据库(使用OCI API),还可以访问DB2,或者使用ODBC连接字符串访问其他数据库。 otl的源码只有一个头文件——otlv4.h。下面以一个例子来说明如何使用otl。[cpp]view plaincopy #defineOTL_ORA10G#includevoidCAboutDlg::OnBnClickedOk(){//TODO:在此添加控件通知处理程序代码o 阅读全文
posted @ 2013-11-21 10:10 DoubleLi 阅读(1426) 评论(0) 推荐(0) 编辑

摘要:C++中防止头文件被多次include 的常见方式有:1) 用#ifndef ... #define ... #endif 宏#ifndef __MYHEADER_H__#define __MYHEADER_H__// Here is my class ...#endif2) 用 #pragma once#pragma once// Here is my class ...建议使用 #pragma once ,原因:1) 代码简洁,维护性比较好。 #pragma once 显然比 #ifndef ... 要简短许多,而且避免了__MYHEADER_H__ 重定义 或者 #endif 包含范围错 阅读全文
posted @ 2013-11-21 10:03 DoubleLi 阅读(372) 评论(0) 推荐(0) 编辑

摘要:开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁。 这篇MSDN文章《Best Practices for Creating DLLs》深入讨论了开发DLL的时候应该注意哪些事项, 非常推荐。简单来说,系统在装载DLL 的时候会自动产生一个Loader Lock, 避免多个DLL同时被装载。 LoaderLock从API函数LoadLibrary调用的开始就自动加锁, 直到DllMain 退出为止。 常见到一些开发者喜欢在DllMain 里面写大量的初始化代码(比如 CoInitializeEx, LoadLibraryEx,C 阅读全文
posted @ 2013-11-21 10:02 DoubleLi 阅读(437) 评论(0) 推荐(0) 编辑

摘要:在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题。AttachThreadInput把一个线程(idAttach)的输入消息连接到另外线程(idAttachTo)。函数定义:BOOL WINAPI AttachThreadInput( __in DWORD idAttach, __in DWORD idAttachTo, __in BOOL fAttach);用法示例:AttachThreadInput( ::GetWindowThreadProcessId 阅读全文
posted @ 2013-11-21 09:58 DoubleLi 阅读(460) 评论(0) 推荐(0) 编辑

摘要:--克服用例图的恐惧在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的。但是却又常常在各种媒体上看见用例图,于是对一种常常出现,自己又不太熟悉的技术,会产生恐惧。如果说对MDA或者CORBA这样的技术产生恐惧还是值得的话,对用例图产生恐惧是非常不值的。因为MDA和CORBA这样的技术也许要花上半年的时间才能够初步了解,而克服用例图恐惧症,则只要不到一天的时间。用例图初感UML是一组图示符号的标准。所谓图示符号,就是一组定义好的图示,它们可以表达定义好的各种意思。用UML进行软件建模,就是用规定好的符号画图, 阅读全文
posted @ 2013-11-21 09:49 DoubleLi 阅读(1473) 评论(0) 推荐(1) 编辑

摘要:例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库、资源和执行程序。代码的压缩包位置是http://www.blogjava.net/Files/wxb_nudt/socket_src.rar。1前言在一些常用的编程技术中,Socket网络编程可以说是最简单的一种。而且Socket编程需要的基础知识很少,适合初学者学习网络编程。目前支持网络传输的技术、语言和工具繁多,但是大部分都是基于Socket开发的,虽说这些“高级”的网络技术屏蔽了大部分底层实现,号称能极大程度的简化开发,而事实上如果你没有一点Socket基础 阅读全文
posted @ 2013-11-21 09:46 DoubleLi 阅读(1720) 评论(0) 推荐(0) 编辑

摘要:在工程计算相关项目中,常常利用Matlab来完成计算、算法、绘图等功能。使用Matlab来完成这些功能非常简单,Matlab提供的m编程语言功能强大,代码量少。为了在自己的C/C++项目中加入这些功能,需要一系列繁琐的过程,令很多人望之却步。主要的困难在于:l如何从m文件生成VC可用的C/C++代码;l如何设置编译参数,在VC中编译这些代码;l如何在C/C++语言中设置输入输出参数,使之与M代码生成的C++代码一同运行;l如何制作包含matlab运行时库的安装程序。下面结合网络上面的资料,对以上问题进行了总结,较好的解决了上面的问题。我使用的相关开发环境如下:Matlaba6.5;VC6;Wi 阅读全文
posted @ 2013-11-21 09:41 DoubleLi 阅读(5653) 评论(0) 推荐(1) 编辑

摘要:关于结构体和C++类的内存地址问题今天终于有时间写点东西了~ 太爽了 *_*很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。类分为成员变量和成员函数,我们先来讨论成员变量。一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题://类的定义class K{public:K(){k = 12;}~K(){}int k;};//类的使用//...K kTem 阅读全文
posted @ 2013-11-21 09:11 DoubleLi 阅读(1495) 评论(0) 推荐(0) 编辑

摘要:动态内存使用最多的是在C++应用程序的代码中。有过编程经验的程序员虽然都知道new操作符的使用一定要与delete匹配,在某些场合仍然可能有内存溢出。当异常被掷出时,程序的正常控制流程被改变,因此导致潜在的内存溢出。例如,void g() //可能掷出{ if (some_condition == false) throw X();}void func() { string * pstr = new string; g(); //如果 g 掷出一个异常,内存溢出 delete pstr; //如果 g 掷出一个异常,则此行为不能达到的代码行。}int main... 阅读全文
posted @ 2013-11-21 09:10 DoubleLi 阅读(676) 评论(0) 推荐(0) 编辑

摘要:在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为: #pragma Para。其中Para 为参数,下面来看一些常用的参数1.message 参数 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器遇到这... 阅读全文
posted @ 2013-11-21 09:08 DoubleLi 阅读(396) 评论(0) 推荐(0) 编辑

摘要:下面的代码是介绍如何在windows平台发消息到非UI线程.主要是'PeekMessage||GetMessage'这两个API的应用.当他们被调用的时候,如果当前线程还没有消息循环,就会创建一个.利用这个特性比自己手动的去创建一个消息循环要方便得多.发消息主要是使用线程PostThreadMessage#include#include#include"cassert"#include"windows.h"#include"process.h"enum{MSG_TEST=WM_USER+100,MSG_EXIT};un 阅读全文
posted @ 2013-11-21 09:05 DoubleLi 阅读(471) 评论(0) 推荐(0) 编辑

摘要:.\\与API函数GetModuleFileName获取应用程序目录有何不一样? 采用.\\也能获得应用程序目录,采用GetModuleFileName也能获得,二者有何不同? 一样!一个是相对路径,一个是绝对路径 .\\是的到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。GetModuleFileName()得到模块的完整路径名,例如,你载入c:\windows\system32\a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。 .\\一般用在包含头文件的语句中。另一个 阅读全文
posted @ 2013-11-21 09:03 DoubleLi 阅读(3906) 评论(0) 推荐(0) 编辑

摘要:一.深入浅出Win32多线程程序设计之基本概念[转]引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。 理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。 因此, 阅读全文
posted @ 2013-11-21 09:02 DoubleLi 阅读(1007) 评论(0) 推荐(0) 编辑

摘要:下载源代码八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种.. 阅读全文
posted @ 2013-11-21 09:01 DoubleLi 阅读(452) 评论(0) 推荐(0) 编辑

摘要:掌握文本文件读写的方法了解二进制文件的读写方法C++文件流:fstream // 文件流ifstream // 输入文件流ofstream // 输出文件流//创建一个文本文件并写入信息//同向屏幕上输出信息一样将信息输出至文件#include#includevoid main(){ ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1)return; //打开文件失败则结束运行 f1>运算符 只能进行文本文件的读写操作,用于二进制文件可能会产生错误。 使用函数成员 get、... 阅读全文
posted @ 2013-11-21 09:00 DoubleLi 阅读(378) 评论(0) 推荐(0) 编辑

摘要:下载源代码一、问题的提出编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //延时6秒} 编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。为了更好地处理这种耗时的操作,我们有必要学习——多线程编程。 二、多线程概述 进程和线... 阅读全文
posted @ 2013-11-21 08:59 DoubleLi 阅读(608) 评论(0) 推荐(0) 编辑

摘要:下载源代码五、MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。 在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用... 阅读全文
posted @ 2013-11-21 08:57 DoubleLi 阅读(552) 评论(0) 推荐(0) 编辑

摘要:下载源代码七、线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传.. 阅读全文
posted @ 2013-11-21 08:55 DoubleLi 阅读(625) 评论(0) 推荐(0) 编辑

摘要:原文作者:Alex Blekhman翻译:朱金灿原文来源:http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx译文来源:http://blog.csdn.net/clever101C++语言毕竟能和Windows DLLs能够和平共处。介绍自从Windows的开始阶段动态链接库(DLL)就是Windows平台的一个组成部分。动态链接库允许在一个独立的模块中封装一系列的功能函数然后以一个显式的C函数列表提供外部使用者使用。在上个世纪80年代,当Windows DLLs面世时,对于广大开发者而言只有C语言是切实可行的开发手段 阅读全文
posted @ 2013-11-20 17:42 DoubleLi 阅读(851) 评论(0) 推荐(0) 编辑

摘要:内存泄漏排查一下本人只是简单的介绍一个实用, 如果读者很感兴趣, 可以查阅msdn自己去深入调查相关的API和原理.API 介绍1. 马上打印泄漏信息:_CrtDumpMemoryLeaks();一般用于局部跟踪内存泄漏问题,使用的方法很简单,你怀疑在某一个时刻有内存泄漏了,就执行这个函数调用,然后在 vs 调试器的 "output" 窗口会马上会打印出当前所有没有释放的内存的申请明细(包括文件名,行号, 第几次内存分配)。双击就可以定位到源文件 内存申请的地方, 很方便.2. 程序结束之前打印泄漏信息:一般用于全局的内存泄漏问题,在程序刚开始的时候就可以用起来。使用方法也 阅读全文
posted @ 2013-11-20 17:38 DoubleLi 阅读(1203) 评论(0) 推荐(0) 编辑

摘要:API各函数作用简介1.控件与消息函数AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWindows 排列一个父窗口的最小化子窗口AttachThreadInput 连接线程输入函数BeginDeferWindowPos 启动构建一系列新窗口位置的过程BringWindowToTop 将指定的窗口带至窗口列表顶部CascadeWindows 以层叠方式排列窗口ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄ClientToScreen 判断窗 阅读全文
posted @ 2013-11-20 17:35 DoubleLi 阅读(1011) 评论(0) 推荐(0) 编辑

摘要:DLL编写教程半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术。例如DLL,COM,Socket,多线程等等。这些技术的特点就是使用广泛,但是误解很多;网上教程很多,但是几乎没有什么优质良品。我以近几个月来的编程经验发现,很有必要好好的总结一下这些编程技术了。一来对自己是总结提高,二来可以方便光顾我博客的朋友。好了,废话少说,言归正传。第一篇就是《DLL编写教程》,为什么起这么土的名字呢?为什么不叫《轻轻松松写DLL》或者《DLL一日通》呢?或者更nb的《深入简出DLL》呢?呵呵,常常上网搜索资料的弟兄自然知道。本文对通用的 阅读全文
posted @ 2013-11-20 17:32 DoubleLi 阅读(13277) 评论(1) 推荐(2) 编辑

摘要:IntroductionThis class is derived from the MFCCDialog. It supports the following features :-If running on Windows 2000 or Windows XP, make any one color transparent so that you can see through regions of the dialogIf running on Windows 2000 or Windows XP, make the whole dialog translucentAdding a bi 阅读全文
posted @ 2013-11-19 17:48 DoubleLi 阅读(521) 评论(0) 推荐(0) 编辑

摘要:IntroductionThis program demonstrates how to useCDHtmlDialogandSetWindowRgnfunctions to give a dialog non-rectangular HTML skins. If you are familiar with HTML, it will be faster than other ways to deal with beautiful skins. The idea comes from the article,"Gimme Some Skin... VideoSkins", 阅读全文
posted @ 2013-11-19 17:36 DoubleLi 阅读(547) 评论(0) 推荐(0) 编辑

摘要:Using SetWindowRgnHomeBack To Tips PageIntroductionThere are lots of interesting reasons for creating odd-shaped windows. This essay explains how to create a window of unusual shape.One of the first questions you should ask is "Why?" There are lots of good reasons for needing to create odd 阅读全文
posted @ 2013-11-19 17:33 DoubleLi 阅读(788) 评论(0) 推荐(0) 编辑

摘要:前一段在一个仿QQ的IM通讯工具中加入屏幕截图以及截图编辑功能,但是测试中发现当连续进行几十次截图后,系统会出现白屏,开始以为和win7经常闪白有关,屏幕截图截取到闪白的瞬间导致白屏,后来发现是GDI内存不足,申请不到GDI内存贴图失败所致。于是找了GDI泄露的工具,对程序进行GDI内存检测,下面就介绍两款GDI泄露检测工具的用法以及GDI编程的一些注意事项。第一款:GDIndicator 支持win7+xp 下载地址1、启动待检测的程序和GDIndicator,启动顺序没有要求,之后F5刷新,就能看到系统中所有进程,和使用的资源数找到想要查看的进程,这里我们的程序是 TPCommonCont 阅读全文
posted @ 2013-11-18 21:04 DoubleLi 阅读(4940) 评论(0) 推荐(0) 编辑

摘要:对开发中常见的内存泄露,GDI泄露进行检测一、GDI泄露检测方法:在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况。注意点:Create出来的GDI对象,都要用DeleteObject来释放;Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放。以下是一些常用到的函数:1、 检查GetWindowDC(), 后面是否有ReleaseDC();2、 检测GetDC();后面是否有ReleaseDC();3、 检测画刷CBrush:CreateSolidBrush()-》 D 阅读全文
posted @ 2013-11-18 21:00 DoubleLi 阅读(2166) 评论(0) 推荐(0) 编辑

摘要:用.Net写的地图编辑器,最近在一个长时间使用的策划手里频繁挂掉。定位到原因应该是GDI泄露。但在几千行代码里手工寻找泄漏点实在是有些困难,直到在网上找到了这个检测GDI泄露的工具GDILeaks。它的强大之处,在于可以将程序里当前占用的gdi位图、dc用图形格式显示出来,这样,泄露点基本上就直接展示在你眼前了。另外,关于泄露为什么会发生,我还有些疑问。经检查,泄漏点是这样的C#代码void doSomeThing(){Bitmap tmpBmp = new Bitmap(100,100);returntransformBmp(tmpBmp); //这里对tmpBmp放大后存到一张新位图上返回 阅读全文
posted @ 2013-11-18 20:58 DoubleLi 阅读(847) 评论(0) 推荐(0) 编辑

摘要:查GDI对象泄露的利器:GDIView可以很详细的查到进程的GDI对象的总个数,详细的GDI对象的个数,以及其增减数量。其GDI对象类型也可以很详细的得知,以及其内存地址,句柄。实在是好使!下载地址:http://www.nirsoft.net/utils/gdi_handles.html中文版32x下载地址:http://www.hanzify.org/software/12680.html 阅读全文
posted @ 2013-11-18 20:44 DoubleLi 阅读(1009) 评论(0) 推荐(0) 编辑

摘要:清除屏幕闪烁(转自网上)由于作图过于复杂和频繁,所以时常出现闪烁的情况,一些防止闪烁的方法,如下:(1)将Invalidate()替换为InvalidateRect()。Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些。不要为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,事实上,如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。(2)禁止系统擦除你的窗口。系统在需要重画窗口的时候会帮你用指定的背景色 阅读全文
posted @ 2013-11-18 17:21 DoubleLi 阅读(6148) 评论(0) 推荐(1) 编辑

摘要:窗口是屏幕上的一个矩形区域。窗口分为3种:重叠窗口、弹出窗口和子窗口。每个窗口都有由系统绘制的“非客户区”和应用程序绘制的“客户区”。在MFC中,CWnd类为各种窗口提供了基类。1通过HWND获得CWnd指针通过HWND获得Cwnd指针可以调用Cwnd::FromHandle函数。12345678voidCDemoDlg::OnButton1() {HWNDhWnd = GetSafeHwnd(); //获得当前窗口的句柄CWnd* pWnd = CWnd::FromHandle(hWnd); //通过HWND获得CWnd指针CString strText = _T("") 阅读全文
posted @ 2013-11-18 12:49 DoubleLi 阅读(504) 评论(0) 推荐(0) 编辑

摘要:英文单词解释clip:夹子、子弹夹、回形针;夹住,修剪sibling:同胞兄弟或姐妹overlapped:重叠这两个Window Stype的特性与异同素来不太清楚,今日作一笔记:MSDN的解释为:WS_CLIPCHILDRENExcludes the area occupied by child windows when you draw within the parent window. Used when you create the parent window.WS_CLIPSIBLINGSClips child windows relative to each other; that 阅读全文
posted @ 2013-11-16 16:15 DoubleLi 阅读(507) 评论(0) 推荐(0) 编辑

摘要:一个View中用到了一个CListCtrl,在OnInitialUpdate函数里面他调用了m_listCtrl.ModifyStyleEx(0, LVS_EX_FULLROWSELECT);但是结果是并没有改变View中这个ListCtrl的效果。 仔细的查阅了MSDN的关于ModifyStyleEx的说明,发现没什么可以的地方,调试几遍发现也没异常,最后在网上一搜索ModifyStyleEx,结果发现碰到这个问题的朋友还真不少,有一遍关于ModifyStyle和ModifyStyleEx无法改变样式的解决方法的文章被转载得到处都是,不仅感慨现在的互联网信息重复程度~~结果看完文章很失望,他 阅读全文
posted @ 2013-11-16 15:55 DoubleLi 阅读(3323) 评论(0) 推荐(0) 编辑

摘要:动态子类化CComboBox以得到子控件EDIT及LISTBOXJoise.LI写于2004-4-6ComboBox是比较常用的一个控件,有三种样式:CBS_SIMPLE(简单),CBS_DROPDOWN(下拉),CBS_DROPDOWNLIST(下拉列表),其中下拉列表样式是不允许输入的,简单样式是永远都显示下拉框的。ComboBox是由一个ListBox和一个Edit框组合而成。本文将以限制只能输入电话号码为例介绍子类化过程得到Edit框(类似的可以得到ListBox)。电话号码只能有数字和“-”和“+”组成,经查ASCII表,知道对应的ASCII值为48-57及45和43共12个值。好, 阅读全文
posted @ 2013-11-16 15:39 DoubleLi 阅读(783) 评论(0) 推荐(0) 编辑

摘要:通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与旧文本重叠的现象。 可以通过以下方式使Static控件文本在透明状态下改变时不会产生文本重叠问题: 1、由于Static控件的背景已经是透明的了,那么旧文本应该是画在Static控件的父窗口上的。 2、在给Static控件设置新文本之后(不是之前!)刷新父窗口即可。例如: GetDlgItem(IDC_STATIC_TEST)->SetWindowText(_T("北京2008&q 阅读全文
posted @ 2013-11-15 20:22 DoubleLi 阅读(4132) 评论(0) 推荐(0) 编辑

摘要:动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。 一、创建动态控件: 为了对照,我们先来看一下静态控件的创建。 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。 静态控件不需要调用Create()函数来创建。 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程: 1.建立控件ID号: ID号是控件的标识,创建控件前必须先为它设置一个ID号。 打开资源中的“St... 阅读全文
posted @ 2013-11-15 19:58 DoubleLi 阅读(1180) 评论(0) 推荐(0) 编辑

摘要:下列附有VS2008发布程序介绍:vc2008程序发布指南2008-05-0317:46vc2008开发的程序的发布方式可以有5种方式:1.采用静态链接到crt和MFC.只要你拥有组成程序的所有源代码,你就可以采用这种方式,这种方式除了程序变大一点,好处多多:1)不必重新发布vc2008基础库vcredist_x86.exe(安装到WinSxS).2)不必产生,嵌入manifest.3)也不把vc2008基础库放在程序所在目录.2.exe(嵌入manifest)+vcredist_x86.exe确保程序正确产生并嵌入manifest文件,然后把程序和vcredist_x86.exe一起发布.用 阅读全文
posted @ 2013-11-13 22:19 DoubleLi 阅读(1438) 评论(0) 推荐(0) 编辑

摘要:在VC++2008的项目中,如何显示地指定要使用的C++库的版本?开发环境:VS2008 SP1 +Win2003 SP2 因为我的VS2008安装了SP1补丁,所以有了9.0.30729.1的MFC库文件(MFC90.DLL MSVCR90.DLL)。新建了一个MFC应用程序,编译为RELEASE版本,叫做“test1.exe”,可以从程序中的清单文件(manifest)看到以下内容:XML code... ... 说明本程序需要... 阅读全文
posted @ 2013-11-13 22:06 DoubleLi 阅读(7081) 评论(0) 推荐(0) 编辑

摘要:目录:1.Win32项目的windows窗体程序的向导生成了如下代码2.手工生成代码如下3.当消息队列中没有消息需要处理,我们可以利用这段时间处理我们自己的任务1.Win32项目的windows窗体程序的向导生成了如下代码:[cpp]view plaincopy //Timer.cpp:定义应用程序的入口点。//#include"stdafx.h"#include"Timer.h"#defineMAX_LOADSTRING100//全局变量:HINSTANCEhInst;//当前实例TCHARszTitle[MAX_LOADSTRING];//标题栏文本 阅读全文
posted @ 2013-11-11 11:21 DoubleLi 阅读(4946) 评论(0) 推荐(0) 编辑

摘要:一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的。这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么给人的视觉感受就是,先看到只有背景色的图像,然后看到画上内容的图像,这样就会感觉闪烁了。解决方法:尽量快的输出图像,使输出在一个刷新 阅读全文
posted @ 2013-11-06 14:14 DoubleLi 阅读(1470) 评论(0) 推荐(0) 编辑

摘要:本文讨论的重点介于两者 之间 — 公共控件赋予您想要的大部分功能,但控件的外观并不是您想要的。例如,列表视图控件提供在许多视图风格中显示数据列表的方式 — 小图标、大图标、列表和详细列表(报告)。然而,如果您想要一个网格控件,那结果怎样呢?尽管公共控件库里没有特别包含网格,但是列表视图控件与它较为接 近,它以行和列显示数据,并有一个相关的标头控件。因此,许多人以一个标准的列表视图控件为起点创建自己的网格控件,然后重写该控件及其子项的呈现方式或 绘制方式。主宰绘图操作即使“只”进行绘制,您仍然有至少四种选项可用,它们都具有鲜明的优缺点:• 处理 WM_PAINT• 所有者绘制• 自定义绘制• 处 阅读全文
posted @ 2013-11-06 14:11 DoubleLi 阅读(1433) 评论(0) 推荐(0) 编辑

摘要:oid CMainFrame::OnLButtonDown(UINT nFlags, CPoint point){ if (!IsZoomed() && !IsIconic()) { SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); } CUIWnd::OnLButtonDown(nFlags, point);} 阅读全文
posted @ 2013-11-06 14:09 DoubleLi 阅读(373) 评论(0) 推荐(0) 编辑

摘要:一. GDI编程基础字幕叠加,应当是属于图形、图像处理的范畴。在Windows平台上,图形、图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口)。GDI是什么?GDI其实是一套API函数;它们功能丰富,使用起来简单、灵活。下面,我们首先来介绍一些GDI编程的基础知识。 GDI函数有很多,我们大致可以把它们分成如下几类: · 设备上下文(Device Context,简称DC)函数,如GetDC、CreateDC、DeleteDC等; · 画线函数,如LineTo、Polyline、Arc等; · 填充画图函数,如Elli 阅读全文
posted @ 2013-11-06 13:54 DoubleLi 阅读(932) 评论(0) 推荐(0) 编辑

摘要:原帖地址:http://blog.joycode.com/yaodong/archive/2004/11/26/39764.aspx一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的。这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么 阅读全文
posted @ 2013-11-06 13:46 DoubleLi 阅读(780) 评论(0) 推荐(0) 编辑

摘要:一、什么是虚拟列表控件虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。二、为什么使用虚拟列表控件我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件自己开辟了内存空间来保存这些数据。现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录。通常有两种方法解决这个问题:1是仅仅在 ListCtrl中插入少量的数据,比如100个,然后通过[上一页][下一页]两个按钮进行控制,某一时刻显示的只是从xxx到xxx+100之间的记录。2是把所有数据全部插入到ListCtrl中,然后让用户通过 阅读全文
posted @ 2013-11-06 13:42 DoubleLi 阅读(730) 评论(0) 推荐(0) 编辑

摘要:一.引言上一篇我们讲了如何使用VC 2005来开发MFC ActiveX控件,我们开发ActiveX控件最终目的是将ActiveX控件发布出来并嵌入在Web网页中,随着控件的版本更新自动在客户端浏览器自动更新。这一篇我们就来讲讲这方面的实现。使用工具:PackageForTheWeb二.编译ActiveX控件在发布之前我们最好用VS2005将控件编译成“Release”版本,还有一个值得注意的地方是我们在使用MFC类库来开发ActiveX控件时要考虑客户端是否有MFC类库,解决方法有两种:1.在下面打包的时候将MFC的类库DLL附带上。2.通过“项目”—》“属性”打开项目属性对话框,将“MFC 阅读全文
posted @ 2013-11-06 09:50 DoubleLi 阅读(1697) 评论(0) 推荐(0) 编辑

摘要:包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似 TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有 透明区域位图的方法。一、TransparentBlt 函数的使用TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用 阅读全文
posted @ 2013-11-06 09:44 DoubleLi 阅读(443) 评论(0) 推荐(0) 编辑

摘要:由于项目中要实现子窗口的透明的功能,在网上找到了这一段提示:子窗口的透明和主窗口完全不同, 主窗口是通过layeredwindow实现的, 而子窗口则必须自己实现, 尤其是半透明, 必须自己对获取的透明背景图进行操作。 要实现子窗口的透明需要做到下面几步:1. windows的ExStyle中需要包含WS_EX_TRANSPARENT属性2. windows的Style中要去掉WS_CLIPSIBLING属性3. 对继承自windows标准控件的子窗口( 比如edit, scrollbar等等 ), 需要截获WM_CTLCOLORxxx消息并返回一个style为BS_HOLLOW的brush的 阅读全文
posted @ 2013-11-06 09:42 DoubleLi 阅读(1057) 评论(0) 推荐(0) 编辑

摘要:使用内存DC绘图,然后实现双缓冲,避免绘图闪烁,这个小技术简单但很有效。但是仍然有很多人说使用了双缓冲,图片却仍然有闪烁,分析了几个这样的例子,发现其实不是双缓冲的技术问题,而是使用者没有正确理解和使用双缓冲的方法。使用双缓冲要点如下:1. 保证绘图过程中的所有CDC及其继承类指向内存DC。在窗口或者视图中绘图,一般都是在OnDraw或者OnPaint事件中,但是有时根据需要绘图是通过调用其他类及函数完成比较复杂的绘制,在这些函数中,有时编写者会获取诸如CClientDC,然后绘图,此时的任何动作都会绕过缓冲区直接绘制到屏幕,从而造成闪烁。正确的做法是检查并修改所有绘图过程函数,避免直接获取C 阅读全文
posted @ 2013-11-04 12:48 DoubleLi 阅读(786) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示