我想在ListBox的DrawItem事件中自画
当一项要显示的内容要比它的宽度还长,就想采用这种形式:
完整的内容为:大富翁为人民服务
在列表里它的长度比列表要长,所以要显示为:大富翁为人...
这种功能如何实现呢?如果长度足够长的话就显示全部.

解决方案 »

  1.   

    如何截取?
    我试过了,效果不好,如果有汉字一起,就会截取出乱码,而且我的
    计算长度的方法可能不行。
    我用Copy来截取的。谁能给我个DEMO?
      

  2.   

    老兄怎么都不仔细看SDK帮助啊??????SDK API: DrawTextEx(Canvas->Handle,"大富翁为人民服务",StrLength,Rect,DT_END_ELLIPSIS,NULL);//注意:记得使用DT_END_ELLIPSIS标志=========================================================
    这个简单问题大富翁的那些高手们都没有搞定,怎么为人民服务啊?
      

  3.   

    BCB_FANS,用了DrawTextEx就画不出字了。
    我用的是Canvas.TextOut
    如果我判断出StrLength,用哪个也没有关系。
    现在问题是如果是中文和英文混合的话,如何得到它的长度呢?
      

  4.   

    用DrawTextEx可以呀,你试试下面的代码。procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);
    var
      s:string;
    begin
    s:=(Control as TListbox).Items[Index];
    DrawTextEx((Control as TListbox).Canvas.Handle,pchar(s),length(s),Rect,DT_END_ELLIPSIS,Nil);
    end;
      

  5.   

    “用了DrawTextEx就画不出字了”?????什么意思???为什么我这里又没有任何问题!!!!!!!
      

  6.   

    “如果我判断出StrLength,用哪个也没有关系”不要误会,StrLength是字符串的长度,而不是像素的长度StrLength = ((TListBox*)Sender)->Items->Strings[Index].Length();
      

  7.   

    用了DrawTextEx就输出一堆乱的字符(原内容中英文混合的),如果是
    全是英文就可以。
      

  8.   

    请把ListBox的Style设置为OwnerDrawFixed,然后在DrawItem里面写代码:
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);
    var
      s:string;
    begin
      s:=(Control as TListbox).Items[Index];
      ListBox1.Canvas.FrameRect(RECT);
      DrawTextEx((Control as TListbox).Canvas.Handle,pchar(s),length(s),Rect,DT_END_ELLIPSIS,Nil);
    end;
      

  9.   

    我看你真是碰到鬼了?!!!==============================
    内容:中d中dffdss中fdd中r中s中f中           //中英文混合
    sddddddddddddddddddddddddddd          //英文
    中科院中科院中科院中科院中科院        //中文代码:void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
          TRect &Rect, TOwnerDrawState State)
    {
      AnsiString Str =   Str = ((TListBox*)Control)->Items->Strings[Index];
      DrawTextEx(ListBox1->Canvas->Handle,Str.c_str(),Str.Length(),&Rect,DT_END_ELLIPSIS,NULL);//
    }
    //---------------------------------------------------------------------------结果:显示正常,没有任何乱码!!!
      

  10.   

    截取的问题也很简单,你的问题主要是乱麻,因此在截取之前,用IsDBCSLeadByte函数判断一下,是不是中文的第一字节即可。
      

  11.   

    To: Kingron(单身走我路……) 老大,我倒认为不简单,如果向楼主所说的那样,就必须通过像素来进行比较以决定是否进行截取,得到字符串的总像素宽度倒容易,但要进行截取的话,就只好把单个字符的像素加起来,每加一个字符像素就判断一次总像素,看看是否已经大于ListBox->Width,如果大于则只显示这部分的内容。不过这样效率太低了!!!
      

  12.   

    我有在memo上的:
                                          在TMemo组件上画图  摘 要:使用WM_PAINT消息在TMemo组件上画图
    关键字:WM_PAINT TMEMO
    类 别:用户界面
     
    为了在TMemo组件表面画图,我们应当创造TMemo的子类,并重载它的drawing方法.具体做法如下:type
      TMyMemo = class(TMemo)
      protected
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;//Tmessage等很多现在我不懂,怎么用
      end;
    插入到程序的实现部分:procedure TMyMemo.WMPaint(var Message: TWMPaint); 
    var
      MCanvas: TControlCanvas;//继承Tcanvas
      DrawBounds : TRect; //record             
    Begin
      inherited;
      MCanvas:=TControlCanvas.Create;
      DrawBounds := ClientRect; // 生成临时TRect类型记录= Rect(0, 0, ClientWidth, ClientHeight).
      Try
       MCanvas.Control:=Self;
       With MCanvas do
       Begin
        Brush.Color := clBtnFace;
        FrameRect( DrawBounds );
        InflateRect( DrawBounds, -1, -1);
        FrameRect( DrawBounds );//画边界
        FillRect ( DrawBounds );
        MoveTo ( 33, 0 );
        Brush.Color := clWhite;
        LineTo ( 33, ClientHeight );
        PaintImages;
       end;
      finally
        MCanvas.Free;
      End; 
    end;
        这个PaintImages过程在Memo的画布上画图象。 procedure TMyMemo.PaintImages; 
    var
      MCanvas: TControlCanvas;
      DrawBounds : TRect;
      i, j : Integer;
      OriginalRegion : HRGN;
      ControlDC : HDC; 
    begin
      MCanvas:=TControlCanvas.Create;
      DrawBounds := ClientRect; // 生成临时TRect类型记录
      try
       MCanvas.Control:=Self;
       ControlDC := GetDC ( Handle );
       MCanvas.Draw(0, 1, Application.Icon);
      finally
        MCanvas.Free;
      end; 
    end;
      现在你有了你自己的drawing memo类。
      

  13.   

    哈哈,BCB_FANS的方法是对的,我将代码拿回家的试就行了。
    原来单位的机上装了那个什么经典字体,我猜想可能是这个问题,
    要不怎会这样呢?两个系统基本一样的呀。