StretchBlt和StretchDIBits
摘要:StretchBlt:从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩,如果目标设备是窗口DC,则意味着在窗口绘制位图,大致的使用代码如下: 1 void DrawImage(HDC hdc, HBITMAP hbm, const RECT target_rect) 2 { 3 HDC hdcMemory = ::CreateCompatibleDC(hdc); 4 HBITMAP old_bmp = (HBITMAP)::SelectObject(hdcMemory, hbm); 5 6 BITMAP bm = { 0 }; 7 ...
阅读全文
posted @
2014-04-05 13:53
小时了了
阅读(4198)
推荐(1) 编辑
在C++中用模版实现property
摘要:前几天为了查找一个BUG花了几乎一整天的时间,然后——就像江湖传说的一样,只改了一行代码就搞定了。至于原因仅仅是因为一个变量未初始化,一秒钟的疏忽却花了一天的代价来弥补,就像那个蚂蚁和大象的段子:风流了一夜,挖一辈子的坑。 这类BUG通常是不稳定重现的测试未必测的出来,测出来了也未必容易定位,若是不小心留到了用户那里可能真的就成了一辈子的坑,永远都解决不掉了。这样的事我想命苦的C++程序员们初入江湖的时候可能都遇到过那么一两回。——声明一下,以前我也搞出过这样的BUG,但从那之后没再犯第二次错误,这次的代码是别人写的。 俗话说人是靠不住的,只有靠制度才有保障,哪怕我们再小心也总有马虎大...
阅读全文
posted @
2011-11-11 00:38
小时了了
阅读(2150)
推荐(3) 编辑
谁该为参数负责
摘要:事情缘起于代码走读会议的一次讨论。基本的需求很简单,就是实现类似下面这样一个函数:HRESULT GetText(/* [out] */BSTR* pText); 很自然地,首先写出来的实现是这样的:HRESULT GetText(/* [out] */BSTR* pText){ ASSERT(pText != NULL); *pText = ::SysAllocString(L"This is the text."); return S_OK;} 它的调用方式如下(这里为了简单起见我们忽略掉了对返回值的判断): BSTR bstText = NULL; GetText(&
阅读全文
posted @
2011-10-30 11:55
小时了了
阅读(1330)
推荐(5) 编辑
string中的单词查找与左右字符剪切
摘要:需求源于为博客文章添加tag的字符串处理: tag之间以“,”分隔,要根据这个分隔符分离出各个tag;另外处于习惯用户可能敲入多余的空格,所以需要对tag的左右空格进行剪切。STL的string类没有现成的方法只好自己写一个。第一版函数原型如下:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->void find_all_words(conststring& str, char decollator, vector words);其中参
阅读全文
posted @
2011-01-22 15:56
小时了了
阅读(761)
推荐(1) 编辑
使用function改进设计
摘要:我们假设这样一种应用场景,有两个类A和B,在B中需要调用A的一个方法(成员函数)。那么我们的代码可能是这个样子的:class A{public: void Func(void) { printf("%s\r\n", __FUNCTION__); }};class B{public: void UseA() { a->Func(); }public: A* a;}; 调用代码是这样的:A a;B b;b.a = &a;b.UseA(); 我们观察上面的代码,看看有什么问题:两个类中B对A产生了一个依赖关系,这让人有点不爽;哪天我们想用另外一个类C替代A的作用意味
阅读全文
posted @
2010-12-06 12:22
小时了了
阅读(544)
推荐(2) 编辑
在VS2010中使用auto关键字和lambda表达式
摘要:先看一段使用了std::list的代码: std::list array; for(int i = 0; i ::iterator it = array.begin(); it != array.end(); ++it) { (*it) += 1; } for (std::list::iterator it = array.begin(); it != array.end(); ++it) { printf("%d\t", *it); } 我们观察这段代码。首先,它是正确的,没什么错误,但看起来太臃肿了。本来我要完成每个元素的值加1关键的代码只有一行 (*it) += 1;
阅读全文
posted @
2010-12-04 15:49
小时了了
阅读(1324)
推荐(0) 编辑