例如这么一个问题,都要执行以下猜会看到结果
在Scrollbox 里面放置一个Paintbox,代码如下,点击scrollbox的滚动条, 看看输出的汉字有什么改变。对比一下,其他地方输出的变化。 是不是TGraphicControl继承组件不用双缓冲都是这个样子。
主要是因为MS Sans Serif,这个字体和 DEFAULT_CHARSET 字符集。这个原因因为DELPHI字体资源管理的问题还是,TGraphicControl的问题,要么是字体映射问题。VC做出来就没有问题。下面有个VC的例子
unit Unit1;interfaceuses
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);
}
在Scrollbox 里面放置一个Paintbox,代码如下,点击scrollbox的滚动条, 看看输出的汉字有什么改变。对比一下,其他地方输出的变化。 是不是TGraphicControl继承组件不用双缓冲都是这个样子。
主要是因为MS Sans Serif,这个字体和 DEFAULT_CHARSET 字符集。这个原因因为DELPHI字体资源管理的问题还是,TGraphicControl的问题,要么是字体映射问题。VC做出来就没有问题。下面有个VC的例子
unit Unit1;interfaceuses
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);
}
解决方案 »
- 散分,以示感恩!第九帖
- 关于事务问题
- 怎么选中dbgrid的单元格
- 一个关于udp的问题,adsl做路由(他们上网的ip都是一样的),固定ip的服务器不能给这些客户的机器发送信息,为什么,
- 谁能帮我解释下以下的代码
- ServerSocket怎样获得当前ClientSocket连接阿?并且根据IP决定拒绝该连接
- 为什么有的类可以直接obj:TClass,而有的要obj:=TClass.create才行?
- 被千万收购的Windows优化大师是如何构造的?
- 请问这个方法怎么实现?
- 为什么会出现闪屏现象
- 怎么锁定方法,一次只能一个地方调用,其他的排队
- 线程里的创建控件,控件的事件怎么触发?SPComm onreceivedate事件
-------------------------TGraphicControl 继承的是没双缓冲的
我个人不同意...没有继承的双缓冲的话可以自己用 Bitmap 作双缓冲
当滚动条滚动时,这个alClient的子控件究竟该滚动还是不滚动呢?
把一个ScrollBox内的子控件设置成 Align := alClient 也不是这个原因你可以把paintbox的尺寸大一些,还是会输出文字发生变化
,但如果把 paintbox.top := 1; 而不是 Align := alClient 状态下的paintbox.top := 0,只要这个值不为零,字体就固定不变,并且和paintbox.top := 0时发生了有意思的事情子控件应该滚动的