我已经搜索了主题提供,但没有设法找到正确的...
对不起,如果我弄错了。如果是这样,请在此处指出正确的问题。
好吧,说回正事。情况:我使用 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 。我尝试了它们但没有运气,可能是因为:
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() 方法......选项太多,但是......哪个......我很困惑。:(
当然,帮助我选择并指出主观上最有效和最无代码的解决方案。