1

我已经搜索了主题提供,但没有设法找到正确的...

对不起,如果我弄错了。如果是这样,请在此处指出正确的问题。

好吧,说回正事。情况:我使用 ShowMessage() 作为应用程序中某些事件的简单“状态简报”提供程序:

procedure SatusBriefingDialog();
begin
  if Sender = SomeObject then 
  begin
    Application.NormalizeToMosts;
    MessageDlg(Handle, PChar('The_string_that_forms_nice_informative_window / dialog'));
    Application.RestoreTopMosts;
  end;
end;

现在,我想完善它,因此我想使用扩展的 ascii 表,但是,我无法选择访问它们的最佳方式。也许我只是不知道那个神奇的功能......

这是使用 OEMToANSI / OEMToChar 和反之亦然函数的方法:http ://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20381022.html 。我尝试了它们但没有运气,可能是因为:

来自EDN / MS-Help 的语法

BOOL OemToChar(LPCSTR lpszSrc, LPTSTR lpszDst);

参数

lpszSrc [in] 指向来自 OEM 定义的字符集中的以 null 结尾的字符串的指针。

lpszDst [out] 指向已翻译字符串缓冲区的指针。

如果将 OemToChar 函数用作 ANSI 函数,则可以通过将 lpszDst 参数设置为与 lpszSrc 参数相同的地址来转换字符串。如果将 OemToChar 用作宽字符函数,则无法执行此操作。

我需要的是 Char(Ord(170)); , 字符(Ord(180)); 和 Char(Ord(190)) - http://www.asciitable.com/。显然,使用默认的 WInXP 代码页我无法使用它们。现在,我google了一下,找到了这个解决方案:


FormShow 事件代码:

procedure TMain.FormShow(Sender: TObject);
var
   i : longint;
begin
  re.Font.Name := 'Terminal';
  re.Font.Size := 9;
//seems that charset must be set last
  re.Font.Charset := OEM_CHARSET;
  re.DefAttributes.Name := 'Terminal';
  re.DefAttributes.Size := 9;
  re.DefAttributes.Charset := OEM_CHARSET;
  re.SelectAll;
  re.SelAttributes := re.DefAttributes;
//turn off richedit's auto font switching...
  i := SendMessage(re.Handle, EM_GETLANGOPTIONS, 0, 0);
  i := i and not IMF_AUTOFONT;
  SendMessage(re.Handle, EM_SETLANGOPTIONS, 0, i);
end;

这些字体也将正确显示>> Courier New Lucida Console MS Mincho


现在,问题是 - 说 Windows Dialogs (API) 使用触发 ShowMessage() 的过程的 OEM 字符集的最佳方式是什么?? 覆盖 ShowMessage(); ? 继承一些richedit特性?各种 OwnerDraw() 或 WndProc() 方法......选项太多,但是......哪个......我很困惑。:(

当然,帮助我选择并指出主观上最有效和最无代码的解决方案。

4

2 回答 2

7

如果您使用的是 UNICODE 版本的 Delphi,请停止考虑 ASCII 字符方面的 ASCII 艺术。这些制图字符中的每一个都有一个 UNICODE 代码点。您的 Delphi 编辑器完全能够直接处理代码,您可以安全地在您的 pascal 源文件中使用它们。

这是一个例子:

procedure TForm20.Button1Click(Sender: TObject);
begin
  ShowMessage(
     '┌─────────────────────────────────────────────┐'#13#10 +
     '│ You have UNICODE DELPHI, you may now write  │'#13#10 +
     '│ this without any problems. Just copy-paste  │'#13#10 +
     '│ the chars you need from the wikipedia page. │'#13#10 +
     '└─────────────────────────────────────────────┘'
  );
end;

我是怎么写的?非常简单:打开此页面http://en.wikipedia.org/wiki/Box-drawing_characters并复制粘贴您需要的方框图字符。没错,你复制粘贴实际的字符(直角线、水平线、垂直线,无论你需要什么)——你不需要关心 Unicode 代码点本身。

当然,现在让这些字符正确显示在显示屏上是另一回事:您需要一个定点字体来做到这一点。AFAIK,您无法使用 获得固定字体点ShowMessage,您需要编写自己的版本ShowMessage...

于 2010-12-30T14:22:08.990 回答
3

如果我理解正确,那么您想使用一些在Unicode 范围内2500-257F的方框图字符。所以你只需要显示一条带有 Unicode 文本的消息。如果您使用的是 Delphi 2009 或更高版本,这非常简单,只需将字符插入字符串:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s := 'Test ' + #$2523;
  MessageBox(Handle, PChar(s), nil, MB_OK);
end;

即使您使用的是较早版本的 Delphi,您仍然可以调用例如该MessageBox()函数的 Unicode 变体,方法是使用MessageBoxW()并传递一个WideString.

于 2010-12-30T14:09:23.447 回答