关于字间距的问题,求教!(200分)

  • 主题发起人 主题发起人 sonie
  • 开始时间 开始时间
S

sonie

Unregistered / Unconfirmed
GUEST, unregistred user!
就象office等字处理软件一样,设置所选字符间的间隔。
 
你可以改mwedit的原码实现您的要求。
 
canvas.textwidth
 
他要的不会只是显示吧 我要晕了
 
你是不是指象TRichEdit和TMemo的显示行间距?到网站去下一个得了,现在有的是现成的,
如果要原代码也可以向作者要一个啊。
 
很感谢大家,大家的意见都很好,不过只说了有控件或源码,能不能告诉我出处?
再我说得清楚一点:我要的是这样一个TLabel,它的Caption的字间距在显示可调整,但其内容不能变,
所以插空间的方式要不得
 
对不起TextWidth只是得到字符串的高度,我要的正好是设置的函数,各位帮忙了
 
如果是调整行距呢,我倒是写过一个。不过,我想调整字距如果不考虑速度问题,
一个字符一个字符的DrawText应该可以做到。
 
SetTextCharacterExtra(Canvas.Handle, 15);
Canvas.TextOut(0, 0, '每个字符间隔15象素');
 
another_eye的方法我试了一下,应该说是控制了间距,但我要控制的就是这个label的Caption的字符间距
,这个答案给了我启示,我去试一下
 
提供一个可以控制行距和字距的控件,以前写的是控制行距的,使用了another_eyes的
方法,可以控制字距了。大家共享。如果发现什么Bug,一定要告诉我哦!另外,高度
还不能自动调整到完全显示Caption(如果Caption包含多行的话),如果那位有兴趣,
可以改写一下。

unit SqhLabel;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TSqhLabel = class(TCustomLabel)
private
FRowSpacing:integer;
FColSpacing:integer;
procedure SetRowSpacing(Value:Integer);
procedure SetColSpacing(Value:Integer);
protected
procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
public
property RowSpacing:integer read FRowSpacing Write SetRowSpacing;
property ColSpacing:integer read FColSpacing Write SetColSpacing;
published
property Align;
property Alignment;
property Anchors;
property AutoSize;
property BiDiMode;
property Caption;
property Color;
property Constraints;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property FocusControl;
property Font;
property ParentBiDiMode;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Transparent;
property Layout;
property Visible;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('SQH', [TSqhLabel]);
end;

{ TSqhLabel }

procedure TSqhLabel.DoDrawText(var Rect: TRect; Flags: Integer);
var
Text: string;
FontHeight:integer;
tslLines:TStringList;
procedure MyDrawText(ARect:TRect);
var
iLoop:integer;
sLine:String;
NewRect:TRect;
iTrueWidth:integer;
begin
for iLoop := 0 to tslLines.Count - 1 do
begin
sLine := tslLines[iLoop];

NewRect.Left := ARect.Left;
NewRect.Top := ARect.Top + iLoop * (FontHeight + FRowSpacing);
NewRect.Right := ARect.Right;
NewRect.Bottom := NewRect.Top + FontHeight;

DrawText(Canvas.Handle,PChar(sLine),Length(sLine),NewRect,Flags or DT_CALCRECT);
if NewRect.Right > Width then
Width := NewRect.Right;
DrawText(Canvas.Handle,PChar(sLine),Length(sLine),NewRect,Flags)
end;
end;
begin
Text := GetLabelText;
FontHeight := Canvas.TextHeight('M');

Flags := Flags or DT_NOPREFIX;
Flags := DrawTextBiDiModeFlags(Flags);

tslLines := TStringList.Create;
try
tslLines.Text := Text;

Canvas.Font := Font;
SetTextCharacterExtra(Canvas.Handle,FColSpacing);
if not Enabled then
begin
OffsetRect(Rect, 1, 1);
Canvas.Font.Color := clBtnHighlight;
MyDrawText(Rect);
OffsetRect(Rect, -1, -1);
Canvas.Font.Color := clBtnShadow;
MyDrawText(Rect);
end
else
MyDrawText(Rect);
finally
tslLines.Free;
end;

end;

procedure TSqhLabel.SetColSpacing(Value: Integer);
begin
if FColSpacing <> Value then
begin
FColSpacing := Value;
Repaint;
end;
end;

procedure TSqhLabel.SetRowSpacing(Value: Integer);
begin
if FRowSpacing <> Value then
begin
FRowSpacing := Value;
Repaint;
end;
end;

end.
 
cool
admire
高手风范,一语惊醒梦中人。
我改了一下,在paint中写drawtext也是一样的
问题解决了,但先把问题放一下,看其他人还有没观点.
 
多人接受答案了。
 
后退
顶部