随笔分类 - C/C++
摘要:关于窗口重画的初级问题初初级问题:我在视图画的图象或者文字,当窗口改变后(包括最小化后还原,被别的窗口挡住后重新显示等)为什么不见了?这 就是窗口重绘或者说重画的问题。当窗口改变后,会产生无效区域,这个无效的区域需要重画。什么是无效区域?自己到网上搜索或者看相关资料。我这里给出一个 特殊的解释:以最小化后还原为例,假设只有一个程序在运行,窗口最小化时显示计算机桌面,并不妨假设桌面是蓝色的背景,当窗口还原时,窗口所占的这一块区 域该显示些什么东西呢?操作系统并不知道,因此,就形成一块无效区域。要是我们告诉操作系统,显示一个红方块,于是它就显示一个红方块,我们的程序过一会 想显示一个绿方块呢?同样
阅读全文
摘要:前言:我一直对DLL技术充满好奇,一方面是因为我对DLL的导入/导出机制还不是特别的了解,另一面是因为我发现:DLL技术在Windows平台下占有重要的地位,几乎所有的Win32 API都是以导出函数的形式存放于不同的DLL文件中,在DLL方面的学习是任何一个想深入研究Windows内部机制的Windows程序员都不可能回避的事实。我在查阅了大量的文章后,对DLL技术有了一定的了解,所以我写了这篇文章来总结和整理我的思路,也为以后深入的学习提供宝贵的资料。对于如何制作DLL,网上有很多资料,我这里就不多罗嗦了。现在假设我们已经成功生成了一个Win32 DLL,这个DLL的名字是DLLInDep
阅读全文
摘要:这个是三部曲中我认为最难的,并不是说程序有多么难,只是想到这个切分方式真的不容易,今天就把这三部曲的最后一曲分享给大家,也为互联网做一点贡献。首先说一下程序的思想,为分割窗口层专门独立创建一个基于CFrameWnd的类,然后在这里面写分割视图的代码,再与其他未分割的视图类进行切换。下面我们来看一下实现的过程:1、创建一个基于CFrameWnd的派生类CSplitterFrame;2、添加要填充分割窗口的视图类和与分割视图切换的视图类;3、为这个派生类重载OnCreateClient函数,构造分割视图m_Splitter.CreateStatic(this,1,2);m_Splitter.Cre
阅读全文
摘要:stdafx全称Standard Application Fram Extend。没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。 Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示: 1. AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要MFCinclude 文件...
阅读全文
摘要:添加的函数:1HACCELhAccel;2hAccel=LoadAccelerators(AfxGetresourceHandle(),MAKEINRESOURCE(IDR_ACCELERATOR1));34BOOLCtestDlg::PreTanslateMessage(MSG*pMsg)5{6if(WM_KEYFIRSTmessage&&pMsg->messagemessage >= WM_KEYFIRST && pMsg->message message && pMsg->message <= WM_KEYLA
阅读全文
摘要:一、坐标空间1、Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转,斜切或者反射。2、Win32API把世界坐标系空间和页面空间称为逻辑空间,最后一种坐标空间(即物理设备空间)通常指应用程序窗口的客户区。但是它也包括整个桌面、完整的窗口(包括框架、标题栏和菜单栏)或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机或绘图仪所设置的尺寸而变化。二、转换1、如要在物理设备上绘制输出,Windows把一个矩形区域从一个坐标空间拷贝到(或映射到)另一个坐标空间,直至最终完整的输出呈现在物理设备上
阅读全文
摘要:应该说 窗口坐标 是相对于 视口坐标 而言 逻辑坐标 是相对于 设备坐标 而言补充: 窗口坐标是基于逻辑坐标的. 视口坐标是基于设备坐标. 上面这两话是抄自百度百科的,我的理解是: 窗口坐标的单位长度与逻辑坐标的单位长度相同,也就是说,当你在窗口坐标上画图时,传递给画图函数的参数的单位是逻辑单位。但是当windows把图形输出到屏幕上时,并不是直接把图形按照它在窗口坐标上的位置输出到屏幕上的,而是先把它在窗口坐标上的值转换成视口坐标上的值(与此同时,也把逻辑坐标按照不同的映射模式转换成设备坐标)。下面举例说明: 由于 一般情况下,窗口原点是与视口原点相同的,(也就是说,位于屏幕上的同一个位置)
阅读全文
摘要:说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型; 二是特化为引用,指针类型;三是特化为另外一个类模板。这里用一个简单的例子来说明这三种情况://generalversiontemplateclassCompare{public:staticboolIsEqual(constT&lh,constT&rh){returnlh==rh;}};这是一个用于比较的类模板,里面可以有多种用于比较的函数, 以IsEqual为例。一、特化为绝对类型也就是说直接为某个
阅读全文
摘要:在构造函数中,想知道这个类是否按期望那样是否构造成功,很多人是喜欢在构造失败情况下抛出一些异常。例:class A1{public:A1(){pI = new int;cout << "A1()" << endl; // something error;throw("A1 error");}~A1(){delete pI;cout << "~A1()" << endl;}private:int *pI;};int _tmain(int argc, _TCHAR* argv[]){A1 *
阅读全文
摘要:C++ 用异常使得可以将正常执行代码和出错处理区别开来。 比如一个栈,其为空时,调用其一个pop 函数,接下来怎么办? 栈本身并不知道该如何处理,需要通知给其调用者(caller),因为只有调用者清楚接下来该怎么做。 异常,就提供了一个很好机制。 但是异常需要操作系统,编译器,RTTI的特性支持。下面围绕一个问题 “为什么析构函数不能抛出异常?” 展开C++中异常的实现。Effective C++ 里面有一条”别让异常逃离析构函数“,大意说是Don't do that, otherwise the behavior is undefined. 这里讨论一下从异常的实现角度,讨论一下为什
阅读全文
摘要:智 能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是 使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少.
阅读全文
摘要:一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、 boost::shared_ptr、boost::scoped_array、boost::shared_array、 boost::weak_ptr、boost:: intrusive_ptr。你可能会想,如此多的智能指针就为了解
阅读全文
摘要:auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包 的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使 用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个小小的auto_ptr所蕴含的价 值与理念。 auto_ptr的出现,主要是为了解决“被异常抛出时发生资源泄漏”的问题。即如果我们让资源在局部对象构造时分配,在局部对象析构时释放。这样即使在函数.
阅读全文
摘要:C++中指针申请和释放内存通常采用的方式是new和delete。然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存。下面简单说一下用法。[cpp] view plaincopy用法一:std::auto_ptrm_example(newMyClass());用法二:std::auto_ptrm_example;m_example.reset(newMyClass());用法三(指针的赋值操作):std::auto_ptrm_example1(newMyClass());std::auto_ptrm_example2(newMyClass());m_e
阅读全文
摘要:1、每个类必须有一个构造函数,否则没法创建对象; 2、若programer没有提供任何构造函数,则C++提供一个默认的构造函数,该默认构造函数是无参构造函数,它仅负责创建对象,不做任何初始化的工作; 3、只要programer定义了一个构造函数(不管是无参还是有参构造),C++就不再提供默认的默认构造函数。即如果为类定义了一个带参的构造函数,还想要无参构造函数,就必须自己定义; 4、与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则,对象值是随机的。 注:2所述,C++在某些情况下会提供默认构造函数,但在某些情况下并不会自动调用。 实事上,当
阅读全文
摘要:#include "stdafx.h"#include "stdio.h"/* 冒泡排序日期:2013月8月18IDE:VC6.0*/void Sort(int arr[],int n){ int tmp; for(int i=0; i<n; i++) { for(int j=1; j<n-i; j++) { if ( arr[j] < arr[j-1] ) { tmp = arr[j-1]; arr[j-1] = arr[j]; ...
阅读全文
摘要:C++局部类和嵌套类的区别 局部类 在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。下面是一个局部类的例子。 inta; voidfun() { staticints; classA { public: voidinit(inti){s=i;} }; Am; m.init(10); }局部类的另一个用途是用来实现类型转化,如下代码:cl...
阅读全文
浙公网安备 33010602011771号