支持自绘画的属性编辑器(3)
2008-04-09 04:21:03来源:互联网 阅读 ()
type
TBoldComponentNameProperty =
class(TComponentNameProperty)
public
procedure PropDrawName(Canvas: TCanvas;
const Rect: TRect; Selected: Boolean); override;
end;
procedure TBoldComponentNameProperty.PropDrawName(
Canvas: TCanvas; const Rect: TRect; Selected: Boolean);
var
Style: TFontStyles;
begin
Style := Canvas.Font.Style;
Canvas.Font.Style := Canvas.Font.Style [fsBold];
try
inherited;
finally
//恢复字体的样式以便Delphi正确的画属性值
Canvas.Font.Style := Style;
end;
end;
下拉列表
一个属性编辑器可能会拥有一个下拉列表框,用户可以通过选择列表项来改变属性值。Delphi 5使用了自绘画的特性来改进Tcolor和Tcursor属性的界面友好性,我们也可以作同样的事情,通过重载ListDrawValue,ListMeasureHeight和ListMeasureWidth方法可以很容易的做到。下面是这几个方法的声明:
procedure ListDrawValue(const Value: string;
Canvas: TCanvas; const Rect: TRect; Selected: Boolean);
procedure ListMeasureHeight(const Value: string;
Canvas: TCanvas; var Height: Integer);
procedure ListMeasureWidth(const Value: string;
Canvas: TCanvas; var Width: Integer);
ListDrawValue方法类似于PropDrawValue方法,但它的Selected是有意义的,表示用户已经选择了这个列表项。Delphi会根据Selected参数自动设定画布的颜色为合适的值,所以通常情况下我们可以忽略这个参数。Value参数是要显示的字符串,Delphi调用GetValue方法来获得这些字符串,
在对象编辑器显示列表框之前,它会调用ListMeasureHeight和ListMeasureWidth方法来获得每个列表项的尺寸,我们可以设定Height和Width参数来获得想要得到的高度和宽度。下拉列表框使用全部列表项中最大的尺寸,然后显示相同区域大小的列表项。
当用户滚动列表框时,Delphi调用ListDrawValue方法来画心新的可见的列表项。用户可能会前后滚动多次,如果列表项很多,每次重绘需要很多时间的话,我们应该建立一个临时的位图,把列表项先画到位图上,然后在ListDrawValue方法中快速显示位图。这实际上就是双缓冲技术。
下面的例子是一个扩展的集合类型属性,下拉列表显示全部的集合元素,并在每个集合元素旁边添加一个复选框。复选框是通过位图来模仿的,属性编辑器先取得复选框位图,并在不同情况下显示打叉和未打叉的位图。全局变量Checked和Unchecked保存这两个位图 为Tbitmap类型。下面的代码显示了TSetPropertyEx.类是如何实现自绘画集合类型的:
// 在下拉列表框的每一个列表项旁边画一个复选框
procedure TSetPropertyEx.ListDrawValue(const Value: string;
Canvas: TCanvas; const Rect: TRect; Selected: Boolean);
var
IsChecked: Boolean;
OrdValue: Integer;
begin
OrdValue := GetOrdValue;
IsChecked := GetEnumValue(EnumInfo, Value) in
TIntegerSet(OrdValue);
Canvas.FillRect(Rect);
Canvas.TextRect(Rect, Rect.Left Checked.Width 2,
Rect.Top 1, Value);
if IsChecked then
Canvas.Draw(Rect.Left 1, Rect.Top 1, Checked)
else
Canvas.Draw(Rect.Left 1, Rect.Top 1, Unchecked);
end;
procedure TSetPropertyEx.ListMeasureHeight(
const Value: string; Canvas: TCanvas;
var Height: Integer);
begin
if Height < Checked.Height then
Height := Checked.Height;
end;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
相关文章
IDC资讯:
主机资讯
注册资讯
托管资讯
vps资讯
网站建设
网站运营:
建站经验
策划盈利
搜索优化
网站推广
免费资源
网络编程:
Asp.Net编程
Asp编程
Php编程
Xml编程
Access
Mssql
Mysql
其它
服务器技术:
Web服务器
Ftp服务器
Mail服务器
Dns服务器
安全防护
软件技巧:
其它软件
Word
Excel
Powerpoint
Ghost
Vista
QQ空间
QQ
FlashGet
迅雷
网页制作:
FrontPages
Dreamweaver
Javascript
css
photoshop
fireworks
Flash
热门词条
最新资讯
热门关注
