自己实现一个“记事本”功能的软件,在客户区显示CString a中的文字内容,要求各行显示,自动换行。
不用CEditView和CRichView,自己实现。最关键是的怎样提高重绘窗口效率。
我自己也写了一个,但是感觉效率比较低,一重绘(最小化窗口,然后最大化),cpu使用率明显提高(同样多的内容,windows的记事本对cpu的影响几乎忽略不计)
请各位大侠帮帮忙。写文本用DrawText(),不用TextOut()
给代码最好,给建议和算法也行。一定要效率高点的。谢谢!
不用CEditView和CRichView,自己实现。最关键是的怎样提高重绘窗口效率。
我自己也写了一个,但是感觉效率比较低,一重绘(最小化窗口,然后最大化),cpu使用率明显提高(同样多的内容,windows的记事本对cpu的影响几乎忽略不计)
请各位大侠帮帮忙。写文本用DrawText(),不用TextOut()
给代码最好,给建议和算法也行。一定要效率高点的。谢谢!
CMyView::OnDraw(CDC* /*pDC*/)
CClientDC dc(this);
TEXTMETRIC tm;//字体信息
CFont font;//字体
CPoint pt;//总起点
RECT rect;//客户区尺寸
long cxClient,cyClient;
int rows,rowsnumber;//内容的行数,每行的字数
SIZE size1,size2;
GetClientRect(&rect);//取得客户区尺寸
cxClient=rect.right-rect.left;//客户区宽度
cyClient=rect.bottom-rect.top;//客户区高度
font.CreatePointFont(200,_T("Fixedsys"),NULL);//创建字体
dc.SelectObject(&font);//设置字体
dc.SetTextColor(RGB(0,0,0));//设置字体颜色
dc.GetTextMetrics(&tm);//取得字体信息
rows=int(dc.GetTextExtent(str1).cx/cxClient)+1;//计算行数
rowsnumber=int((cxClient-10)/tm.tmAveCharWidth);//计算每行平均字数
pt.x=20;
pt.y=5;
ShowText(pt,str1.GetLength(),rowsnumber,str1,&dc,tm,cxClient);
} CMyView::ShowText(CPoint pt,int j, int rowsnumber, CString str, CClientDC *dc,TEXTMETRIC tm,long cxClient)
{
CRect rect;
int i,nstart=0,nover=0;for(i=0;j>0;i++)
{
if(j>=rowsnumber)
{ nstart=nover;
nover=nstart+(i+1)*rowsnumber;
while(dc->GetTextExtent(str.Mid(nstart,nover-nstart)).cx+40>=cxClient)
{
nover=nover-1;
}
rect.top=pt.y+2*i*(tm.tmAscent+tm.tmDescent);
rect.left=pt.x;
rect.bottom=rect.top+tm.tmAscent+tm.tmDescent;
rect.right=pt.x+dc->GetTextExtent(str.Mid(nstart,nover-nstart)).cx;
dc->DrawText(str.Mid(nstart,nover-nstart),nover-nstart,rect,DT_LEFT);
//dc->TextOut(pt.x,pt.y+2*i*(tm.tmAscent+tm.tmDescent),str.Mid(nstart,nover-nstart),nover-nstart); }
else
{
nstart=nover;
nover=nstart+j;
while(dc->GetTextExtent(str.Mid(nstart,nover-nstart)).cx+40>=cxClient)
{
nover=nover-1;
}
rect.top=pt.y+2*i*(tm.tmAscent+tm.tmDescent);
rect.left=pt.x;
rect.bottom=rect.top+tm.tmAscent+tm.tmDescent;
rect.right=pt.x+dc->GetTextExtent(str.Mid(nstart,nover-nstart)).cx;
dc->DrawText(str.Mid(nstart,nover-nstart),nover-nstart,rect,DT_LEFT);
}
j=str.GetLength()-nover; }
}当str1长了一点后,每次重绘就会很卡,ShowText中主要是为了实现换行。