首页

小技巧:使用对象机制实现组件初始化及销毁  

问题 最近在对一份代码进行重构的时候,发现在特殊情况下,组件的销毁接口会因为程序的异常而得不到调用,这个虽然不是什么大问题(整个程序都出现异常了,进程退出是即将发生的事情),但是对于有点完美主义的我来说,这个的的确确的,降低了程序的异常安全性。 解决方法 我们先来看下面一张图,它描述了程序改造之前的交互场景: 在上图中,我们在CWinApp对象的InitInstance中调用了组件的Init接口...

实战经验:给应用程序添加代码签名  

问题 在一次开发过程中,碰到了这样一个问题:应用程序在VS2010中已经启用了”需要管理员权限”,但是当UAC提示框出现时,应用程序因为Windows安全机制的限制,无法访问UAC,也即应用程序无法使用SendInput来模拟鼠标和键盘操作。经过一番研究,发现应用程序需要做如下的配置,才能实现UAC界面的访问: 1) 强制应用程序以管理员权限启动,这个可以在VS2010中设...

实战经验:使用CFileDialog实现多个文件选择  

问题 最近需要实现文件选择的功能,要求是需要弹出系统标准的文件选择对话框,另外,允许用户选择多个文件。 解决方法 MFC中有一个类CFileDialog就是用来做这件事的,而且功能还挺丰富,今天只是使用它的一小部分特性。 直接上代码 以下代码实现了一个方法,该方法弹出文件选择对话框,允许用户选择多个文件,让点击确定时,以列表的形式,返回用户选择的所有文件。 vector<CString&...

实战经验:CRichEditCtrl插入图片(不止是位图)

问题 在一次功能开发中,我希望可以在CRichEditCtrl控件中插入一些图片,这些图片可能是位图(bmp),也可能是其他格式(jpg, png等)。   以下是一种思路 1) 图片文件可以通过GDI+中的Bitmap类来加载。 2) 如果要插入图片到CRichEditCtrl,则需要涉及到OLE对象的插入。可以这样理解,每一个图片文件都是一个OLE对象,这些OLE对象通过CRichE...

运行时错误:Error: no data exchange control with ID 0xXXXX

有时候会碰到一些奇怪的运行时问题,如标题所示。 当我们在VS中拖了一个控件到对话框模板上,我们通常会将这个控件绑定到一个变量上。例如,我们会将一个CButton绑定到一个按钮,将CEdit绑定到一个编辑框。如果没有给予特别的注意,就会出现如下的错误: Error: no data exchange control with ID 0xXXXX 并且,这个错误仅在Debug版本出现,而且它还是隐藏在...

实战经验:ON_CONTROL_REFLECT(_EX)的在CEdit扩展中的使用

MFC提供了编辑框控件CEdit,可以基本满足我们的一般性编辑需求,但是如果想对CEdit进行定制,例如重新设计其边框,对用户输入做预处理的时候,我们需要扩展CEdit。今天来看看ON_CONTROL_REFLECT和ON_CONTROL_REFLECT_EX这两个反射宏在CEdit扩展中的使用。 ON_CONTROL_REFLECT 从名称上来看,ON_CONTROL_REFLECT是一个反射宏...

实战经验:采用MFC的CArchive将对象序列化到CMemFile中

在一次编程实验中,我碰到了这样一个问题:我需要将一个对象通过网络传输出去。 首先为了可扩展性,这个对象被设计为变长结构,也即我们事先不能知道它确切的长度。有些朋友会说,可以创建一个足够大的缓冲区来承载这个对象。嗯!当然是可以的。但是这样的设计不是最优的,因为网络带宽是有限的,从节省带宽的角度来说,使用大缓冲区肯定意味着有些不必要的数据和有效数据一起传输。另外,对象长度变长,缓冲区的最大尺寸,还真是...

实战经验:__super关键字的使用  

我不知道你们有没有看过MFC的继承类图? 在C++程序中,我们通常会设计一系列的对象层次结构来建模真实的物理世界。 学院派的观点认为:通过类继承,我们可以使用基类描绘对象的一般特性和行为,通过子类来建模对象的特殊行为。通过在基类中定义虚方法,由子类重写(override)此虚方法,实现了继承链上的运行时多态。 但是在实际工程开发中,我们却免不了重载(overload)基类的某些方法,我们希望在子...

代码片段:CFormView手动创建以及OnInitialUpdate

CFormView相比CDialog来说,多了个比较吸引人的优点:它继承自CScrollView。因此,天然的,CFormView就拥有了视图自动滚动的特性。 动态创建 继承自CFormView的子类,VS的代码生成器会自动使用如下的两个宏: DECLARE_DYNCREATE(子类的头文件) IMPLEMENT_DYNCREATE(子类的实现文件) 这两个宏经过展开后的即可使类具备动态创建的特性...

实战经验:禁止CComboBox自动部分匹配

当我们使用下拉框控件CComboBox时,如果输入的文本内容和下拉框中的项相匹配(只要前几个字符匹配就会触发),则控件会自动匹配到这一项并自动补全。 如果想禁用此特性,可以这样做: 1) 获取下拉列表窗口的句柄 COMBOBOXINFO stCbInfo; GetComboBoxInfo(hComboBox, &stCbInfo); HWND hListBox = stCbInfo...