例如这么一个问题,都要执行以下猜会看到结果
在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);

}

解决方案 »

  1.   

    是不是TGraphicControl继承组件不用双缓冲都是这个样子。 
    -------------------------TGraphicControl 继承的是没双缓冲的 
      

  2.   

    TGraphicControl是从TControls下继承下来的,是没有句柄的,它接收消息是由父控件分发的,它的Canvas也是用父控件的,因此也就没有什么双缓冲的。
      

  3.   

    和paintbox1.Align 这个有关系 
      

  4.   

    什么关系,不明白,为什么是他影响的,VCL代码没看出来什么问题
      

  5.   

    高手们没看明白什么意思?就是paintbox字体输出一会大一会小
      

  6.   


    我个人不同意...没有继承的双缓冲的话可以自己用 Bitmap 作双缓冲
      

  7.   

    我是说 那个paintbox.canvas 在输出文字时有问题,把我的代码你执行一下,还有说的需要注意的地方,可以看看是不是输出字体大小不一样
      

  8.   

    去掉这行就OK了     paintbox1.Align := alclient;
      

  9.   

    把一个ScrollBox内的子控件设置成 Align := alClient 可能不是好主意.
    当滚动条滚动时,这个alClient的子控件究竟该滚动还是不滚动呢?
      

  10.   


    把一个ScrollBox内的子控件设置成 Align := alClient 也不是这个原因你可以把paintbox的尺寸大一些,还是会输出文字发生变化
    ,但如果把 paintbox.top := 1; 而不是 Align := alClient 状态下的paintbox.top := 0,只要这个值不为零,字体就固定不变,并且和paintbox.top := 0时发生了有意思的事情子控件应该滚动的
      

  11.   

    在很多控件里面,如果TWinControl大小变化,都不是把TControl的Align属性设为自动变化,而是在TWinControl的大小变化事件里改变TControl的位置,这样做的好处是可以避免闪