Blogs
将一个消息处理过程绑定到多个控件
由 gougou 于 星期四, 2005-07-28 15:14 发表在VC中,我们使用ClassWizard可以创建指定控件的消息处理函数,但是如果界面上有多个控件要处理时,需要绑定多个消息处理过程,如果消息处理过程完全一下的情况下,会造成大量的代码冗余,幸好VC中提供了基于控件ID范围设定的消息宏,可以将一个消息处理过程绑定到多个控件上,比如ON_CONTROL_RANGE。vc中只定义了一些常用的基于范围的消息绑定宏,特殊的消息范围宏,我们可以自定义来实现,下例就是一个将EN_SETFOCUS消息处理函数绑定到多个控件的宏。
用于调试的两个宏
由 gougou 于 星期五, 2005-07-08 22:42 发表不要在构造函数和析构函数中抛出异常
由 gougou 于 星期五, 2005-07-01 19:06 发表标准模版容器访问的越界检查问题
由 gougou 于 星期四, 2005-06-30 23:39 发表今天,检查一个程序Bug时发现了一个没想到的问题,C++的标准模版库为了追求效率,在使用下标访问容器内元素时,没有对容器的size作越界检查,因为对于不同类型的容器,size函数并不是一个常数时间的操作,结果导致我已经Clear的一个容器,仍然可以通过下标正确访问到已经从容器中删除的元素.折腾了我一个个小时来确认Bug的原因.
定制自绘画的ComboBox高度
由 gougou 于 星期四, 2005-06-23 21:03 发表今天写了一个自绘画的ComboBox,结果发现一个以前从来没有注意的问题,就是设定了OwnerDraw样式的ComboBox的高度被系统自动设定为比普通的ComboBox大那么几个像素,重载MesureItem方法,定制列表项目的高度也不解决问题,最后发现只要重载PreSubclassWindow方法,给ComboBox发一个CB_SETITEMHEIGHT的消息就可以了,代码示意如下
使用标准模版库的流处理CSV文件
由 gougou 于 星期日, 2005-06-19 00:04 发表标准模版库中的文件流支持>>操作符号重载,可以方便的实现数据导入和类型转换,但是有一个比较弱智的限制就是输入的字符串只能用空格分割,不支持逗号分割,今天处理csv文件,用了一个比较龌龊的方法就是,将所有的逗号先替换为空格,然后导入,代码示意如下
ifstream fRoad(szFile.c_str()); if (!fRoad) throw e_open_file_fail; entities.clear(); char buffer[0xFF] = {0}; while (!fRoad.eof()) { fRoad.getline(buffer, sizeof(buffer)); string szLine=buffer; replace_if(szLine.begin(),szLine.end(), //range bind2nd(equal_to<char>(),','), ' '); istringstream ssLine(szLine); road_entity entity; ssLine >> entity; ..... istringstream& operator>>(istringstream& ss, road_entity& e) {
使用Boost中的Format格式化标准模版库的string
由 gougou 于 星期六, 2005-06-18 23:56 发表 标准模版库中的string有一个很大的缺陷,就是没有类似于sprintf和CString的format方法, 当格式化字符串的时候没有这个方法是非常不爽的。幸好boost中提供了format库,可以实现标准模版库string类的格式化,更强的一点是boost的format支持强类型的数据检查,用法稍微有点怪异,见下面的示例
#pragma warning(disable: 4018) // signed/unsigned mismatch
#include "boost/format.hpp"
using namespace boost;
...
string szCon=str(format("'[TrainNo]'== '%s'") % pLogic->m_sTrain);