收藏 分销(赏)

API图像函数(delphi).doc

上传人:仙人****88 文档编号:9458621 上传时间:2025-03-27 格式:DOC 页数:43 大小:613KB
下载 相关 举报
API图像函数(delphi).doc_第1页
第1页 / 共43页
API图像函数(delphi).doc_第2页
第2页 / 共43页
点击查看更多>>
资源描述
WinAPI: ExtractIcon - 获取 EXE、DLL 或 ICO 文件中的图标 //声明: ExtractIcon( hInst: HINST; {调用函数的程序实例} lpszExeFileName: PChar; {文件路径; 文件可以是 *.exe、*.dll、*.ico} nIconIndex: UINT {图标索引} ): HICON; {返回图标句柄; 索引为 0 时返回第一个图标句柄; 索引为 #FFFFFFFF 时返回图标总数} //举例: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} uses ShellAPI; {ExtractIcon 在其中声明} procedure TForm1.Button1Click(Sender: TObject); var ico: TIcon; i,count,x,y,w,h: Integer; FilePath: string; begin {随便找了个路径, 如果缺失会退出} FilePath := 'C:\Program Files\Macromedia\Fireworks 8\Fireworks.exe'; if not FileExists(FilePath) then begin ShowMessage('文件不存在'); Exit; end; ico := TIcon.Create; x := 10; y := 10; w := 0; h := 0; Repaint; {先算出文件内的图标总数} count := ExtractIcon(HInstance, PChar(FilePath), HICON(-1)); for i := 0 to count - 1 do begin {循环提取图标} ico.Handle := ExtractIcon(HInstance, PChar(FilePath), i); {画出图标} Canvas.Draw(x,y,ico); {下面只是调整显示位置} if w < ico.Width then w := ico.Width; if h < ico.Height then h := ico.Height; x := x + ico.Width + 10; if x >= ClientWidth - w then begin x := 10; y := y + h + 10; end; end; ico.Free; end; end. //效果图: WinAPI: LoadBitmap - 从资源中载入位图 //声明: LoadBitmap( hInstance: HINST; {EXE 或 DLL 的句柄} lpBitmapName: PChar {资源标识符} ): HBITMAP; {返回位图句柄} 这里有示例 WinAPI: LoadCursor - 从资源中载入光标 //声明: LoadCursor( hInstance: HINST; {EXE 或 DLL 的句柄, 0 表示载入系统资源} lpCursorName: PChar {资源标识符} ): HCURSOR; {返回光标句柄} 这里有示例 //调用系统光标的例子: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var cur: TIcon; begin cur := TIcon.Create; cur.Handle := LoadCursor(0, IDC_HAND); Canvas.Draw(11,11,cur); cur.Handle := LoadCursor(0, IDC_HELP); Canvas.Draw(44,11,cur); cur.Free; end; end. //效果图: //附系统光标列表: IDC_ARROW = MakeIntResource(32512); IDC_IBEAM = MakeIntResource(32513); IDC_WAIT = MakeIntResource(32514); IDC_CROSS = MakeIntResource(32515); IDC_UPARROW = MakeIntResource(32516); IDC_SIZE = MakeIntResource(32640); IDC_ICON = MakeIntResource(32641); IDC_SIZENWSE = MakeIntResource(32642); IDC_SIZENESW = MakeIntResource(32643); IDC_SIZEWE = MakeIntResource(32644); IDC_SIZENS = MakeIntResource(32645); IDC_SIZEALL = MakeIntResource(32646); IDC_NO = MakeIntResource(32648); IDC_HAND = MakeIntResource(32649); IDC_APPSTARTING = MakeIntResource(32650); IDC_HELP = MakeIntResource(32651); WinAPI: LoadIcon - 从资源中载入图标 //声明: LoadIcon( hInstance: HINST; {EXE 或 DLL 的句柄, 0 表示载入系统资源} lpIconName: PChar {资源标识符} ): HICON; {返回图标句柄} 这里有示例 //调用系统图标的例子: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var ico: TIcon; i,x: Integer; begin ico := TIcon.Create; x := 10; for i := 32512 to 32517 do begin ico.Handle := LoadIcon(0, MakeIntResource(i)); Canvas.Draw(x,10,ico); Inc(x,ico.Width+10); end; ico.Free; end; end. //效果图: //附系统图标列表: IDI_APPLICATION = MakeIntResource(32512); IDI_HAND = MakeIntResource(32513); IDI_QUESTION = MakeIntResource(32514); IDI_EXCLAMATION = MakeIntResource(32515); IDI_ASTERISK = MakeIntResource(32516); IDI_WINLOGO = MakeIntResource(32517); IDI_WARNING = IDI_EXCLAMATION; IDI_ERROR = IDI_HAND; IDI_INFORMATION = IDI_ASTERISK; WinAPI: AlphaBlend - 图像透明度 AlphaBlend( DC: HDC; {目标设备环境句柄} p2, p3, p4, p5: Integer; {目标位置与宽高} DC6: HDC; {源设备环境句柄} p7, p8, p9, p10: Integer; {源位置与宽高} p11: TBlendFunction {合成方式的数据结构, 见下表} ): BOOL; //TBlendFunction 结构是 _BLENDFUNCTION 的重命名: _BLENDFUNCTION = packed record BlendOp: BYTE; {本例使用了: AC_SRC_OVER = 0} BlendFlags: BYTE; {必须为 0} SourceConstantAlpha: BYTE; {透明度: 0..255} AlphaFormat: BYTE; {通常为 0,如果源位图为32位真彩色,可为 AC_SRC_ALPHA } end; 本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type TForm1 = class(TForm) TrackBar1: TTrackBar; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure FormDestroy(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var Bit,BitBack: TBitmap; Transparency: Byte = 255; {透明度} procedure TForm1.FormCreate(Sender: TObject); begin {设定窗体背景} BitBack := TBitmap.Create; BitBack.LoadFromFile('c:\temp\Back.bmp'); Brush.Bitmap := BitBack; {调入图片} Bit := TBitmap.Create; Bit.LoadFromFile('c:\temp\test.bmp'); {给 TrackBar1 初始化} TrackBar1.Max := 255; TrackBar1.Min := 0; TrackBar1.ShowSelRange := False; TrackBar1.Position := TrackBar1.Max; end; procedure TForm1.FormPaint(Sender: TObject); var Blend: TBlendFunction; {定义 AlphaBlend 要使用的 TBlendFunction 结构} begin {给 TBlendFunction 结构赋值} Blend.BlendOp := AC_SRC_OVER; Blend.BlendFlags := 0; Blend.AlphaFormat := 0; Blend.SourceConstantAlpha := Transparency; Windows.AlphaBlend(Canvas.Handle, {因 VCL 有同名属性, 所以指定了是来自 Windows 单元} 10, 10, Bit.Width + 10, Bit.Height + 10, Bit.Canvas.Handle, 0, 0, Bit.Width, Bit.Height, Blend ); end; procedure TForm1.TrackBar1Change(Sender: TObject); begin Transparency := TrackBar1.Position; Text := IntToStr(Transparency); Self.Repaint; {命令重绘} end; procedure TForm1.FormDestroy(Sender: TObject); begin Bit.Free; BitBack.Free; end; end. 窗体设计: object Form1: TForm1 Left = 352 Top = 238 Caption = 'Form1' ClientHeight = 209 ClientWidth = 211 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Position = poDesigned OnCreate = FormCreate OnDestroy = FormDestroy OnPaint = FormPaint PixelsPerInch = 96 TextHeight = 13 object TrackBar1: TTrackBar Left = 0 Top = 186 Width = 201 Height = 24 TabOrder = 0 OnChange = TrackBar1Change end end 用 GDI 操作 EMF 文件[1]: CreateEnhMetaFile、CloseEnhMetaFile EMF 文件是 Windows 下的增强图元文件, 本例用最简单的代码创建了一个 EMF 文件. CreateEnhMetaFile( DC: HDC; {所参照的 DC, 为 0 表示参照当前的显示设备} FileName: PChar; {文件名, 为 nil 表示创建内存文件} Rect: PRect; {外接矩形(单位是 0.1 毫米), 为 nil 表示使用最小矩形} Desc: PChar {描述性的说明文本, 可为 nil} ): HDC; unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); const Path = 'C:\Temp\MyMetaFile.emf'; {CreateEnhMetaFile 创建文件时, 存在则覆盖} var MetaFileDC: HDC; {EMF 文件 DC} begin MetaFileDC := CreateEnhMetaFile(0, PChar(Path), nil, nil); {建立} Ellipse(MetaFileDC, 10, 10, 100, 60); {绘制} CloseEnhMetaFile(MetaFileDC); {关闭并保存} DeleteObject(MetaFileDC); end; end. 增强图元文件的相关函数: CloseEnhMetaFile {} CopyEnhMetaFile {} CreateEnhMetaFile {} DeleteEnhMetaFile {} EnhMetaFileProc {} EnumEnhMetaFile {} GdiComment {} GetEnhMetaFile {} GetEnhMetaFileBits {} GetEnhMetaFileDescription {} GetEnhMetaFileHeader {} GetEnhMetaFilePaletteEntries {} GetWinMetaFileBits {} PlayEnhMetaFile {} PlayEnhMetaFileRecord {} SetEnhMetaFileBits {} SetWinMetaFileBits {} 用 GDI 操作 EMF 文件[2]: PlayEnhMetaFile、DeleteEnhMetaFile 创建 EMF 文件, 并同时绘制在窗体. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); const Path = 'C:\Temp\MyMetaFile.emf'; var MetaFileDC: HDC; {EMF 画布句柄} HMetaFile: HENHMETAFILE; {EMF 文件句柄} begin MetaFileDC := CreateEnhMetaFile(0, PChar(Path), nil, nil); Ellipse(MetaFileDC, 10, 10, 100, 60); HMetaFile := CloseEnhMetaFile(MetaFileDC); {在窗体上按原始大小绘制 EMF} PlayEnhMetaFile(Canvas.Handle, HMetaFile, Rect(10,10,100,60)); DeleteObject(MetaFileDC); DeleteEnhMetaFile(HMetaFile); end; end. 用 GDI 操作 EMF 文件[3]: GetEnhMetaFile unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); const Path = 'C:\Temp\MyMetaFile.emf'; {假定这个文件还在} var HMetaFile: HENHMETAFILE; {EMF 文件句柄} begin HMetaFile := GetEnhMetaFile(PChar(Path)); {打开} PlayEnhMetaFile(Canvas.Handle, HMetaFile, Rect(10,10,100,60)); {重新绘制 EMF} DeleteEnhMetaFile(HMetaFile); end; end. 用 GDI 操作 EMF 文件[4]: 重绘 EMF 本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var HMetaFile: HENHMETAFILE; f: Boolean; x1,y1: Integer; R: TRect; procedure TForm1.FormCreate(Sender: TObject); const Path = 'C:\Temp\MyMetaFile.emf'; begin HMetaFile := GetEnhMetaFile(PChar(Path)); end; procedure TForm1.FormDestroy(Sender: TObject); begin DeleteEnhMetaFile(HMetaFile); end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin f := True; x1 := X; y1 := Y; R := Rect(x1,y1,X,Y); end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if not f then Exit; DrawFocusRect(Canvas.Handle, R); R := Rect(x1,y1,X,Y); DrawFocusRect(Canvas.Handle, R); R := Rect(x1,y1,X,Y); end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin f := False; PlayEnhMetaFile(Canvas.Handle, HMetaFile, R); end; procedure TForm1.Button1Click(Sender: TObject); begin Refresh; end; end. 窗体文件: object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 206 ClientWidth = 339 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Position = poDesktopCenter OnCreate = FormCreate OnDestroy = FormDestroy OnMouseDown = FormMouseDown OnMouseMove = FormMouseMove OnMouseUp = FormMouseUp PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 256 Top = 173 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end end 用 GDI 操作 EMF 文件[5]: GetEnhMetaFileDescription - 获取 EMF 文件的说明文本 再用 CreateEnhMetaFile 函数建立 EMF 文件时可以同时写入描述性说明; 用 GetEnhMetaFileDescription 函数可以读出 EMF 文件的说明文本. 本例给的说明文本非常简单, 不过标准的说明文本的格式应该是: 程序名#0文件标题#0#0 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var HMetaFile: HENHMETAFILE; {EMF 文件句柄} {建立带说明的 EMF 文件} procedure TForm1.FormCreate(Sender: TObject); const Path = 'C:\Temp\MyMeateFile.emf'; Description = 'ABCDE'; {当作 EMF 文件的说明} var MetaFileDC: HDC; begin {建立并写入说明} MetaFileDC := CreateEnhMetaFile(0, PChar(Path), nil, PChar(Description)); {绘图} Rectangle(MetaFileDC, 11, 11, 111, 111); {结束编辑、保存文件, 并返回文件句柄} HMetaFile := CloseEnhMetaFile(MetaFileDC); {删除 DC} DeleteObject(MetaFileDC); end; {读取 EMF 文件的说明} procedure TForm1.Button1Click(Sender: TObject); var DescriptionSize: Integer; {说明段的大小} DescriptionBuf: PChar; {接受说明的内存指针} begin {获取大小} DescriptionSize := GetEnhMetaFileDescription(HMetaFile, 0, nil); {分配内存} GetMem(DescriptionBuf, DescriptionSize); {获取说明} GetEnhMetaFileDescription(HMetaFile, DescriptionSize, DescriptionBuf); {显示说明} ShowMessage(DescriptionBuf); {ABCDE} {释放内存} FreeMem(DescriptionBuf); end; {绘制在窗体} procedure TForm1.Button2Click(Sender: TObject); begin PlayEnhMetaFile(Canvas.Handle, HMetaFile, Rect(11,11,111,111)); end; {删除 EMF 文件句柄} procedure TForm1.FormDestroy(Sender: TObject); begin DeleteEnhMetaFile(HMetaFile); end; end. 用 GDI 操作 EMF 文件[
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服