另外一个问题是 我们希望得到的是鼠标按钮按下和松开这两点所形成的图形但OnMouseMove却把鼠标轨迹上各点与起始点所形成的所有图形画在屏幕上这同样是我们不希望看到的为了解决这些问题程序定义了鼠标的三个事件
procedure TFormFormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X Y: Integer)
begin
Drawing := True;
ImageCanvasMoveTo(X Y)
Origin := Point(X Y)
MovePt := Origin;
OriginPanelCaption := Format(Origin: (%d %d) [X Y])
end;
procedure TFormFormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X Y: Integer)
begin
if Drawing then
DrawShape(Origin Point(X Y) pmCopy)
Drawing := False;
end;
procedure TFormFormMouseMove(Sender: TObject; Shift: TShiftState; X
Y: Integer)
begin
if Drawing then
begin
DrawShape(Origin MovePt pmNotXor)
MovePt := Point(X Y)
DrawShape(Origin MovePt pmNotXor)
end;
MovePt用来记录鼠标当前位置当下次鼠标移动时 就能在上次鼠标绘制的图形上画一个形状大小一样的图形并把画笔颜色设置成PmNotXor使上次绘制的图形颜色变成了屏幕颜色从而达到橡皮擦的效果
将画笔画刷的Style属性设置成用户希望的值可实现对画笔和画刷风格的选择
procedure TFormSetBrushStyle(Sender: TObject)
begin
with ImageCanvasBrush do
begin
if Sender = SolidBrush then Style := bsSolid
else if Sender = ClearBrush then Style := bsClear
else if Sender = HorizontalBrush then Style := bsHorizontal
else if Sender = VerticalBrush then Style := bsVertical
else if Sender = FDiagonalBrush then Style := bsFDiagonal
else if Sender = BDiagonalBrush then Style := bsBDiagonal
else if Sender = CrossBrush then Style := bsCross
else if Sender = DiagCrossBrush then Style := bsDiagCross;
end;
procedure TFormSetPenStyle(Sender: TObject)
begin
with ImageCanvasPen do
begin
if Sender = SolidPen then Style := psSolid
else if Sender = DashPen then Style := psDash
else if Sender = DotPen then Style := psDot
else if Sender = DashDotPen then Style := psDashDot
else if Sender = DashDotDotPen then Style := psDashDotDot
else if Sender = ClearPen then Style := psClear;
end;
end;
图像对象概述
TGraphic对象
TGraphic对象是TBitmap TIconTmetafile对象的基类如果知道图像的具体类型( 如位图 图标元文件) 则应将图像贮存在相应类型的对象中( 如TBitmapTIconTmetafile)否则应该使用可贮存任何图像类型的TPicture对象
TPicture对象
TPicture对象可以保存位图图标或元文件Graphic属性中包括图像的类型图像的高度和宽度分别定义在HeightWidth属性中调用LoadFromFile方法可以从文件中装载一幅图像
procedure TFormFormCreate(Sender: TObject)
begin
BitBtnGlyphLoadFromFile(TARTANBMP)
end;
要保存一个位图则要用SaveToFile方法要把图像复制到剪切板可以调用TClipboard对象的Assign方法
TImage部件
TImage部件用以在窗体中显示图像它的Picture 属性保存着要显示的图像 这是一个TPicture对象AutoSizeStretch属性是用来调节部件与图像的大小的当AutoSize 为真值时TImage部件将根据它所包含的图像的大小来调整自身的大小当AutoSize为假值时不论图像有多大部件将保持设计时的大小如果部件比图像小 那么只有一部分图像是可见的当Stretch为真值时位图像将根据部件的大小调整自身的大小当部件大小改变时元文件也做相应变化Stretch属性对图标没有作用
TBitmap Object(位图对象)
位图对象包含一个位图图像有HBITMAPHPALETE句柄可自动管理调色板位图对象也有画布属性位图的Palette属性用来控制位图的颜色映射它包括种可显示的颜色 如果应用程序用前景色绘制位图Palette 属性的颜色将被加入Windows系统调色板其它颜色被映射到系统调色板已存在的颜色如果应用程序用自己的颜色绘制位图而其它程序已占有系统调色板位图的颜色将被映射到系统调色板中
如果Monochrome属性设置成假位图将显示成彩色反之显示成黑白色
调用Draw和StretchDraw方法可在画布上绘制位图
图像对象的应用
本章例程中单击(文件|浏览)菜单项将弹出一个图像浏览窗体如果用户在窗体中选择文件列表框的图形文件窗体右上角的图像部件上将出现此文件所代表的图像若选择雕刻效果按钮中检查框窗体中的加速按钮和位图按钮上将出现位图
以下代码是将图像文件装载至图像部件上
procedure TImageFormFileListBoxClick(Sender: TObject)
var
FileExt: string[];
begin
FileExt := UpperCase(ExtractFileExt(FileListBoxFilename))
if (FileExt = BMP) or (FileExt = ICO) or (FileExt = WMF) then
begin
ImagePictureLoadFromFile(FileListBoxFilename)
LabelCaption := ExtractFilename(FileListBoxFilename)
if (FileExt = BMP) then
begin
LabelCaption := LabelCaption +
Format( (%d x %d) [ImagePictureHeight ImagePictureWidth])
ViewFormImagePictureBitmap := ImagePictureBitmap;
ViewAsGlyph(FileExt)
end;
if FileExt = ICO then Icon := ImagePictureIcon;
if FileExt = WMF then
ViewFormImagePictureMetafile := ImagePictureMetafile;
end;
end;
这个过程首先判断文件类型如果是图像文件则将图像装载至图像部件上并在标签上列出文件名称如果是位图文件还将显示其大小
[] [] []