vc知识和技巧(一)

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对象泄露,未完全释放。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值