我想在ListBox的DrawItem事件中自画
当一项要显示的内容要比它的宽度还长,就想采用这种形式:
完整的内容为:大富翁为人民服务
在列表里它的长度比列表要长,所以要显示为:大富翁为人...
这种功能如何实现呢?如果长度足够长的话就显示全部.
当一项要显示的内容要比它的宽度还长,就想采用这种形式:
完整的内容为:大富翁为人民服务
在列表里它的长度比列表要长,所以要显示为:大富翁为人...
这种功能如何实现呢?如果长度足够长的话就显示全部.
解决方案 »
- 下列语句在运行时无论IMAGE中有无图片都提示'有图片'呀
- 请教关于序号的一个小问题:append的时候,将某字段的值赋值为序号
- 只有*.dcu文件,能干啥?
- 自已写代码创建的窗口,如何实现关闭事件?
- 监控系统如何开发?
- 在Delphi里如何取得SQL Server存储过程的输出参数的值?
- 有关制作报表的英文汉化问题?
- 英文版XP系统下,中文的Delphi应用程序运行发生错误!怎么解决呢?
- 能否写一个通用的函数,参数是各类控件,而内部却可以调用各类控件的方法和属性
- ### 请问如何设置HtmlHelp函数参数
- 高手请进-我做了一个flash播放器,如何设成默认播放?默认播放时如何获取文件路径?
- 是电源问题,还是主板问题?
我试过了,效果不好,如果有汉字一起,就会截取出乱码,而且我的
计算长度的方法可能不行。
我用Copy来截取的。谁能给我个DEMO?
这个简单问题大富翁的那些高手们都没有搞定,怎么为人民服务啊?
我用的是Canvas.TextOut
如果我判断出StrLength,用哪个也没有关系。
现在问题是如果是中文和英文混合的话,如何得到它的长度呢?
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;
全是英文就可以。
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;
内容:中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);//
}
//---------------------------------------------------------------------------结果:显示正常,没有任何乱码!!!
在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类。
原来单位的机上装了那个什么经典字体,我猜想可能是这个问题,
要不怎会这样呢?两个系统基本一样的呀。