delphi 从TGraphicControl继承组件,例如paintbox, canvas输出汉字问题,欢迎大家来研究
例如这么一个问题,都要执行以下猜会看到结果
在Scrollbox 里面放置一个Paintbox,代码如下,点击scrollbox的滚动条, 看看输出的汉字有什么改变。对比一下,其他地方输出的变化。 是不是TGraphicControl继承组件不用双缓冲都是这个样子。
主要是因为MS Sans Serif,这个字体和 DEFAULT_CHARSET 字符集。这个原因因为DELPHI字体资源管理的问题还是,TGraphicControl的问题,要么是字体映射问题。VC做出来就没有问题。下面有个VC的例子
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ImgList;
type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
PaintBox1: TPaintBox;
PaintBox2: TPaintBox;
procedure PaintBox1Paint(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PaintBox2Paint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
//字符集不要改动要用系统默认字符集DEFAULT_CHARSET
//注意D2009系统默认字体是 Tahoma,要修改成 MS Sans Serif,这样才会出现问题
self.Font.Charset := DEFAULT_CHARSET; //一定要用缺省字符集
self.Font.Name := 'MS Sans Serif'; //一定要用这种字体,这种字体出问题
scrollbox1.Font.Name := 'MS Sans Serif';
scrollbox1.Height := 170;
scrollbox1.VertScrollBar.Range := 1000;
paintbox1.ParentFont := false;
paintbox1.Font.Charset := DEFAULT_CHARSET; //这里设置的是paintbox的字体
paintbox1.Font.Name := 'MS Sans Serif'; //一定要用这种字体,这种字体出问题,而且只是在SCROLLBOX里面出问题
paintbox1.Font.Size := 10;
paintbox1.Align := alclient;
PaintBox2.Font.Name := 'MS Sans Serif'; // PaintBox2在窗体里,任意放个位置不要只是为了输出文字对比
PaintBox2.Font.Size := 10;
PaintBox2.Font.Charset := DEFAULT_CHARSET;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
i : integer;
begin
with Canvas do
begin
for i := 0 to 99 do
textout(10, i * 30, '大小0123456789');
end;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i : integer;
begin
with paintbox1.Canvas do
begin
for i := 0 to 10 do
textout(10, i * 25, '0123456789大小');
end;
end;
procedure TForm1.PaintBox2Paint(Sender: TObject);
var
i : integer;
begin
with paintbox2.Canvas do
begin
for i := 0 to 10 do
textout(10, i * 25, '0123456789大小');
end;
end;
end.
vc例子,
void CDemofontView::OnDraw(CDC* pDC)
{
CDemofontDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CFont m_font;
CFont *pFontOld;
m_font.CreateFont(20, 0, 0, 0, 0,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, "MS Sans Serif");
pFontOld = pDC->SelectObject(&m_font);
ExtTextOut( pDC->m_hDC, 100, 200, 0, NULL, "大小0123456789", _tcslen("大小0123456789"), NULL);
pDC->SelectObject(pFontOld);
}