用GDI的DrawText函数。文字字体HFONT,先CreateFont,然后SelectObject文字里面有中文和英文,如果设置字体为宋体,则没问题。如果设置字体为“Times New Roman”,当中文文字很多、且定时重复刷新显示的时候,CPU占用率一下子上去了。我分析,感觉像是绘制每一个中文字体的时候,先尝试Times New Roman,发现这个是英文字体,不支持中文,然后切换为宋体,结果耗费了大量CPU时间……不知道对不对,如何解决呢?我用的已经是双缓冲了,只不过由于某种需要,内存DC中仍然需要定时重复调用DrawText函数。
解决方案 »
- 小型三国网游
- 想挑战自己,证明自己不仅仅是目前薪水的价值吗
- CException在vs2005中怎么不能继承了?
- 图像采集卡使用问题!用的是天敏的
- 关于 OCX 控件注册的令人迷惑的问题
- 请教调用一个DLL中函数遇到的错误提示
- 套接字API(Socket API)程序的编译环境是什么?家庭PC上能调试Socket API程序吗?
- 请问:我用的dao创建的数据库,在追加数据时怎么转换数据类型啊?我是用的非绑定方式,在线等...
- 为什么英文字的位置比中文字的要低?
- 如何限制程序窗口能被缩小的尺寸?
- [求助]MFC+OpenGL读位图创建纹理: MDI中glGenTextures失败, 改成SDI后调用glTexImage2D出错
- 怎样得到文件夹变化通知消息
if( m_dcMemoryDC == NULL )
return false;m_hMemoryBitmap = CreateCompatibleBitmap( m_dcWinDC, m_iDrawWidth, m_iDrawHeight );
if( m_hMemoryBitmap == NULL )
return false;SelectObject( m_dcMemoryDC, m_hMemoryBitmap );m_hBrushBackground = CreateSolidBrush( m_clrBackground );
if( m_hBrushBackground == NULL )
return FALSE;::ReleaseDC(m_hWindow,m_dcWinDC);m_hFont = CreateFont( m_iFontSize,0,0,0,iFontBold,iFontItalic,iFontUnderline,iFontStrikeout,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,DEFAULT_PITCH,(LPCTSTR)(m_iFontName) );
SelectObject( m_dcMemoryDC, m_hFont );然后SetTimer,每15毫秒调用一次TextToScreen:RECT rectangle;
rectangle.top = 0;
rectangle.left = 0;
rectangle.right = m_iDrawWidth;
rectangle.bottom = m_iDrawHeight;FillRect( m_dcMemoryDC, &rectangle, m_hBrushBackground ); SetBkMode( m_dcMemoryDC, TRANSPARENT );DrawText( m_dcMemoryDC, m_buffer, m_bufferlen, &rectangle, DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_WORDBREAK );Invalidate(FALSE);
CPaintDC dc(this);
::BitBlt( dc.m_hDC, m_iDrawX, m_iDrawY, m_iDrawWidth, m_iDrawHeight, m_dcMemoryDC, 0, 0, SRCCOPY );就是这样。这段代码之前工作得都好好的,今天我无意间将字体换成Times New Roman,才发现这个问题的……
CPaintDC dc(this);
::BitBlt( dc.m_hDC, m_iDrawX, m_iDrawY, m_iDrawWidth, m_iDrawHeight, m_dcMemoryDC, 0, 0, SRCCOPY );
这里的问题```::BitBlt( dc.m_hDC, m_iDrawX, m_iDrawY, m_iDrawWidth, m_iDrawHeight, m_dcMemoryDC, 0, 0, SRCCOPY );
写在WM_PAINT里,函数中调用invalidate();就行了`
2. 不要在OnPaint中调用Invalidate(FALSE);, 这会造成频繁刷新,不断发消息WM_PAINT,连续调用OnPaint, 导致系统cpu占用率升高。
2) 显示的文本中含有较多的汉字,一般含60多个汉字时CPU就到50%了;
3) 用DT_WORDBREAK来执行多行显示。其中,任意一条不满足(比如说用中文字体,或者单行显示),CPU都是正常的0%。感到很郁闷,找到根源了也不知道该怎么解决……哪位大侠能帮帮忙啊?