1、WinAPI: ExtractIcon - 获取 EXE、DLL 或 ICO 文件中的图标 //声明: ExtractIcon( hInst: HINST; {调用函数的程序实例} lpszExeFileName: PChar; {文件路径; 文件可以是 *.exe、*.dll、*.ico} nIconIndex: UINT {图标索引} ): HICON; {返回图标句柄; 索引为 0 时返回第一个图标句柄; 索引为 #FFFFFFFF 时返回图标总数} //举例: unit Unit1; interface
2、 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 ShellAP
3、I; {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('
4、文件不存在'); 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);
5、 {画出图标} 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;
6、 end. //效果图: WinAPI: LoadBitmap - 从资源中载入位图 //声明: LoadBitmap( hInstance: HINST; {EXE 或 DLL 的句柄} lpBitmapName: PChar {资源标识符} ): HBITMAP; {返回位图句柄} 这里有示例 WinAPI: LoadCursor - 从资源中载入光标 //声明: LoadCursor( hInstance: HINST; {EXE 或 DLL 的句柄, 0 表示载入系统资源} lpC
7、ursorName: PChar {资源标识符} ): HCURSOR; {返回光标句柄} 这里有示例 //调用系统光标的例子: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Cli
8、ck(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);
9、 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)
10、 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
11、); 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 {资源标识
12、符} ): 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);
13、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
14、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 = MakeIn
15、tResource(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;
16、 {源设备环境句柄} p7, p8, p9, p10: Integer; {源位置与宽高} p11: TBlendFunction {合成方式的数据结构, 见下表} ): BOOL; //TBlendFunction 结构是 _BLENDFUNCTION 的重命名: _BLENDFUNCTION = packed record BlendOp: BYTE; {本例使用了: AC_SRC_OVER = 0} BlendFlags: BYTE; {必须为 0} SourceConsta
17、ntAlpha: 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 TFor
18、m1 = 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
19、 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
20、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 {给 TBlendFu
21、nction 结构赋值} Blend.BlendOp := AC_SRC_OVER; Blend.BlendFlags := 0; Blend.AlphaFormat := 0; Blend.SourceConstantAlpha := Transparency; Windows.AlphaBlend(Canvas.Handle, {因 VCL 有同名属性, 所以指定了是来自 Windows 单元} 10, 10, Bit.Wid
22、th + 10, Bit.Height + 10, Bit.Canvas.Handle, 0, 0, Bit.Width, Bit.Height, Blend ); end; procedure TForm1.TrackBar1Change
23、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 Capti
24、on = '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 = FormD
25、estroy 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 文件是 Windo
26、ws 下的增强图元文件, 本例用最简单的代码创建了一个 EMF 文件. CreateEnhMetaFile( DC: HDC; {所参照的 DC, 为 0 表示参照当前的显示设备} FileName: PChar; {文件名, 为 nil 表示创建内存文件} Rect: PRect; {外接矩形(单位是 0.1 毫米), 为 nil 表示使用最小矩形} Desc: PChar {描述性的说明文本, 可为 nil} ): HDC; unit Unit1; interface uses Windows, M
27、essages, 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: TObje
28、ct); 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);
29、 {关闭并保存} DeleteObject(MetaFileDC); end; end. 增强图元文件的相关函数: CloseEnhMetaFile {} CopyEnhMetaFile {} CreateEnhMetaFile {} DeleteEnhMetaFile {} EnhMetaFileProc {} EnumEnhMetaFile {} GdiComment
30、 {} GetEnhMetaFile {} GetEnhMetaFileBits {} GetEnhMetaFileDescription {} GetEnhMetaFileHeader {} GetEnhMetaFilePaletteEntries {} GetWinMetaFileBits {} PlayEnhMetaFile {} PlayEnhMetaFileRecord {} SetEnhMetaFil
31、eBits {} 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
32、) 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
33、 {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); DeleteEn
34、hMetaFile(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:
35、 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)); {打
36、开} 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, D
37、ialogs, 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 FormMouseMo
38、ve(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: HEN
39、HMETAFILE; 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); e
40、nd; 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
41、 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.Ha
42、ndle, 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
43、 = 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
44、 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 文件时可以同时写入描
45、述性说明; 用 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;
46、 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
47、 {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)); {绘图} Rec
48、tangle(MetaFileDC, 11, 11, 111, 111); {结束编辑、保存文件, 并返回文件句柄} HMetaFile := CloseEnhMetaFile(MetaFileDC); {删除 DC} DeleteObject(MetaFileDC); end; {读取 EMF 文件的说明} procedure TForm1.Button1Click(Sender: TObject); var DescriptionSize: Integer; {说明段的大小} DescriptionBuf: PChar; {接受说明的内
49、存指针} begin {获取大小} DescriptionSize := GetEnhMetaFileDescription(HMetaFile, 0, nil); {分配内存} GetMem(DescriptionBuf, DescriptionSize); {获取说明} GetEnhMetaFileDescription(HMetaFile, DescriptionSize, DescriptionBuf); {显示说明} ShowMessage(DescriptionBuf); {ABCDE} {释放内存} FreeMem(D
50、escriptionBuf); 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 文件[
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818