如何自动调整TStringGrid行(DefaultRowHeight)以匹配使用的字体高度?我做的事情
Grid.DefaultRowHeight:= Grid.Canvas.TextHeight('X')+ 4;
但它不起作用.对于小字体,行的高度太大.
更新:
这似乎是程序逻辑的一个问题.如果我多次更改字体,则行的当前高度与先前字体更改事件的字体大小相匹配(它落后一步).
我使用此代码拦截字体的大小更改:
procedure TStrGrid.CMFontChanged(var Message: TMessage);
begin
inherited; // let TControl react first
DefaultRowHeight:= Canvas.TextHeight('ApApM')+ 4;
end;
Run Code Online (Sandbox Code Playgroud)
它就好像程序将是:
begin
DefaultRowHeight:= Canvas.TextHeight('ApApM')+ 4;
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
(首先它改变了高度,然后它实际上设置了正确的字体大小 - 因此高度落后一步)
它与此顺序无关:继承的CMFontChanged
消息处理程序和DefaultRowHeight
属性setter调用都无效.这是由于当前的字体设置尚未更新:
procedure TStrGrid.CMFontchanged(var Message: TMessage);
begin
Canvas.Font := Font;
DefaultRowHeight := Canvas.TextHeight('Ap') + GridLineWidth + 3;
end;
Run Code Online (Sandbox Code Playgroud)
说明:
无效标记窗口以在将来某处重新绘制窗口(网格).在获得文本高度后肯定会发生这种情况.作为替代方案,您可以Repaint
在请求新文本高度之前调用,但这会导致双重重绘,因此设置Canvas.Font
.