是这样的 我要实现在view视图里用CDC输出一篇文章  得实现自动换行 而且不用CEdit之类的控件输出 但我还要实现自动换行的同时要求每行的间距不是默认的那样挤  要求设置一定的间距  用到什么函数呢?我看了drawtext只能实现自动换行 但实现不了设置行间距 用textout的话 只能实现设置行间距(即:每次计算每行的输出位置)但设置不了自动换行  有别的函数能够实现自动换行的同时还能够设置行间距吗?我看到GDI+了  好像也不知道能否设置  有明白的高手指教一下 最好说的详细一点  函数 以及怎么用 不会的就别留言了

解决方案 »

  1.   

    textout可以实现换行啊.
    你可以通过控制坐标来实现
      

  2.   

    以下仅供参考: const int LINE_COUNT = 200; // 每行字数
    const int Y_SPACE = 25; // 行距
    char s[4096]; // 文章内容
    char *p = s;
    int x = 0, y = 0;
    for (int i=0; i<strlen(s)/LINE_COUNT; i++)
    {
    ::TextOut(x, y, p, LINE_COUNT);
    p += LINE_COUNT;
    y += Y_SPACE;
    }
      

  3.   


    每行能装多少字是可以计算出来的, GetTextExtent就可以.
    你再获取一下显示区域的大小,我想觉得完全可以控制啊,而且很灵活.
      

  4.   


    谢谢你 我实现了间距 可是没有自动换行啊 嘿 如果想限定在给定的那个区域里的话 我该怎样实现换行呢 给定的区域是我用CDC画的四条线 这四条线组成一个矩形 就像上面那个代码那样  在这个矩形里 我实现了间距变宽了 但是输出的文字却跑到了矩形区域的外面 您能给个解决办法吗
      

  5.   

    你可以写一个类似下面的函数啊,或者写成一个单独的类也可以void CTestDlg::MiniDraw(CDC *pDC, CRect &rc, char *pString)
    {
        const int LINE_COUNT = 5; // 每行字数
        const int Y_SPACE = 25;        // 行距
        char *p = pString;
        int x = 0, y = 0;
        for (int i=0; i<strlen(pString)/LINE_COUNT; i++)
        {
            pDC->TextOut(x, y, p, LINE_COUNT);
            p += LINE_COUNT;
            y += Y_SPACE;
        }
    }
      

  6.   

    上面忘了处理矩形了.下面这样应该是可以的.void CTestDlg::MiniDraw(CDC *pDC, CRect &rc, char *pString)
    {
    TEXTMETRIC tm;   
    GetTextMetrics(pDC->GetSafeHdc(), &tm);    //CSize size = pDC->GetTextExtent(pString, strlen(pString));

    const int LINE_COUNT = rc.Width()/tm.tmAveCharWidth; // 每行字数
        const int Y_SPACE = 25;        // 行距    char *p = pString;
    int x = rc.left, y = rc.top;
        for (int i=0; i<strlen(pString)/LINE_COUNT; i++)
        {
            pDC->TextOut(x, y, p, LINE_COUNT);
            p += LINE_COUNT;
            y += Y_SPACE;
        }
    }
      

  7.   


    很感谢你的耐心 一会送分 我现在还是解决不了那个文字跑出矩形外面的问题 肯定是我的每行字数那里错了
    在VS2005里的演示代码
    TEXTMETRIC tm;   
    pDC.GetTextMetricsW(&tm);   
        const int LINE_COUNT = (myrect.Width()*6/8)/tm.tmAveCharWidth; // 每行字 (我的矩形区域的宽度是画了两条线 横坐标分别是 myrect.width()/8,myrect.width()*7/8)
    CSize sz = pDC.GetTextExtent(str4);     const int Y_SPACE = 35;// 行距
    int x = myrect.Width()/8+10; //在这个位置输出文本内容 因为文本上面还有标题的位置呢
    int y =  myrect.Height()/25+115;
        for (int i = 0; i < lstrlenW(str4)/LINE_COUNT; i++)
        {

            pDC.TextOutW(x,y, str4, LINE_COUNT);
            str4 += LINE_COUNT;
    y += Y_SPACE;
        }
      

  8.   

    myrect是什么呢?
    如果你用两条线的坐标来算矩形宽,那也应该是:
    右边line的x坐标 - 左边line的x坐标啊.
    (myrect.Width()*6/8)这是什么意思呢..
      

  9.   

    看这里
    int x = myrect.Width()/8+10;你既然将字放在左边界后的10个像素,那么字体很可能出界啊。将这一句
    const int LINE_COUNT = (myrect.Width()*6/8)/tm.tmAveCharWidth;
    改成
    const int LINE_COUNT = (myrect.Width()*6/8 - 20)/tm.tmAveCharWidth;
      

  10.   


    myrect是我定义的一个 CRect矩形区域 然后 
             CClientDC pDC(this);
    this->GetClientRect(&myrect);
            pDC.MoveTo(myrect.Width()/8,myrect.Height()/25);
    pDC.LineTo(myrect.Width()/8,myrect.Height()*24/25);

            pDC.MoveTo(myrect.Width()*7/8,myrect.Height()/25);
    pDC.LineTo(myrect.Width()*7/8,myrect.Height()*24/25); pDC.MoveTo(myrect.Width()/8,myrect.Height()/25);
    pDC.LineTo(myrect.Width()*7/8,myrect.Height()/25); pDC.MoveTo(myrect.Width()/8,myrect.Height()*24/25);
    pDC.LineTo(myrect.Width()*7/8,myrect.Height()*24/25);这是画出来的矩形 就当做是一页纸张 里面输出文字  然后myrect.Width()*6/8是这个矩形页面的宽度啊 我到底哪里错了呢 帮忙指教一下 我快下班了 回家很难上网 网速不好  我希望马上就做出来了 小女子拜托您了
      

  11.   


    这个也出界  那个+10是当时用drawtext自动换行输出的时候 为了好看 因为如果不+10右边就空白出来好多地方 左边就特别挤
      

  12.   

    你看看多出的是不是一半啊?是不是UNICODE的问题呢?
      

  13.   

    呵呵,你把你的LINE_COUNT/2看看正不正好啊.
    急什么,才周一嘛.
      

  14.   

    其实像这样的问题,自己稍微处理下就可了.
    你试下一行能放多少个字,然后把LINE_COUNT设置成那个数值就行了,嘿嘿~~
    如果你那个矩形大小是固定的话.
      

  15.   

    嘿嘿  以后向你请教 如果你不怕我麻烦的话呵呵  我以前试过了一行放60个字就很好看 但是在i那里 控制i小于行数的时候 如果总数除以每行固定字数的话 文本就显示不全  我再回去想想 大脑有点停滞了 谢谢你 我先结账 呵呵 你QQ多少啊 我加你