DELPHI基础教程:Delphi图形图像编程(二)[2]

DELPHI基础教程:Delphi图形图像编程(二)[2],第1张

另外一个问题是 我们希望得到的是鼠标按钮按下和松开这两点所形成的图形 但OnMouseMove却把鼠标轨迹上各点与起始点所形成的所有图形画在屏幕上 这同样是我们不希望看到的 为了解决这些问题 程序定义了鼠标的三个事件

procedure TForm FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X Y: Integer)

begin

Drawing := True;

Image Canvas MoveTo(X Y)

Origin := Point(X Y)

MovePt := Origin;

OriginPanel Caption := Format( Origin: (%d %d) [X Y])

end;

procedure TForm FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X Y: Integer)

begin

if Drawing then

DrawShape(Origin Point(X Y) pmCopy)

Drawing := False;

end;

procedure TForm FormMouseMove(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 TForm SetBrushStyle(Sender: TObject)

begin

with Image Canvas Brush 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 TForm SetPenStyle(Sender: TObject)

begin

with Image Canvas Pen 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 TIcon Tmetafile对象的基类 如果知道图像的具体类型( 如位图 图标元文件) 则应将图像贮存在相应类型的对象中( 如TBitmap TIcon Tmetafile) 否则应该使用可贮存任何图像类型的TPicture对象

TPicture对象

TPicture对象可以保存位图 图标或元文件 Graphic属性中包括图像的类型 图像的高度和宽度分别定义在Height Width属性中 调用LoadFromFile方法 可以从文件中装载一幅图像

procedure TForm FormCreate(Sender: TObject)

begin

BitBtn Glyph LoadFromFile( TARTAN BMP )

end;

要保存一个位图 则要用SaveToFile方法 要把图像复制到剪切板 可以调用TClipboard对象的Assign方法

TImage部件

TImage部件用以在窗体中显示图像 它的Picture 属性保存着要显示的图像 这是一个TPicture对象 AutoSize Stretch属性是用来调节部件与图像的大小的 当AutoSize 为真值时 TImage部件将根据它所包含的图像的大小来调整自身的大小 当AutoSize为假值时 不论图像有多大 部件将保持设计时的大小 如果部件比图像小 那么只有一部分图像是可见的 当Stretch为真值时 位图像将根据部件的大小调整自身的大小 当部件大小改变时 元文件也做相应变化 Stretch属性对图标没有作用

TBitmap Object(位图对象)

位图对象包含一个位图图像 有HBITMAP HPALETE句柄 可自动管理调色板 位图对象也有画布属性 位图的Palette属性用来控制位图的颜色映射 它包括 种可显示的颜色 如果应用程序用前景色绘制位图 Palette 属性的颜色将被加入Windows系统调色板 其它颜色被映射到系统调色板已存在的颜色 如果应用程序用自己的颜色绘制位图 而其它程序已占有系统调色板 位图的颜色将被映射到系统调色板中

如果Monochrome属性设置成假 位图将显示成彩色 反之显示成黑白色

调用Draw和StretchDraw方法可在画布上绘制位图

图像对象的应用

本章例程中 单击(文件|浏览)菜单项 将d出一个图像浏览窗体 如果用户在窗体中选择文件列表框的图形文件 窗体右上角的图像部件上将出现此文件所代表的图像 若选择 雕刻效果 按钮中检查框 窗体中的加速按钮和位图按钮上将出现位图

以下代码是将图像文件装载至图像部件上

procedure TImageForm FileListBox Click(Sender: TObject)

var

FileExt: string[ ];

begin

FileExt := UpperCase(ExtractFileExt(FileListBox Filename))

if (FileExt = BMP ) or (FileExt = ICO ) or (FileExt = WMF ) then

begin

Image Picture LoadFromFile(FileListBox Filename)

Label Caption := ExtractFilename(FileListBox Filename)

if (FileExt = BMP ) then

begin

Label Caption := Label Caption +

Format( (%d x %d) [Image Picture Height Image Picture Width])

ViewForm Image Picture Bitmap := Image Picture Bitmap;

ViewAsGlyph(FileExt)

end;

if FileExt = ICO then Icon := Image Picture Icon;

if FileExt = WMF then

ViewForm Image Picture Metafile := Image Picture Metafile;

end;

end;

这个过程首先判断文件类型 如果是图像文件 则将图像装载至图像部件上 并在标签上列出文件名称 如果是位图文件 还将显示其大小

lishixinzhi/Article/program/Delphi/201311/25244

这是一段设置 distextedit 颜色方案(也就是显示的颜色)的程序段

QPalette palette=distextedit->palette();

// 创建一个调色板对象,该对象与distextedit现有配色方案一致

//(因为程序只改变 Base 的颜色,而其它颜色不变)

const QColor&color=QColorDialog::getColor(palettecolor(QPalette::Base),this);

// 利用颜色对话框让用户选择颜色,并存储于color中

if (colorisValid())

// 检测color是否有效(用户可能选择了对话框中的取消按钮)

{

palettesetColor(QPalette::Base,color);

// 设置调试板中的Base颜色为用户选择的那个颜色color

distextedit->setPalette(palette);

// 设置distextedit的调色板为palette,也就是Base的颜色改成了color,

}

QT动态改变控件背景颜色:用QPalette得到一个颜色m_penColor,如何让一个pushbutton动态的显示m_penColor的颜色,color->setStyleSheet("background-color:XXXX;"),这个只能静态地改变控件的颜色,如何利用m_penColor动态改变按键颜色

常用的颜色:

调色板:(1)snsset_palette() (2) snscolor_palette()

一般用调色板两种方式。1直接配置固定的调色板,

2把调色板作为颜色列表保存下来。再利用里面的一些颜色。

注:为什么用调色板颜色,

一般调色板里配置的颜色在一些应用场景里比较合理,两级,连续,都有对应的调色板使用。

修改默认的调色板

snsset_palette('coolwarm')

配置一个全局的调色板,不同的图像在同一个画布中展示的时候,会利用调色板的颜色。

同一个图像中,有不同c值设定的数据,也会掉用调色板的颜色

可以是cmap参数来显示配置一个调色板供当前视图使用。

deep, muted, bright, pastel, dark, colorblind

获取调色板,返回一组颜色

3例:

snsset_palette('coolwarm')

此时可以用圆形调色板 hls husl

husl的特点:

dark 从黑到颜色,light 从白到颜色 cyan天蓝色

使用连续值映射颜色

离散调色板

定制离散调色板

//自定义背景颜色

HSSFPalette palette = ((HSSFWorkbook) wb)getCustomPalette();

palettesetColorAtIndex(HSSFColorLIMEindex, (byte)234, (byte)234, (byte)234);

titleStylesetFillForegroundColor(HSSFColorLIMEindex);

titleStylesetFillPattern(HSSFCellStyleSOLID_FOREGROUND);

//自定义字体颜色

palettesetColorAtIndex(HSSFColorSEA_GREENindex, (byte)23, (byte)110, (byte)169);

Font titleFont = wbcreateFont();

titleFontsetBoldweight(FontBOLDWEIGHT_BOLD);

titleFontsetFontHeight((short)200);

titleFontsetColor(HSSFColorSEA_GREENindex);

titleStylesetFont(titleFont);

titleStylesetFillBackgroundColor(FontCOLOR_NORMAL);

以上就是关于DELPHI基础教程:Delphi图形图像编程(二)[2]全部的内容,包括:DELPHI基础教程:Delphi图形图像编程(二)[2]、palette.setcolor、QT动态改变控件背景颜色:用QPalette得到一个颜色m_penColor,如何让一个pushb等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9406558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存