C/C++
文章平均质量分 90
gaoxiaowei
希音不闻,进即是退,大器晚成。任何程序都有漏洞
展开
-
VC位图文件的保存与转换
<br />1:写位图文件函数:<br />BOOL Write2Bitmap(BYTE *pData,CString filename,int width,int height,int bitcount) { FILE *fe; int i; int index = 0; unsigned char rgbquad[4]; BITMAPFILEHEADER bitmapFileHeader; BITMAPINFOHEADER bitmapInfoHeader;原创 2010-07-27 14:53:00 · 1375 阅读 · 0 评论 -
static_cast
static_cast 用法:static_cast ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类表示)时,由于转载 2008-09-19 15:10:00 · 694 阅读 · 0 评论 -
如何使用SetTimer MFC
Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。 1、SetTimer定义在那里? SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事转载 2008-09-05 17:41:00 · 1374 阅读 · 0 评论 -
C++基础--构造函数与析构函数
C++基础--构造函数与析构函数在C++中,有两种特殊的成员函数,即是构造函数和析构函数,下面分别予以介绍。10.2.1 构造函数 变量应该被初始化,我们已经知道了简单变量的初始化、数组的初始化、结构和结构数组的初始化。对象也需要初始化,应该怎样初始化一个对象呢? C++中定义了一种特殊的初始化函数,称之为构造函数。当对象被创建时,构造函数自动被调用。构造函数有转载 2008-09-02 14:52:00 · 950 阅读 · 0 评论 -
C++基础--条件编译
条件编译件编译命令可以使得编译器按不同的条件去编译程序不同的部分,产生不同的目标代码文件。也就是说,通过条件编译命令,某些程序代码要在满足一定条件下才被编译,否则将不被编译。 常用的条件编译命令有如下三种格式: 9.3.1 格式一 #ifdef 标识符 程序段1 #else 程序段2 #endif 其中,ifdef、else和endif都是关键字。程序段1和 程序段2转载 2008-09-02 14:49:00 · 987 阅读 · 0 评论 -
C++基础--类的作用域
我们已经学习了局部作用域和全局作用域,下面介绍类作用域,所有的类成员是属于类作用域的。 类本身可被定义在三种作用域内: 1. 全局作用域。这是所谓全局类,绝大多数的C++类是定义在该作用域中,我们在前面定义的所有类都是在全局作用域中。 2. 在另一个类的作用域中。这是所谓嵌套类,即一个类包含在另一个类中。 3. 在一个块的局部作用域中。这是所谓局部类,该类完全被块包含转载 2008-09-02 14:48:00 · 1286 阅读 · 0 评论 -
C++基础--基类和派生类
C++基础--基类和派生类 (1)继承的定义及工作方式继承的一般形式如下: class 派生类:访问权限 基类 { … } 如果需要,派生类可以从多个基类继承,也就是多重继承,这将在后面章节中讲解。通过继承,派生类自动得到了除基类私有成员以外的其它所有数据成员和成员函数,在派生类中可以直接访问,从而实现了代码的复用。 从概念上讲,转载 2008-09-02 14:42:00 · 2111 阅读 · 0 评论 -
C++模板
C++模版(一) 简介 只有使用C++语言的少数用户才努力尝试去理解模板的基本原理。然而那些希望去探索更多高级用法的人往往发现自己需要努力去理解模板是如何被语言所支持的,因为缺乏明确的说明。一个很大的问题在于一些工具只实现了C++标准的一个子集。本文将指出它们共同的缺陷并深入剖析如何使用C++模板快速产生可重用和高效的代码。模板功能应原创 2008-09-02 14:39:00 · 547 阅读 · 0 评论 -
如何判断文件是否存在?
如何判断文件是否存在?#include #include bool FileExist(const char* FileName){ struct stat my_stat; return (stat(FileName, &my_stat) == 0);}bool IsDirectory(const char* FileName){ struct stat my_stat转载 2008-09-02 14:38:00 · 718 阅读 · 0 评论 -
Visual C++线程同步技术剖析 (转载)
摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。关键词: VC++6.0; 线程同步;临界区;事件;互斥;信号量; 正文 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任转载 2008-09-02 14:31:00 · 361 阅读 · 0 评论 -
C++基础--静态成员
C++基础--静态成员(1) 前面我们已经看到:每一个类对象有其公有或私有的数据成员,每一个public或private函数可以访问其数据成员。有时,可能需要一个或多个公共的数据成员,能够被类的所有对象共享。在C++中,我们可以定义静态(static)的数据成员和成员函数。10.6.1 静态数据成员 要定义静态数据成员,只要在数据成员的定义前转载 2008-09-02 14:46:00 · 2008 阅读 · 2 评论 -
GetActiveWindow与GetForegroundWindow的区别
GetActiveWindow() 是你的程序的当前激活的窗口。 GetForegroundWindow() 是整个Windows系统的当前激活的窗口。 VC关于获得窗体标题的具体做法CString str; HWND pWnd =::GetForegroundWindow(); ::GetWindowText(原创 2008-09-02 14:35:00 · 1970 阅读 · 0 评论 -
C++基础--内联函数
内联函数函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频原创 2008-09-02 14:51:00 · 7045 阅读 · 4 评论 -
C++基础--文件流
利用文件流操作打开一个文件,只需要建立一个对象,它的构造函数负责打开文件,当该对象生存期结束时,它会调用析构函数关闭文件。当然,我们也可以调用成员函数open()和close()进行文件的打开和关闭,下面这个例子说明了如何用文件流进行文件操作。 文件流类其实是输入输出流类的一部分,由于在实际中,会经常用到文件操作,所以我们把文件流类再单独介绍。一、打开文件 用文件流打开文原创 2008-09-02 14:45:00 · 771 阅读 · 0 评论 -
C++基础--输入输出流类
C++基础--输入输出流类1 输入输出流类层次 iostream是一组C++类,用于实现面向对象模型的输入输出,可以提供无缓冲的(低级)和缓冲的I/O操作。在某些情况下,如果C++编译器提供的iostream库中没有合适的输入输出函数可用,我们还可以利用类的继承和多态特性来改进它们,左图给出了I/O流类之间的继承关系。图12-1原创 2008-09-02 14:44:00 · 1640 阅读 · 0 评论 -
C++基础--抽象类
下面,我们举一个完整的例子: 例11-22#include class CPolygon { protected: int width, height;public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0;};转载 2008-09-02 14:43:00 · 880 阅读 · 0 评论 -
c++友元
C++基础--友元我们知道:类的公有成员能够在类外访问,私有的成员只能被类的其它成员函数访问。在C++中,可以定义友元,如果某一个函数定义为类的友元,则该函数就可以访问该类的私有成员,下面举例说明友元函数的使用。假定我们已经定义了两个集合类变量,一个为整型数集合,另一个为实型数集合:程序段10-7class IntSet {pu转载 2008-09-02 14:41:00 · 1492 阅读 · 0 评论 -
GetOpenFileName
当用户想选择打开以前保存的文件时,就需要使用到选择文件对话框。其实在Windows的API里已经有这样完美的对话,只需要简单的调用,就可以使用了,而不需要写一大堆其它的代码。下面就来演示一下怎么使用文件选择对话框。 函数GetOpenFileName声明如下: WINCOMMDLGAPI BOOL APIENTRY GetOpenFileNameA(LPOPENFILEN转载 2008-09-02 14:33:00 · 971 阅读 · 0 评论 -
MFC中CCOMBOX组合框的使用
MFC中CCOMBOX组合框的使用如何在MFC中使用CCOMBOX组合框?下面将用一个例子介绍CCOMBOX组合框控件常用的方法。首先我们新建一个single类型的mfc.exe工程,在菜单栏中添加一个菜单项,如“CCOMBOX组合框”,双击后可以在里面添加相关事件。插入一个Dialog对话框,并添加一个类CDlgCombox,上面添加2个组合框,7个按钮。详细代码如下转载 2008-09-19 15:13:00 · 4808 阅读 · 0 评论 -
如何屏蔽控制台应用程序的窗口?
如何屏蔽控制台应用程序的窗口? 众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种方法。 操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。在VC转载 2008-09-19 15:04:00 · 640 阅读 · 0 评论 -
CreateFileMapping 函数
内存映射API函数CreateFileMapping创建一个有名的共享内存:HANDLE CreateFileMapping(HANDLE hFile, // 映射文件的句柄,转载 2008-09-19 15:08:00 · 1203 阅读 · 0 评论 -
复制位图到剪贴板
<br /><br />复制一幅位图到剪贴板相当简单,需要记住的一个是如果位图需要调色盘,<br />你应当将调色盘也复制。<br />函数一:复制设备相关位图到剪贴板CopyBitmapToClipboard()函数复制一幅DDB位图到剪贴板,如果提供调色盘它将同时复制调色盘。注意在最后调用Detach()。这一点很重要,因为此时GDI对象的物主已经传送至剪贴板。// CopyBitmapToClipboard - Copies a device-dependent bitmap原创 2010-07-15 15:38:00 · 3040 阅读 · 0 评论 -
SetThreadAffinityMask详解
SetThreadAffinityMask详解转载 2010-07-15 11:27:00 · 8068 阅读 · 0 评论 -
如何使用多媒体定时器
如何使用多媒体定时器转载 2010-07-15 11:23:00 · 2668 阅读 · 0 评论 -
MFC的对话框中怎样加入背景音乐
MFC的对话框中怎样加入背景音乐原创 2010-07-15 11:21:00 · 3571 阅读 · 2 评论 -
如何使EditBox支持拖拽
<br />1:封装CDrapFileEdit类使其派生于CEdit类 。<br />2:添加WM_DROPFILES消息<br />3:编辑OnDropFiles 添加代码如下:void CDragFileEdit::OnDropFiles(HDROP hDropInfo) { // TODO: Add your message handler code here and/or call default int fcount = ::DragQueryFile(hDropInfo,原创 2010-07-15 10:00:00 · 931 阅读 · 0 评论 -
WaitForMultipleObjects使用详解
DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in the handle array CONST HANDLE *lpHandles, // pointer to the object-handle array BOOL fWaitAll, // wait flag DWORD dwMilliseconds // time-out in转载 2010-07-15 09:24:00 · 902 阅读 · 0 评论 -
利用CImage完成图片的显示、拷贝、绘制及转换图片格式
利用CImage完成图片的显示、拷贝、绘制及转换图片格式转载 2010-07-15 15:41:00 · 1204 阅读 · 0 评论 -
PulseEvent使用说明
PulseEvent使用说明转载 2010-07-15 11:33:00 · 4257 阅读 · 2 评论 -
OnKickIdle使用详解
OnKickIdle使用详解转载 2010-07-15 11:16:00 · 3338 阅读 · 1 评论 -
PostQueuedCompletionStatus详解
<br />PostQueuedCompletionStatus函数,向每个工作者线程都发送—个特殊的完成数据包。该函数会指示每个线程都“立即结束并退出”.下面是PostQueuedCompletionStatus函数的定义: <br />BOOL PostQueuedCompletionStatus( <br /> HANDLE CompletlonPort, <br /> DW0RD dwNumberOfBytesTrlansferred, <br /> DWORD dwCompl原创 2010-06-29 14:52:00 · 8222 阅读 · 1 评论 -
栈内存管理
21.2 栈内存管理<br />栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。在执行函数时,函数内局部变量的存储单元都能够在栈上创建,函数执行结束时这些存储单元会自动被释放。21.2.1 申请栈内存<br />栈内存有两种实现方法,一种是由系统根据需要自动分配,程序不能控制,另一种是用堆来模拟栈的操作。下面通过两个例子来看一下栈空间是如何分配的。<br />【示例21-2】 函数f是递归函数,当从第n层进入第n+1层时就需要在栈上存储现场。<br />int fun(int x转载 2010-06-29 14:31:00 · 1105 阅读 · 0 评论 -
InterlockedIncrement和InterlockedDecrement的妙用
view plaincopy to clipboardprint?class A { protected: static long m_nRef; public: //类A的构造函数 A() { if(1 == InterlockedIncrement(&m_nRef)) { //以下代码只执行一次 WSADATA wsaData;转载 2010-06-29 14:50:00 · 805 阅读 · 0 评论 -
在主线程中慎用WaitForSingleObject (WaitForMultipleObjects) --代替方法:MsgWaitForMultipleObjects
<br /><br /> 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)<br />下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?<br /><br />线程函数:DWORD WINAPI ThreadProc(<br /> while(!bTerminate)<br /> {<br /> // 从一个链表中读取信息并且插入到CListCtrl中<br /> // CListCtrl的句柄是通过线转载 2010-06-29 14:44:00 · 1333 阅读 · 0 评论 -
VC中使用系统提供的线程池
<br /> 在项目里经常用到多线程,大量的客户向服务器提出请求,这时需要开辟线程来响应客户请求,由于客户量是不可预知的,难道来一个客户请求就新开个线程来响应吗?答案是否定的,要知道开辟和撤消线程是需要耗费相当多时间和资源的,于是前辈们弄出了很多模型出来解决这种问题,其中使用线程池(Thread Pooling)是个很好的主意。线程池在Windows2000及其以后版本得到了很好的支持。使用系统提供的线程池机制相当方便而且很有效率。我们仅需要关注于我们的回调函数即可。我们可以自己来实现线程池机制,但是与我转载 2010-06-29 14:49:00 · 612 阅读 · 0 评论 -
gsoap使用心得!
<br />一 gSOAP需要的头文件:<br /><br />//gsoap ns service name: calc<br />//gsoap ns service style: rpc<br />//gsoap ns service encoding: encoded<br />//gsoap ns service namespace: http://127.0.0.1:8089/calc.wsdl<br />//gsoap ns service location: http://127.0.0.1转载 2010-06-29 14:40:00 · 1158 阅读 · 0 评论 -
std::fstream在VC2003.net中的使用问题
<br />在支持MFC的Win32控制台工程中一般有如下宏<br />#ifdef _DEBUG<br />#define new DEBUG_NEW<br />#endif<br /> 定义了该宏会导致include fstream头文件失败,如下:<br />d:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/include/fstream(465) : error C2061: syntax error : identifier '_Debu转载 2010-06-29 14:39:00 · 762 阅读 · 0 评论 -
用Sleep或WaitForSingleObject实现线程的休眠
<br /> Sleep函数可以实现这个功能:<br /> Sleep( DWORD dwMilliseconds );<br /> 其中dwMillisenconds为要休眠的毫秒数,当dwMillisenconds为0时,CPU将把时间切片转给优先级较高的进程。<br /> 但Sleep函数有个不好的地方,你不能让它在中途停下来,如果我们要让蜘蛛在两个链接点之间的休眠10秒(10000毫秒)或者更长,而期间又想控制蜘蛛停止工作,会造成界面出现死机状态,因此Sleep函数只适合很短转载 2010-06-29 14:42:00 · 1649 阅读 · 0 评论 -
pragma用法
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。 #pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。 依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #pragma para原创 2008-09-02 14:27:00 · 552 阅读 · 0 评论 -
深入C++的new
深入C++的new"new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。 new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会转载 2008-09-02 14:23:00 · 614 阅读 · 0 评论