自己实现一个“记事本”功能的软件,在客户区显示CString a中的文字内容,要求各行显示,自动换行。
不用CEditView和CRichView,自己实现。最关键是的怎样提高重绘窗口效率。
我自己也写了一个,但是感觉效率比较低,一重绘(最小化窗口,然后最大化),cpu使用率明显提高(同样多的内容,windows的记事本对cpu的影响几乎忽略不计)
请各位大侠帮帮忙。写文本用DrawText(),不用TextOut()
给代码最好,给建议和算法也行。一定要效率高点的。谢谢!

解决方案 »

  1.   

    现在内存设备对象里Draw好,然后一次性贴到前台DC上咋样~
      

  2.   

    window的那个是用汇编优化过的(只考虑速度).............自己实现的话可能速度想超edit也不容易.............
      

  3.   

    还要考虑滚动,选择的时候还要考虑英文跟中文,不能选半个字,还是去看看notepad++的实现吧
      

  4.   

    还要考虑滚动,选择的时候还要考虑英文跟中文,不能选半个字,还是去看看notepad++的实现吧同意楼上的
      

  5.   

    我的是这样写的:
    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中主要是为了实现换行。
      

  6.   

    怎么先在内存设备对象里Draw好?具体点,我现在只针对文字换行输出
      

  7.   

    难度很大,强烈建议直接使用EDIT窗口类。
      

  8.   

    win2000的源代码里面有,自己去看吧
      

  9.   

    MSDN6.0 A盘里面有 \SAMPLES\VC98\MFC\OLE\WORDPAD