0

我正在使用德尔福 7。

我想在标签标题上指出与标签相关的页面有内容。如果页面上的 dbgrid 中有内容,我想在标题后面加上一个绕组,用字母 n 表示,它显示为一个框。所以现在不是标题为“患者历史”,而是“患者历史”+一个小填充框。

由于符号是带有wingding字体类型的字母'n',我想更改标题中间的字体类型并添加字母n,从而在标题末尾产生一个小填充框。

Tabsheet.caption := 'Patient History ' + changefonttypetowinding + 'n'.

可行吗?

4

2 回答 2

6

你在这里进入了所有者绘制的领域,一旦你考虑到主题,这并不是一件容易的事。如果你真的走那条路,那么我就不会打扰 Wingdings,我只会在盒子上画一个TCanvas.FillRect.

就个人而言,我会研究 Unicode Delphi 并使用 U+2587 (▇) 或其朋友之一。

于 2011-03-05T16:40:47.640 回答
3

正如 David 所指出的,由于您没有使用支持 Unicode 的 Delphi 版本,因此您仅限于使用所有者绘图或“ANSI”字符集。(我的建议是您升级到 Delphi 2009+。Unicode 是数字世界中发生过的最好的事情。使用 Unicode,您可以获得数万个字符(理论上,每种字体!)而不是 127 或 255。这包括各种语言以及技术和数学符号以及各种装饰物。甚至还有一个苯环:U+232C BENZENE RING:⌬)

现在让我们假设升级是不可能的。那么,如果我是你,我会为此使用历史上的“标准字符”,即星号 (*)。在您的情况下,我强烈建议您这样做。

如果你靠,靠,想要一个黑色的方块,那么你必须做所有者绘图。你可以这样做:

// Please don't do this -- see comments below
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
const
  Padding = 8;
  SqSize = 6;
var
  capt: string;
  r: TRect;
begin
  capt := TTabControl(Control).Tabs[TabIndex];
  r := Rect;
  r.Left := r.Left + Padding;
  DrawText(Control.Canvas.Handle, capt, length(capt), r, DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS);
  r.Left := r.Right - Padding - SqSize;
  r.Right := r.Left + SqSize;
  r.Top := (r.Bottom - r.Top - SqSize) div 2;
  r.Bottom := r.Top + SqSize;
  FillRect(Control.Canvas.Handle, r, GetStockObject(BLACK_BRUSH));
end;

但是请注意,这将禁用视觉主题!看起来会很可怕!请不要这样做!

于 2011-03-05T19:52:13.040 回答