delphi 从TGraphicControl继承组件,例如paintbox, canvas输出汉字问题,欢迎大家来研究

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

}
...全文
421 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bear_hx 2009-05-10
  • 打赏
  • 举报
回复
在很多控件里面,如果TWinControl大小变化,都不是把TControl的Align属性设为自动变化,而是在TWinControl的大小变化事件里改变TControl的位置,这样做的好处是可以避免闪
space_ngc1275 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ahjoe 的回复:]
把一个ScrollBox内的子控件设置成 Align := alClient 可能不是好主意.
当滚动条滚动时,这个alClient的子控件究竟该滚动还是不滚动呢?
[/Quote]

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

子控件应该滚动的
ahjoe 2009-05-05
  • 打赏
  • 举报
回复
把一个ScrollBox内的子控件设置成 Align := alClient 可能不是好主意.
当滚动条滚动时,这个alClient的子控件究竟该滚动还是不滚动呢?
ahjoe 2009-05-05
  • 打赏
  • 举报
回复
去掉这行就OK了 paintbox1.Align := alclient;
Frank.WU 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sanguomi 的回复:]
是不是TGraphicControl继承组件不用双缓冲都是这个样子。
-------------------------

TGraphicControl 继承的是没双缓冲的

[/Quote]

我个人不同意...没有继承的双缓冲的话可以自己用 Bitmap 作双缓冲
space_ngc1275 2009-05-03
  • 打赏
  • 举报
回复
我是说 那个paintbox.canvas 在输出文字时有问题,把我的代码你执行一下,还有说的需要注意的地方,可以看看是不是输出字体大小不一样
space_ngc1275 2009-04-30
  • 打赏
  • 举报
回复
高手们没看明白什么意思?就是paintbox字体输出一会大一会小
space_ngc1275 2009-04-28
  • 打赏
  • 举报
回复
这个问题连高手也不知道?
Bear_hx 2009-04-27
  • 打赏
  • 举报
回复
TGraphicControl是从TControls下继承下来的,是没有句柄的,它接收消息是由父控件分发的,它的Canvas也是用父控件的,因此也就没有什么双缓冲的。
space_ngc1275 2009-04-27
  • 打赏
  • 举报
回复
楼上们执行代码看看输出结果,然后点击滚动条看看,显示的文字大小不一样,什么原因造成的
kye_jufei 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Bear_hx 的回复:]
TGraphicControl是从TControls下继承下来的,是没有句柄的,它接收消息是由父控件分发的,它的Canvas也是用父控件的,因此也就没有什么双缓冲的。
[/Quote]
同意
space_ngc1275 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 imho888 的回复:]
和paintbox1.Align 这个有关系
[/Quote]
什么关系,不明白,为什么是他影响的,VCL代码没看出来什么问题
imho888 2009-04-27
  • 打赏
  • 举报
回复
和paintbox1.Align 这个有关系
sanguomi 2009-04-26
  • 打赏
  • 举报
回复
是不是TGraphicControl继承组件不用双缓冲都是这个样子。
-------------------------

TGraphicControl 继承的是没双缓冲的

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧