1:
void Invalidate( BOOL bErase = TRUE );
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘
参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
它和 UpdateWindow( )区别在于:
UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。
2:clientdc不需要用户自己去释放,因为他的释放在析构中已经有了。
3:如果想要改变背景色,可以重载OnCtlColor,然后自己创建一个Hbrush,赋值给一个类的成员变量,然后函数返回该值。紧接着在destory函数里讲这个HBursh释放掉.
4:多行文字输出在一个矩阵中,该矩阵式有个最大的宽度,未到达最大宽度时,可以自适应字体的宽度,方法是利用gdi+的measurestring和drawstring,具体如下
CDC *pdc = GetDC();
HDC hdc =pdc->GetSafeHdc();
Graphics graphics(hdc);
USES_CONVERSION; //这里的作用是定义cstring转换为const wchar的一些值的宏
PointF origin(0.0f, 0.0f); //定义string输出的坐标位置。0 0 意味着从头开始输出
FontFamily fontFamily(L"Arial"); //设置字体
Gdiplus::Font pFont(&fontFamily, 9, FontStyleBold, UnitPoint); //设置字体
RectF boundRect((REAL)LRBorderAround,(REAL)TBBorderAround,(REAL)MaxMsgWidth,0.0F); //设置一个限制的区域,即文本最大输出局去,如果第3第4参数某个设置为0 的话,意味着该参数自适应调整
INT codepointsFitted = 0; //文本输出时返回的字数
INT linesFilled = 0; //返回文本输出的行数
graphics.MeasureString(A2W(m_msgText), -1, &pFont, boundRect,NULL,&m_rcText,&codepointsFitted,&linesFilled);
其中m_rcText返回文本实际显示区域的大小范围,
graphics.DrawString(A2W(m_msgText), -1, &m_pFont, m_rcText, NULL, &solidBrush);
输出多行文本的函数,支持/n等字符
5:关于USES_CONVERSION的细节注意
该宏定义的变量是在栈上申请地址的,也就是说对应循环,如
while(1){
USES_CONVERSION;
...
}
可能会造成栈空间用尽,一般栈都是2m(?)大小,因为一般变量循环结束后会自动释放,而这里不会,故如果要用到循环时的效果,不可以直接写循环,可以考虑写成2个函数,这样,当一个函数结束后,自然也能释放掉~
6:关于gdi资源释放
gdi中一些资源如cpen,如果当pdc选中即selectobject后,其实cpen没有被真正分离,所以最好还是申明一个oldpen,然后在pdc使用后,通过pdc.selectobject(oldpen)来还原回原来的画笔。
7:通过任务管理器查看是否gdi对象泄露,未完全释放。