1、*.rc 文件算是资源文件(*.res) 的源文件, 在程序编译过程中会编译成同名的res 文件;2、上面的例子是个特例, 一般我们不能使用和工程同名的资源文件;3、MainIcon ICON "c:\temp\my.ico" 中的ICON 说明这是一个图标资源, MainIcon 是该资源的标识符, 这个标识符应该是可以自定义的, 不过在这个特例中, 只能使用MainIcon , 因为程序要从同名的资源文件中查找标识为MainIc on 的资源做图标.学习使用资源文件[2] - Ico现在要做一个携带两个图标的资源文件, 并调用的例子.1、首先建新工程, 保存, 注意这次我们不删除{$R *.res}2、复制两个ico 文件到工程目录, 譬如文件是: IcoFile_1.ico、IcoFile_2.ico3、建立文本文件输入:ico1 ICON IcoFile_1.icoico2 ICON IcoFile_2.ico然后保存为: MyRes.rc, 并Add 到工程中, 如图:4、此时的工程文件会自动插入: {$R 'MyRes.res' 'MyRes.rc'}5、添加四个按钮, 实现代码如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure Button4Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}//使用资源中的第一个自定义图标procedure TForm1.Button1Click(Sender: TObject);beginApplication.Icon.Handle := LoadIcon(HInstance, 'ico1');{HInstance 当前程序实例的句柄, 调用资源文件一定要用到它;ico1 是资源文件的标识符;LoadIcon 是个API 函数, 专门用于调用资源中的 ico 文件, 它返回的是指定 ico 文件的句柄.}end;//使用资源中的第二个自定义图标procedure TForm1.Button2Click(Sender: TObject);beginApplication.Icon.Handle := LoadIcon(HInstance, 'ico2');end;//使用资源中默认的程序图标procedure TForm1.Button3Click(Sender: TObject);beginApplication.Icon.Handle := LoadIcon(HInstance, 'MainIcon');end;//不使用图标(会显示Windows 系统的默认图标)procedure TForm1.Button4Click(Sender: TObject);beginApplication.Icon := nil;end;end.//效果图:注释:1、此时的MyRes.rc 被编译成了MyRes.res;2、此时的IcoFile_1.ico、IcoFile_2.ico 文件被编译进MyRes.res;3、此时的MyRes.res 文件也被编译到Project1.exe 中了.学习使用资源文件[3] - 用Image 显示资源中的图片首先编辑rc 文件如下(假定图片文件放在程序目录下的img 文件夹下):bmp1 BITMAP img\bmpFile1.bmpbmp2 BITMAP img\bmpFile2.bmp或者:bmp1,BITMAP,img\bmpFile1.bmpbmp2,BITMAP,img\bmpFile2.bmp然后在窗体上添加一个Image、两个Button, 代码如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;typeTForm1 = class(TForm)Image1: TImage;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure FormCreate(Sender: TObject);end;varForm1: TForm1;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}varbit: TBitmap;procedure TForm1.FormCreate(Sender: TObject);beginbit := TBitmap.Create;end;//对只有编号的图片资源需要用 LoadFromResourceID 调用procedure TForm1.Button1Click(Sender: TObject);beginbit := TBitmap.Create;bit.LoadFromResourceID(HInstance, 1);Self.Brush.Bitmap := bit;Repaint;end;procedure TForm1.Button2Click(Sender: TObject);beginbit := TBitmap.Create;bit.LoadFromResourceID(HInstance, 2);Self.Brush.Bitmap := bit;Repaint;end;procedure TForm1.FormDestroy(Sender: TObject);学习使用资源文件[5] - 鼠标指针资源//rc 文件:cur1 CURSOR cur\kyodai.curcur2 CURSOR cur\static.cur//或者cur1,CURSOR,cur\kyodai.curcur2,CURSOR,cur\static.cur//程序代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;typeTForm1 = class(TForm)Panel1: TPanel;Panel2: TPanel;procedure FormCreate(Sender: TObject);end;varunit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;typeTForm1 = class(TForm)procedure FormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);varhm: HMENU;beginhm := LoadMenu(HInstance, 'MyMenu1');SetMenu(Handle, hm);end;end.//效果图:学习使用资源文件[7] - 字符串资源//rc 文件:StringTablebegin0 "AAAA"1 "BBBB"2 "CCCC"3 "DDDD"end//也可以这样写:StringTablebegin0,"AAAA"1,"BBBB"2,"CCCC"3,"DDDD"end//还可以这样写:StringTable{0,"AAAA"1,"BBBB"2,"CCCC"3,"DDDD"}{严格的头可能是这样写: STRINGTABLE DISCARDABLE}//程序代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;procedure FormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);beginMemo1.Clear;Self.Handle 是窗体的句柄;Application.Handle 也是个窗口的句柄, 不过这个窗口很小, 在任务栏上;HInstance 是程序实例的句柄; 同一个程序可能会有几个副本同时允许, 每个副本当然会有不同的句柄.//代码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem; {下面用到的 sndPlaySound、PlaySound 都是在此单元声明的}procedure TForm1.Button1Click(Sender: TObject);varrs: TResourceStream;beginrs := TResourceStream.Create(HInstance, 'sound1', 'WAVE');sndPlaySound(rs.Memory, SND_ASYNC or SND_MEMORY);rs.Free;end;procedure TForm1.Button2Click(Sender: TObject);varrs: TResourceStream;beginrs := TResourceStream.Create(HInstance, 'sound2', 'WAVE');PlaySound(rs.Memory, HInstance, SND_ASYNC or SND_MEMORY);rs.Free;end;end.typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);varrs: TResourceStream;beginrs := TResourceStream.Create(HInstance, 'MyFile1', RT_RCDATA); rs.SaveToFile('c:\temp\pad.exe');WinExec('c:\temp\pad.exe', 1);rs.Free;end;procedure TForm1.Button2Click(Sender: TObject);varrs: TResourceStream;beginrs := TResourceStream.Create(HInstance, 'MyFile2', 'MyRes');rs.SaveToFile('c:\temp\sum.exe');WinExec('c:\temp\sum.exe', 1);rs.Free;end;end.Windows,Messages,SysUtils;function WndProc(wnd: HWND; msg: UINT; wParam: Integer; lParam: Integer): In teger; stdcall;beginResult := 0;case msg ofWM_DESTROY : PostQuitMessage(0);elseResult := DefWindowProc(wnd, msg, wParam, lParam);end;end;function RegMyWndClass: Boolean;varcls: TWndClass;begincls.style := CS_HREDRAW or CS_VREDRAW;cls.lpfnWndProc := @WndProc;cls.cbClsExtra := 0;cls.cbWndExtra := 0;cls.hInstance := HInstance;cls.hIcon := 0;cls.hCursor := LoadCursor(0, IDC_ARROW);cls.hbrBackground := HBRUSH(COLOR_WINDOW + 1);cls.lpszMenuName := 'MyMenu1'; {在这里指定菜单资源, MyMenu1 是编辑资源文件时命名的}cls.lpszClassName := 'MyWnd';Result := RegisterClass(cls) <> 0;end;{程序入口}consttit = 'New Form';效果图:MENUITEM "Cu&t",201MENUITEM "&Copy" ,202MENUITEM "&Paste",203ENDPOPUP "&Help" ,65535BEGINMENUITEM "&About",301ENDEND解释一下:1. 以前是使用MENU 标识菜单资源的; 用MENUEX 会有更多功能.2、就像Delphi 一样, 它们使用BEGIN 与END 划分语句块, 也可以用C/C++ 语言的方式: { ... }; 还有它的注释也是 C 语言格式的.3、MyMenu1 MENUEX 中的MyMenu1 是自定义的该菜单的标识.4、MyMenu1 MENUEX 后面可以有关于载入和释放的控制符: PRELOAD、MOVEABLE PURE、DISCARDABLE(这个我没找到权威资料, 有谁知道, 万望告诉我; DISCARDABLE 用的最多, 可能是该资源没被使用可以忽略的意思).5、POPUP 表示这是一个弹出菜单项, 也就是: 它有下级菜单; 大家习惯用65535 做标识.6、MENUITEM 表示一个菜单项, MENUITEM SEPARATOR 表示一个菜单分隔符.7、MENUITEM 的第一个参数是要显示的文本, & 用来指定加速键.8、MENUITEM 的第二个参数(参数用, 号隔开)是该菜单项的标识, 是一个整数值(1-65535); 当用户点击菜单时, 会送出WM_COMMAND 消息, 消息的wParam 参数就是这个标识, 从而让我们知道点击的是哪一个菜单项; 这个标识有点像句柄, 一般在操作这个菜单项时也需要这个标识.现在要解决一个问题: 这些MENUITEM 的标识101、102、103 等等不好记忆, 如果定义成有字面意义的常量就好了.在Delphi 中使用const 定义常量, 但资源文件是系统级的, 需要用C/C++ 的方法来定义常量. 这样我们可以修改如下:#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301POPUP "&File" ,65535BEGINMENUITEM "&New",IDM_NewMENUITEM "&Open" ,IDM_OpenMENUITEM "&Save" ,IDM_SaveMENUITEM SEPARATORMENUITEM "E&xit" ,IDM_ExitENDPOPUP "&Edit" ,65535BEGINMENUITEM "Cu&t",IDM_CutMENUITEM "&Copy" ,IDM_CopyMENUITEM "&Paste",IDM_PasteENDPOPUP "&Help" ,65535BEGINMENUITEM "&About",IDM_AboutENDEND继续研究: 每一个菜单项后面可以有很多参数来指定不同的功能和显示效果.譬如: MFT_STRING(是字符串)、MFS_CHECKED(选择)、MFS_GRAYED(禁用)、MFT_RIGHTJUSTIFY(显示在右边)等等, 示例如下:#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGINPOPUP "&File" ,65535BEGIN#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGINPOPUP "&File" ,65535 ,MFT_RIGHTORDER BEGINMENUITEM "&New",IDM_NewMENUITEM "&Open" ,IDM_OpenMENUITEM "&Save" ,IDM_SaveMENUITEM SEPARATORMENUITEM "E&xit" ,IDM_ExitENDPOPUP "&Edit" ,65535BEGINMENUITEM "Cu&t",IDM_CutMENUITEM "&Copy" ,IDM_CopyMENUITEM "&Paste",IDM_PasteENDPOPUP "&Help" ,65535BEGINMENUITEM "&About",IDM_AboutENDENDBEGINMENUITEM "&New",IDM_New ,MFT_STRING | MFT_RIGHTORDER ,MFS_DEFAULT | MFS_CHECKED | MFS_GRAYEDMENUITEM "&Open" ,IDM_Open ,MFT_STRING, MFS_HILITEMENUITEM "&Save" ,IDM_SaveMENUITEM SEPARATORMENUITEM "E&xit" ,IDM_ExitENDPOPUP "&Edit" ,65535BEGINMENUITEM "Cu&t",IDM_CutMENUITEM "&Copy" ,IDM_CopyMENUITEM "&Paste",IDM_PasteENDPOPUP "&Help" ,65535BEGINMENUITEM "&About",IDM_AboutENDEND显示效果图:WinAPI: LoadString - 从资源中载入字符串//声明:LoadString(hInstance: HINST; {EXE 或 DLL 的句柄}uID: UINT; {资源 ID}lpBuffer: PChar; {缓冲区}Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses ShellAPI; {ExtractIcon 在其中声明}procedure TForm1.Button1Click(Sender: TObject);varico: TIcon;i,count,x,y,w,h: Integer;FilePath: string;begin{随便找了个路径, 如果缺失会退出}FilePath := 'C:\Program Files\Macromedia\Fireworks 8\Fireworks.exe';if not FileExists(FilePath) thenbeginShowMessage('文件不存在');Exit;end;ico := TIcon.Create;x := 10; y := 10; w := 0; h := 0;Repaint;{先算出文件内的图标总数}count := ExtractIcon(HInstance, PChar(FilePath), HICON(-1));for i := 0to count - 1dobegin{循环提取图标}ico.Handle := ExtractIcon(HInstance, PChar(FilePath), i);{画出图标}。