QWndClass : (二) 两种DrawText的字体大小设置方法
2013-01-15 12:32
459 查看
在设备上下文(即所谓的DC)中使用DrawText来绘制文字其实不难,大概很久前我就弄明白了,直接用CDC的成员函数就好,但若想设置字体的粗细还有大小就让人有些头痛。其实GDI说难也不难,问题就是要注意的小节太多,最致命的是各种GDI资源的创建与回收。其实GDI是落后于年代的东西了,像GDI+就很方便,其实,看应用吧,GDI这种东西能不用就不用是最好的。
在实际应用的过程中,发现CDC本来是挺好用的,但容易产生内存泄漏问题,尤其是作用于兼容DC的操作,而且这纯粹是微软的BUG来的,无法修复。于是我改用HDC,用更基础的API来绘制界面,可能是我个人能力问题——依然存在内存泄漏的隐患。在自己的某项测试中,使用CDC的成员函数循环几百次系统(CE系统)内存就开始狂掉——当然我的实际应用不会如此频繁调用,用HDC的API的话循环三四千次也能测到同样的内存问题,其中的原因我不了解,但从实测上看,使用HDC的API貌似是更好的选择。尽管不如使用CDC的成员函数那么方便,但越是基础的东西使用起来也是越灵活的,接下来就看你自己的封装如何了。以上是自己使用GDI中的一点小感慨。说明本文的主题,如何使用不同大小的字体来DrawText呢?我还是直接贴代码吧,相信应该很容易明了的。
1、使用CDC的成员函数绘制:
2、使用HDC的API来绘制:
上面两段函数的效果是一样的,如下图所示,其中H表示字体的高度,W表示磅值(单位我就不管了),代码应该也挺好懂的。
在实际应用的过程中,发现CDC本来是挺好用的,但容易产生内存泄漏问题,尤其是作用于兼容DC的操作,而且这纯粹是微软的BUG来的,无法修复。于是我改用HDC,用更基础的API来绘制界面,可能是我个人能力问题——依然存在内存泄漏的隐患。在自己的某项测试中,使用CDC的成员函数循环几百次系统(CE系统)内存就开始狂掉——当然我的实际应用不会如此频繁调用,用HDC的API的话循环三四千次也能测到同样的内存问题,其中的原因我不了解,但从实测上看,使用HDC的API貌似是更好的选择。尽管不如使用CDC的成员函数那么方便,但越是基础的东西使用起来也是越灵活的,接下来就看你自己的封装如何了。以上是自己使用GDI中的一点小感慨。说明本文的主题,如何使用不同大小的字体来DrawText呢?我还是直接贴代码吧,相信应该很容易明了的。
1、使用CDC的成员函数绘制:
CDC * pDC = this->GetDC();//绘图的DC设备,注意事后释放 for (int i = 1; i <= 4 ; i++) { for (int j = 1 ; j <= 8; j++) { CFont myFont; LOGFONT lFont; memset(&lFont, 0, sizeof(LOGFONT)); //计算字体高度与磅值 int nNumerator = pDC->GetDeviceCaps(LOGPIXELSY); lFont.lfHeight = ::MulDiv( j * 2, -nNumerator, 72); lFont.lfWeight = i * 200; //创建字体 BOOL bRes = myFont.CreateFontIndirect(&lFont); ASSERT(bRes); //选择字体 CFont * pOldFont = pDC->SelectObject(&myFont); //绘制 CString str; str.Format(_T("H:%d, W:%d"), j * 2, i * 200); pDC->DrawText(str, CRect( (i - 1) * 150, (j -1) * 30, i * 150 , j * 30), DT_SINGLELINE|DT_LEFT|DT_VCENTER); //释放GDI资源 pDC->SelectObject(pOldFont); bRes = myFont.DeleteObject(); ASSERT(bRes); pOldFont = NULL; } }
2、使用HDC的API来绘制:
HDC hDC = ::GetDC(this->m_hWnd);//其实跟上面的方法没有太多的不一样,我只是想说CFont跟HDC真的不兼容的 for (int i = 1; i <= 4 ; i++) { for (int j = 1 ; j <= 8; j++) { HFONT hFont; LOGFONT lFont; memset(&lFont, 0, sizeof(LOGFONT)); //计算字体高度与磅值 int nNumerator = ::GetDeviceCaps(hDC, LOGPIXELSY); lFont.lfHeight = ::MulDiv( j * 2, -nNumerator, 72); lFont.lfWeight = i * 200; //创建字体 hFont = ::CreateFontIndirect(&lFont); ASSERT(hFont); //选择字体 HGDIOBJ hOldFont = ::SelectObject(hDC, hFont); ASSERT(hOldFont); //绘制 CString str; str.Format(_T("H:%d, W:%d"), j * 2, i * 200); ::DrawText(hDC, str, -1, CRect( (i - 1) * 150, (j -1) * 30, i * 150 , j * 30), DT_SINGLELINE|DT_LEFT|DT_VCENTER); //释放GDI资源 ::SelectObject(hDC, hOldFont); BOOL bRes = ::DeleteObject(hFont); ASSERT(bRes); hFont = NULL; hOldFont = NULL; } }
上面两段函数的效果是一样的,如下图所示,其中H表示字体的高度,W表示磅值(单位我就不管了),代码应该也挺好懂的。
相关文章推荐
- 两种解决修改android手机设置中字体大小后系统布局混乱的方法
- source insight设置字体大小方法
- Android中大小两种字体对齐 -- 实现上或者下对齐的解决方法
- CStatic设置字体大小及背景透明的方法
- jQuery之字体大小的设置方法
- QT的QMessageBox使用方法(设置字体大小,颜色等)
- 移动端页面以rem为单位设置字体大小不生效解决方法
- IOS开发的字体大小设置有几种方法
- Android 一个TextView中设置文字不同字体大小和颜色的最完整方法
- Android TextView 设置字体大小的方法
- iOS设置UIButton文字显示位置和字体大小、颜色的方法
- JavaScript 控制字体大小设置的方法
- CStatic设置字体大小及背景透明的方法
- netbeans设置默认编码和菜单字体大小的方法。。
- Android编程中TextView字体属性设置方法(大小、字体、下划线、背景色)
- Android Dialog 设置字体大小的具体方法
- eclipse的设置代码字体大小、同变量或者方法被双击后显示颜色、每行显示代码字数
- Qt中对text在程序中设置字体大小的方法
- MSN 8.5 去广告及字体大小设置方法
- iOS设置导航与其标题的颜色及字体大小和系统默认TabBar的相关设置与使用方法