请教一下各位高手怎么样才能让Lebel控件自动换行呀!!!!最好能有代码示例,小弟在这里先谢了

解决方案 »

  1.   

    http://202.113.167.200/hpitc/lyweb/xxtweb/vb/5.ppt
      

  2.   

    是静态文本框呀,我也试了一下,一开始label有字符的时候,有时可以,有时不行的,而且我在程序中把字符串放上去的时候也不能自动换行
      

  3.   

    还有这是在VC++中的,xuzheng318(忧郁王子)说的是VB中的,不过还是要谢谢了呀
      

  4.   

    要从CStatic派生一个类,在类的OnEraseGnd函数中自己用DrawText函数输出文字,加上DT_CALCRECT|DT_WORDBREAK参数就行了。
      

  5.   

    我是想在一个Label控件中,能让它在每行到15个全角字符的时候自动换行
      

  6.   

    自动换行的静态文本控件,从CStatic派生一个类,在类的WM_PAINT消息响应函数OnPaint()中加上如下代码:
    -----------------------------------------------------------
    void CAutoLineStatic::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    /*
    //下面7行代码是根据界面中控件的大小自动换行的
    CRect rect;
    this->GetWindowRect(&rect);
    ScreenToClient(&rect);
    CString str;
    this->GetWindowText(str);
    dc.DrawText(str, rect,DT_EDITCONTROL|DT_WORDBREAK);
    return;
    */ //下面代码则是根据用户指定文本长度自动换行,如15个全角字符长度
    //并把界面中控件的宽度自动调整到合适的大小
    CRect rect;
    CSize size(0,0); this->GetWindowRect(rect);
    GetParent()->ScreenToClient(&rect);
    //随便15个全角字符,以便计算长度,这里是15个全角的空格
    CString str="               ";  
    CFont *pOldFont=dc.SelectObject(GetParent()->GetFont());
    ::GetTextExtentPoint32((HDC)dc,str,str.GetLength(),&size);
    rect.right=rect.left+size.cx;
    this->MoveWindow(rect);
    rect.right-=rect.left;
    rect.bottom-=rect.top;
    rect.left=0;
    rect.top=0;
    this->GetWindowText(str);
    dc.DrawText(str,rect,DT_EDITCONTROL|DT_WORDBREAK);
    dc.SelectObject(pOldFont); // Do not call CStatic::OnPaint() for painting messages
    }
    -----------------------------------------------------------代码粗糙了点,方法也和我前面提到的不大一样,呵呵,不过可以实现要求。
      

  7.   

    奇怪呀,为什么我这没有什么反应呀,可不可以把你建的这个工程发给我呀
    E-Mail:[email protected]
      

  8.   

    还有请问一下在程序中怎么可以设置Dialog的长度和宽度呀
      

  9.   

    还有个更简单的方法,相信你会喜欢的,把下面函数体中的代码加入你的工程中就行了:
    void CMmDlg::OnButton2() 
    {
    CRect rect;
    CSize size(0,0);
    CStatic *pStatic=(CStatic *)GetDlgItem(IDC_STATIC1);
    pStatic->GetWindowRect(rect);
    ScreenToClient(rect);
    CClientDC dc(pStatic);
    //随便写15个字符长度来计算宽度,这里用15个全角空格
    CString str="               ";    
    CFont *pOldFont=dc.SelectObject(this->GetFont());
    ::GetTextExtentPoint32((HDC)dc,str,str.GetLength(),&size);
    rect.right=rect.left+size.cx+2;
    //直接调整控件的大小就行了,它会自动换行的,不过注意控件属性中不要有No Wrap风格
    pStatic->MoveWindow(rect);
    }
      

  10.   

    不好意思,更深是有问题呀void CMyMessageBoxDlg::OnButton1() 
    {
    CRect rect;
    CSize size(0,0); CStatic *pStatic=(CStatic *)GetDlgItem(IDC_STATIC);
    pStatic->GetWindowRect(rect);
    pStatic->ScreenToClient(rect); CClientDC dc(pStatic); CString str="vaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavv";   
     
    CFont *pOldFont=dc.SelectObject(pStatic->GetFont());
    ::GetTextExtentPoint32((HDC)dc,str,str.GetLength(),&size); dc.DrawText(str,rect,DT_EDITCONTROL|DT_WORDBREAK); dc.SelectObject(pOldFont); DeleteObject( dc);
    pStatic->InvalidateRect( rect);
    }
    这是我写的代码,可以自动换行并且写出字符串,但是我发现这个虽然写的区域是正确的,但好像不是在IDC_STATIC Label控件上改的.void CMyMessageBoxDlg::OnButton2() 
    {
    CString csData;
    CWnd* pWnd; csData = _T("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac");
    pWnd = GetDlgItem( IDC_STATIC);
    pWnd->SetWindowText( csData);
    }
    我用OnButton2测试了一下,OnButton1改变的不是IDC_STATIC Label控件
      

  11.   

    OnButton1函数中前面的代码已经写出来了,直到pStatic->InvalidateRect( rect);这行代码,它的任务就是向控件发出一个重新绘制的消息,控件收到后马上用原来的文本内容重写一遍,你前面的工作就白做了。你把这行注释掉就知道了。所以一般自绘的工作都会放在WM_PAIN或WM_ERASEBKGND消息响应函数中。
      

  12.   

    不好意思,可能是我没有说清楚吧,比如说在IDC_STATIC里面默认的写上“bbbbbbbbbbbbbb”,然后我在按OnButton1的话,这时上面显示的是"bbbbbbbbbbbbbbbbb"和"vaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavv"的叠加,而不是单独的"vaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavv"字符串