
本站地址:http://www.bajiao123.com

Delphi编程经验三则
为列表框添光彩
为了改变Listbox和Combobox两个控件的单调风格,我想在它们的每一项前面加上个图标。从表面上看好像不大可能啦。就在走投无路的时候,我忽然发现这两个构件都有一个style属性,它可以设为lbOwnerDrawFixed,Draw这个单词吸引了我,然后我又从Delphi的在线帮助中找到了一个相关的事件OnDrawItem,在这个事件中写一段代码,就可以在列表框中的每一项前面添加一个小图标啦。
下面是在Listbox 的OnDrawItem事件中添加的代码:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Bitmap: TBitmap;
Offset: Integer;
begin
with (Control as TListBox).Canvas do
begin
FillRect(Rect);
Offset := 2;
Bitmap := TBitmap.create;
Bitmap.LoadFromFile(′d:\temp1\1.bmp′); //指定图文件是d:\temp1\1.bmp
BrushCopy(Bounds(Rect.Left + 2, Rect.Top, Bitmap.Width, Bitmap.Height),
Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed);
Offset := Bitmap.width + 6;
TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index])
end;
end;
进一步,利用OnDrawItem事件的参数Index还可以在不同项前面添加不同的图标。
还要告诉你的是,当用add方法为列表框或下拉框添加项目时,会自动执行OnDrawItem事件,这样新添加的项目前面也会有一个图标啦。(北京
赖立谦)
让图像旋转
Delphi中的Image构件可以显示位图,进一步,我们还可以用它完成位图旋转。
把一个点绕原点旋转α角度后,新的坐标位置与原坐标位置的关系是:
X=xcosα-ysinα
Y= xsinα+ycosα
例如要把位图顺时针旋转90度,坐标变换公式为:X=-y Y=x
把这一公式用到Image构件上,显示位图的主要问题是Image构件显示的位图只有一个象限,并且x、y坐标也是互相颠倒的,为了解决这个问题,必须在Image构件上建立一个新的坐标原点。下面就举例说明。
1. 新建一工程project1,在form1上添加image1、image2、image3、image4,其Autosize属性设为True,
image1用来显示原图,image2、image3、image4分别用来显示旋转90度、180度和270度后的图像。双击image1,选定一幅bmp图。
2. 添加Button1、Button2、Button3和Button4按钮,其caption属性分别为“原图”、“旋转90度”、
“旋转180度”、 “旋转270度”。
3. 编写“旋转90度”按钮的On Click事件。
procedure TForm1. Button2Click (Sender: TObject);
var
i,j:integer;
begin
//确定旋转后位图的大小
image2.Picture.Bitmap.Height:=image1.picture.width;
image2.Picture.Bitmap.Width:=image1.picture.height;
for i:=0 to image1.Height do
for j:=0 to image1.Width do
image2.canvas.Pixels[(-i+ image1.Height),j]:=image1.canvas.Pixels[j,i];
end;
4. 编写“旋转180度”按钮的On Click事件。
procedure TForm1.Button3Click(Sender: TObject);
var
i,j:integer;
begin
//确定旋转后位图的大小
image3.Picture.Bitmap.Height:=image1.picture.Height;
image3.Picture.Bitmap.Width:=image1.picture.Width;
for i:=0 to image1.Height do
for j:=0 to image1.Width do
image3.canvas.Pixels[(image1.Width-j),(image1.Height-i)]:=image1.canvas.Pixels[j,i];
end;
5. 编写“旋转270度”按钮的On Click事件。代码和步骤3相似,只需要用image4替换image2,然后用以下的语句替换步骤3
for循环中的原有的语句。
image4.canvas.Pixels[i,(image1.Width-j)]:=image1.canvas.Pixels[j,i];
此程序在Windows95、Delphi3.0环境下运行通过。 (北京 赖立谦)
编程实现文件关联
文件关联的目的是要实现某种扩展名的文件由相应的应用程序来打开,对于编写的应用软件来说,由于一般都有设计者特定的扩展名的数据文件,软件编制者应在程序中实现自动关联而不能由用户手工去实现。下面给出实现文件关联的实用程序。
实现文件关联的核心是对注册表的操作,所有的文件关联都在HKEY—CLASSES—ROOT
下面,要实现文件关联必须在HKEY—CLASSES—ROOT
中增加两个键值,一是和文件扩展名对应的类型说明,二是对这种类型文件的操作所需要执行的应用程序。下面举例说明,本例实现将扩展名为.xyz的文件定义为“我自己的文件”类型,双击此种类型的文件时执行的打开功能使用记事簿程序。实现这一功能需要用到Delphi中的函数RegCreateKey、RegSetValue。实现如下:
在窗体中放置一个按钮,双击按钮写如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
本站地址:http://www.bajiao123.com

