自定义编辑控件时如何准确的设定高和宽(100分)

  • 主题发起人 主题发起人 maming
  • 开始时间 开始时间
M

maming

Unregistered / Unconfirmed
GUEST, unregistred user!
设定的高刚好是一行和多几的高,宽是刚好多少个字的宽,
随字体的改变而改变。
举个例子:新建一个memo,字体定下来后,如果memo的高度比2行字高半个字memo
的高度应调整为为3行,如果比2行字高不及半个字memo的高度应变回两行。
请高手指点。
 
用乘除来作,你的名次特高,无须我再说,我的水平太次
 
设定的高刚好是一行和多几的高,宽是刚好多少个字的宽,
随字体的改变而改变。
举个例子:新建一个memo,字体定下来后,如果memo的高度比2行字高半个字memo
的高度应调整为为3行,如果比2行字高不及半个字memo的高度应变回两行。
======================================================================
好像不行吧!Windows中不同的字符其宽度是不一样的
如10个l和10个w宽度就不一样!

 
主要是高度,现在找到了一个textheight 和textwidth可能可以解决了。
再看看有没有更好的办法。
 
偷懒的办法
放一个自适应大小的Label
procedure TForm1.Memo1Change(Sender: TObject);
begin
Label1.Caption:=Memo1.Text;
Memo1.Width:=Label1.Width+10;
Memo1.Height:=Label1.Height+10;
end;
 
to siyan:
你的方法只适合于length(memo1.text)<=label1.caption的最大长度。
 
var
rct: TRect;
DC: hdc;
old: THandle;
begin
DC := getdc(memo1.handle);
old := selectobject(dc, memo1.font.handle);
rct := memo1.clientrect;
drawtext(dc, pchar(memo1.lines.text), length(memo1.lines.text), rct, DT_CALCRECT or DT_WORDBREAK or DT_EXTERNALLEADING);
selectobject(dc, old);
releasedc(memo1.handle, dc);
// rct现在的尺寸就是你需要的正好的尺寸, 不过这个是ClientRect, 如果memo有边框或者scrollbar那么你需要调整一下rct的大小然后将它设置成memo.boundsrect就行了
...
end;
 
多人接受答案了。
 
后退
顶部