Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14481340
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:46:29

下载本文示例代码
p>  在开发证券分析软件中,经常要绘制各种股票的分析曲线。为了使得软件的 功能更加方便.灵活,用户希望能够按照自己的喜好自定义各种曲线的颜色。在WORD97的[格式]菜单下的字体对话框中有类似的功能。当用户单击字体对话框中的颜色下拉框时,各种颜色的简单图案和字体的颜色名称一起显示出来,这样处理的结果显然比只提供一个装有颜色名称的下拉框效果要好的多。 一、自定义颜色对话框的实现   在Delphi中,我们可以使用TComboBox 实现类似的功能。在TcomboBox构 件中有一个Style属性, 决定TcomboBox的显示属性。 通常可选取csDropDown,csSimple,csDropDownList, csOwnerDrawFixed,csOwnerDrawVariable等。其中当选取csOwnerDrawFixed时表示创建一个自画下拉框,下拉框 的每一项的高度由ItemHeight属性 决定。并且必须在TcomboBox的OnDrawItem事件中响应自画过程。 OnDrawItem的定义为: propertyOnDrawItem:TDrawItemEvent; TDrawItemEvent =procedure(Control:TWinControl;Index:IntegerRect:TRect; State:TOwnerDrawState)ofobject; 其中的三个参数的含义为: Control:  包含下拉框的TComboBox Index:自画的下拉框在TComboBox 的Items属性中的索引号 Rect:自画的位置   因此,知道了需要自画的矩形的位置(Rect参 数)和在TComboBox中的索引号(Index参数),我们可以使用TcomboBox的Canvas属性在其画布上自画。 具体的实现过程如下: 1.新建一个工程文件,设置其默认窗体的有关属性为: Caption 自定义下拉框 Name Form1 PositionpoScreenCenter 2 .在窗体中放置两个TcomboBox构 件,设置其属性如下: NameStyleItemHeightOnDrawItem ColorCombo1csOwnerDrawFixed 20ColorComboDrawItem ColorCombo2csOwnerDrawFixed 30ColorComboDrawItem 3 .双击ColorCombo1和ColorCombo2 的Items属性旁的圆点按纽,在StringListEditor对话框中输入 黑色 蓝色 蓝绿 鲜绿 红色 黄色 等各种颜色的名称 4 .在ColorCombo1的OnDrawItem 事件中 肴缦麓?? procedureTForm1.ColorComboDrawItem(Control: TWinControl;Index:Integer;Rect:TRect;State:OwnerDrawState); var TempColor:TColor; //自画颜色 TempBrushColor:TColor; //临时颜色 begin with(ControlasTComboBox)do //在Combo的Canvas 上自画 begin TempBrushColor:=Canvas.Brush.Color; //保存原来的的颜色 Canvas.FillRect(Rect); caseIndexof//根据Index 的不同,定义不同自画的颜色 0://黑色 TempColor:=clBlack; 1://蓝色 TempColor:=clBlue; 2://蓝绿 TempColor:=clAqua; 3://鲜绿 TempColor:=clLime; 4://红色 TempColor:=clRed; 5://黄色 TempColor:=clyellow; //可以在此加入对其它颜色的响应 end; Canvas.Brush.Color:=TempColor; //自画颜色矩形 Canvas.Rectangle(Rect.Left 4, Rect.Top 1, (Rect.Right Rect.Left)div3, Rect.Bottom 1); Canvas.Brush.Color:=TempBrushColor; //显示与颜色对应的字符串 Canvas.TextOut((Rect.Left Rect.Right)div2, Rect.Top 1, Items[Index]); end; end; 5 .保存,运行文件,我们可以看到和WORD中颜色下拉框相同的 效果 有兴趣的读者,可以在文中所示的位置加入对其它颜色处理。 以上程序在Delphi3.0,4.0 上通过。 二、 自定义颜色对话框构件的编写   对许多Delphi程序员来说,如何编写自己的Delphi构件还是比较陌生的,Delphi构件实际上是从Tcomponent 类继承发展而来,编写构件实际就是编写特殊的类。下面我们就以自定义颜色对话框为例介绍构件的编写。   下面TColorComboBox是从TcomboBox 类继承来的,当点击右边的下拉箭头时弹出和下拉items对应的各种颜色自画框。   1. 选中Component菜单项中的New Component选项。在AncestorType 框中选TcomboBox,在ClassName 框中填入TColorComboBox,在Palette Page框中选Samples,在UnitFileName框中填入ColorComboBox.pas, 然后点击OK按钮。   2. 选中Component菜单项中的Install Component选项,点击Intonewpackage,在package name框中写入路径和ColorComboDpk.dpk, 点击ok,生成ColorComboDpk.bpl 文件。   3. 使用Tools菜单中的ImageEditor 来创建编辑文件ColorComBox.dcr, 为TColorComboBox类建立位图。   4. 在Create中加入对字体大小高度的规定及对控件的Style 属性(设成csOwnerDrawFixed) 的规定,在Create后执行的CreateWnd中初始化颜色的items,如 果不需要那么多颜色项,可以以后在生成控件的items 属性中直接删除不需要的颜色。   5. 在DrawItem事件中加入颜色自画程序,此事件在On DrawItem之前发生。 实现程序如下: unitColorComboBox; interface uses Windows,Messages,SysUtils,Classes, Graphics,Controls,Forms,Dialogs, StdCtrls; type TColorComboBox=class(TComboBox) private {Privatedeclarations} FOnDrawItem:TDrawItemEvent; procedureDrawItem(Index:Integer;Rect:TRect; State:TOwnerDrawState);override; protected {Protecteddeclarations} public {Publicdeclarations} constructorCreate(AOwner:TComponent);override; procedureCreateWnd;override; published {Publisheddeclarations} propertyOnDrawItem:TDrawItemEvent ReadFOnDrawItemwriteFOnDrawItem; end; procedureRegister; implementation procedureRegister;//注册构件 begin RegisterComponents(Samples,[TColorComboBox]); end; constructorTColorComboBox.Create (AOwner:TComponent);//构件的初始化 begin inheritedCreate(AOwner); Style:=csOwnerDrawFixed; //构件的初始类型 ItemHeight :=20; Font.Size:=10; end; procedureTColorComboBox.CreateWnd; //颜色构件的Items属性 初始化 begin inheritedCreateWnd; Items.Clear; Items.Add(黑色); Items.Add(蓝色); Items.Add(蓝绿); Items.Add(鲜绿); Items.Add(粉红); Items.Add(红色); Items.Add(黄色); Items.Add(白色); Items.Add(深蓝); Items.Add(青色); Items.Add(绿色); Items.Add(紫色); Items.Add(深红); Items.Add(深黄); Items.Add(深灰); Items.Add(银色); //若不需要这么 多颜色可在构件的items属性中删 除不需要的颜色 end; //重载DrawItem 过程 procedureTColorComboBox.DrawItem(Index: Integer;Rect:TRect;State:TOwnerDrawState); var TempColor:TColor; //自画颜色 TempBrushColor:TColor; //临时颜色 begin //本 构件的默认自画设置 TempBrushColor:=Canvas.Brush.Color; //保存原来的的颜色 Canvas.FillRect(Rect); ifItems[index]=黑色 then TempColor:=clBlack elseifItems[index]=蓝色 then TempColor:=clBlue elseifItems[index]=蓝绿 then TempColor:=clAqua elseifItems[index]=鲜绿 then TempColor:=clLime elseifItems[index]=粉红 then TempColor:=clFuchsia elseifItems[index]=红色 then TempColor:=clRed elseifItems[index]=黄色 then TempColor:=clYellow elseifItems[index]=白色 then TempColor:=clWhite elseifItems[index]=深蓝 then TempColor:=clNavy elseifItems[index]=青色 then TempColor:=clTeal elseifItems[index]=绿色 then TempColor:=clGreen elseifItems[index]=紫色 then TempColor:=clPurple elseifItems[index]=深红 then TempColor:=clMaroon elseifItems[index]=深黄 then TempColor:=clOlive elseifItems[index]=深灰 then TempColor:=clGray elseifItems[index]=银色 then elseTempColor:=clSilver; Canvas.Brush.Color:=TempColor; //自画颜色矩形 Canvas.Rectangle(Rect.Left 4, Rect.Top 1, (Rect.Right Rect.Left)div3, Rect.Bottom 1); Canvas.Brush.Color:=TempBrushColor; //显示与颜色对应的字符串 Canvas.TextOut((Rect.Left Rect.Right)div2, Rect.Top 1, Items[Index]); end; end.   此控件可以在所有需要颜色选项的程序中使用而且非常方便和美观,并且使编程节省很多时间,增加了程序可靠性和可读性。 三、 自定义颜色对话框构件的使用   当注册完自定义颜色构件后,可以从Delphi构件模板的Sample页中选择自定义颜色构件,和使用Delphi本身构件没有区别。 p>  在开发证券分析软件中,经常要绘制各种股票的分析曲线。为了使得软件的 功能更加方便.灵活,用户希望能够按照自己的喜好自定义各种曲线的颜色。在WORD97的[格式]菜单下的字体对话框中有类似的功能。当用户单击字体对话框中的颜色下拉框时,各种颜色的简单图案和字体的颜色名称一起显示出来,这样处理的结果显然比只提供一个装有颜色名称的下拉框效果要好的多。 一、自定义颜色对话框的实现   在Delphi中,我们可以使用TComboBox 实现类似的功能。在TcomboBox构 件中有一个Style属性, 决定TcomboBox的显示属性。 通常可选取csDropDown,csSimple,csDropDownList, csOwnerDrawFixed,csOwnerDrawVariable等。其中当选取csOwnerDrawFixed时表示创建一个自画下拉框,下拉框 的每一项的高度由ItemHeight属性 决定。并且必须在TcomboBox的OnDrawItem事件中响应自画过程。 OnDrawItem的定义为: propertyOnDrawItem:TDrawItemEvent; TDrawItemEvent =procedure(Control:TWinControl;Index:IntegerRect:TRect; State:TOwnerDrawState)ofobject; 其中的三个参数的含义为: Control:  包含下拉框的TComboBox Index:自画的下拉框在TComboBox 的Items属性中的索引号 Rect:自画的位置   因此,知道了需要自画的矩形的位置(Rect参 数)和在TComboBox中的索引号(Index参数),我们可以使用TcomboBox的Canvas属性在其画布上自画。 具体的实现过程如下: 1.新建一个工程文件,设置其默认窗体的有关属性为: Caption 自定义下拉框 Name Form1 PositionpoScreenCenter 2 .在窗体中放置两个TcomboBox构 件,设置其属性如下: NameStyleItemHeightOnDrawItem ColorCombo1csOwnerDrawFixed 20ColorComboDrawItem ColorCombo2csOwnerDrawFixed 30ColorComboDrawItem 3 .双击ColorCombo1和ColorCombo2 的Items属性旁的圆点按纽,在StringListEditor对话框中输入 黑色 蓝色 蓝绿 鲜绿 红色 黄色 等各种颜色的名称 4 .在ColorCombo1的OnDrawItem 事件中 肴缦麓?? procedureTForm1.ColorComboDrawItem(Control: TWinControl;Index:Integer;Rect:TRect;State:OwnerDrawState); var TempColor:TColor; //自画颜色 TempBrushColor:TColor; //临时颜色 begin with(ControlasTComboBox)do //在Combo的Canvas 上自画 begin TempBrushColor:=Canvas.Brush.Color; //保存原来的的颜色 Canvas.FillRect(Rect); caseIndexof//根据Index 的不同,定义不同自画的颜色 0://黑色 TempColor:=clBlack; 1://蓝色 TempColor:=clBlue; 2://蓝绿 TempColor:=clAqua; 3://鲜绿 TempColor:=clLime; 4://红色 TempColor:=clRed; 5://黄色 TempColor:=clyellow; //可以在此加入对其它颜色的响应 end; Canvas.Brush.Color:=TempColor; //自画颜色矩形 Canvas.Rectangle(Rect.Left 4, Rect.Top 1, (Rect.Right Rect.Left)div3, Rect.Bottom 1); Canvas.Brush.Color:=TempBrushColor; //显示与颜色对应的字符串 Canvas.TextOut((Rect.Left Rect.Right)div2, Rect.Top 1, Items[Index]); end; end; 5 .保存,运行文件,我们可以看到和WORD中颜色下拉框相同的 效果 有兴趣的读者,可以在文中所示的位置加入对其它颜色处理。 以上程序在Delphi3.0,4.0 上通过。 二、 自定义颜色对话框构件的编写   对许多Delphi程序员来说,如何编写自己的Delphi构件还是比较陌生的,Delphi构件实际上是从Tcomponent 类继承发展而来,编写构件实际就是编写特殊的类。下面我们就以自定义颜色对话框为例介绍构件的编写。   下面TColorComboBox是从TcomboBox 类继承来的,当点击右边的下拉箭头时弹出和下拉items对应的各种颜色自画框。   1. 选中Component菜单项中的New Component选项。在AncestorType 框中选TcomboBox,在ClassName 框中填入TColorComboBox,在Palette Page框中选Samples,在UnitFileName框中填入ColorComboBox.pas, 然后点击OK按钮。   2. 选中Component菜单项中的Install Component选项,点击Intonewpackage,在package name框中写入路径和ColorComboDpk.dpk, 点击ok,生成ColorComboDpk.bpl 文件。   3. 使用Tools菜单中的ImageEditor 来创建编辑文件ColorComBox.dcr, 为TColorComboBox类建立位图。   4. 在Create中加入对字体大小高度的规定及对控件的Style 属性(设成csOwnerDrawFixed) 的规定,在Create后执行的CreateWnd中初始化颜色的items,如 果不需要那么多颜色项,可以以后在生成控件的items 属性中直接删除不需要的颜色。   5. 在DrawItem事件中加入颜色自画程序,此事件在On DrawItem之前发生。 实现程序如下: unitColorComboBox; interface uses Windows,Messages,SysUtils,Classes, Graphics,Controls,Forms,Dialogs, StdCtrls; type TColorComboBox=class(TComboBox) private {Privatedeclarations} FOnDrawItem:TDrawItemEvent; procedureDrawItem(Index:Integer;Rect:TRect; State:TOwnerDrawState);override; protected {Protecteddeclarations} public {Publicdeclarations} constructorCreate(AOwner:TComponent);override; procedureCreateWnd;override; published {Publisheddeclarations} propertyOnDrawItem:TDrawItemEvent ReadFOnDrawItemwriteFOnDrawItem; end; procedureRegister; implementation procedureRegister;//注册构件 begin RegisterComponents(Samples,[TColorComboBox]); end; constructorTColorComboBox.Create (AOwner:TComponent);//构件的初始化 begin inheritedCreate(AOwner); Style:=csOwnerDrawFixed; //构件的初始类型 ItemHeight :=20; Font.Size:=10; end; procedureTColorComboBox.CreateWnd; //颜色构件的Items属性 初始化 begin inheritedCreateWnd; Items.Clear; Items.Add(黑色); Items.Add(蓝色); Items.Add(蓝绿); Items.Add(鲜绿); Items.Add(粉红); Items.Add(红色); Items.Add(黄色); Items.Add(白色); Items.Add(深蓝); Items.Add(青色); Items.Add(绿色); Items.Add(紫色); Items.Add(深红); Items.Add(深黄); Items.Add(深灰); Items.Add(银色); //若不需要这么 多颜色可在构件的items属性中删 除不需要的颜色 end; //重载DrawItem 过程 procedureTColorComboBox.DrawItem(Index: Integer;Rect:TRect;State:TOwnerDrawState); var TempColor:TColor; //自画颜色 TempBrushColor:TColor; //临时颜色 begin //本 构件的默认自画设置 TempBrushColor:=Canvas.Brush.Color; //保存原来的的颜色 Canvas.FillRect(Rect); ifItems[index]=黑色 then TempColor:=clBlack elseifItems[index]=蓝色 then TempColor:=clBlue elseifItems[index]=蓝绿 then TempColor:=clAqua elseifItems[index]=鲜绿 then TempColor:=clLime elseifItems[index]=粉红 then TempColor:=clFuchsia elseifItems[index]=红色 then TempColor:=clRed elseifItems[index]=黄色 then TempColor:=clYellow elseifItems[index]=白色 then TempColor:=clWhite elseifItems[index]=深蓝 then TempColor:=clNavy elseifItems[index]=青色 then TempColor:=clTeal elseifItems[index]=绿色 then TempColor:=clGreen elseifItems[index]=紫色 then TempColor:=clPurple elseifItems[index]=深红 then TempColor:=clMaroon elseifItems[index]=深黄 then TempColor:=clOlive elseifItems[index]=深灰 then TempColor:=clGray elseifItems[index]=银色 then elseTempColor:=clSilver; Canvas.Brush.Color:=TempColor; //自画颜色矩形 Canvas.Rectangle(Rect.Left 4, Rect.Top 1, (Rect.Right Rect.Left)div3, Rect.Bottom 1); Canvas.Brush.Color:=TempBrushColor; //显示与颜色对应的字符串 Canvas.TextOut((Rect.Left Rect.Right)div2, Rect.Top 1, Items[Index]); end; end.   此控件可以在所有需要颜色选项的程序中使用而且非常方便和美观,并且使编程节省很多时间,增加了程序可靠性和可读性。 三、 自定义颜色对话框构件的使用   当注册完自定义颜色构件后,可以从Delphi构件模板的Sample页中选择自定义颜色构件,和使用Delphi本身构件没有区别。 下载本文示例代码


用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件用Delphi 实现自定义颜色对话框及其构件
阅读(169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~