如何关联图片--求朋友帮助!(50分)

  • 主题发起人 主题发起人 webbios
  • 开始时间 开始时间
W

webbios

Unregistered / Unconfirmed
GUEST, unregistred user!
在做一个看图软件时,需要关联图片,就是如同acdsee一样,能够在安装之后,将所有图片格式的文件,让其显示偶的图片标志,谢谢高手赐教!
 
需要改注册表吧`````不过不知道在哪个地方啊```
 
这些问题都不知道问过多少遍了 :-(

// 枚举出所有你要支持的图片扩展:
// 然后用下面的方法关联
1,2.举例,关联 .abc 类型的文件,并关联当前文件的图标(可以是exe,dll,ico)
procedure TMainForm.AddABCReg;
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CLASSES_ROOT;
reg.OpenKey('.abc', true);
reg.WriteString('', 'abc_auto_file');
reg.CloseKey;
reg.OpenKey('abc_auto_file/shell/open/command', true);
reg.WriteString('', '"' + application.ExeName + '" "%1"');//用当前文件打开.abc文件
reg.CloseKey;
reg.OpenKey('abc_auto_file/defaulticon',true);
reg.WriteString('',application.ExeName+',0');//取当前文件的图标为.abc文件的图标
reg.Free;
end;

2.//如果关联后图标被删除了,被关联的文件类型将显示什么图标。
如果有相关联的文件,则是一个空图标加该关联文件图标的缩略图
如果没有关联文件,则是系统默认的图标,98的是一个windows标志
me的是类似文件夹的图标。

3.搜索HKEY_CLASSES_ROOT主键下所有的.xxx(xxx为要判断地的扩展
名)键的关联程序即可
 
下面的是一个转贴 不是我写的

用Delphi实现文件关联


  文件关联为我们带来很多的方便。Delphi自带有注册表对象TRegistry,可以通过它取得或改变注册表相关键值的内容。

  Function GetAssociatedExec(FileExt: String; var FileDescription, MIMEType: String): String;

  Var Reg: TRegistry; FileType: String;

  begin

   Result := ′′;{函数返回值是打开FileExt文件的可执行程序的名字及其参数}

   Reg := TRegistry.Create;{创建注册表对象的实例}

   try

    Reg.RootKey := HKey—Classes—Root;{准备操作的注册表根键}

    if not Reg.OpenKey(FileExt, False) then Exit;{当传入的文件类型在注册表中不存在时退出,False表示FileExt键值不存在时不自动创建新键}

    FileType := Reg.ReadString(′′);{文件类型的简单描述}

    MIMEType := Reg.ReadString(′Content Type′);{内容MIME类型}

    Reg.CloseKey;{关闭当前关键字}

    if (FileType = ′′) or (not Reg.OpenKey(FileType, False)) then Exit;

    FileDescription := Reg.ReadString(′′);{内容类型的具体描述}

    if not Reg.OpenKey(′shell/open/command′, False) then Exit;{该键值保存由哪个程序、以什么参数打开FileExt类型的文件}

    Result := Reg.ReadString(′′);{读取该键值内容}

    Reg.CloseKey; finally

    Reg.Free;{释放对象实例}

   end; end;

  由上面的例程可知,首先在HKey—Classes—Root寻找与FileExt(文件后缀,带“.”)相匹配的主键,然后从“默认” 键名取得键值,然后以该键值作为主键取得FileExt的具体描述。在其子键shell/open/command中保存了由哪个程序、以什么参数打开 FileExt类型的文件的信息,只要修改它的内容,就可以控制由哪个程序打开FileExt类型的文件。

  既然知道了文件关联在注册表中是如何定义的,只要反其道而行,就可以正确改变文件的关联了。

  function SetAssociatedExec(FileExt, Filetype, FileDescription,MIMEType,ExecName: String): Boolean;{修改成功,返回True,否则False}

  var Reg: TRegistry;

  begin

   Result := False;{}

   if (FileExt = ′′) or (ExecName = ′′) then Exit;{如果文件类型为空或者没有定义执行程序就退出,FileExt必须带″.″,如.BMP}

   Reg := TRegistry.Create;

   try

  Reg.RootKey := HKey—Classes—Root;

  if not Reg.OpenKey(FileExt, True) then Exit;{当不能正确找到或创建FileExt键时退出,这种情况一般是注册表有错误,以下同}

  Reg.WriteString(′′, FileType);

  if MIMEType <> ′′ then Reg.WriteString(′Content Type′, MIMEType);

  Reg.CloseKey;

  if not Reg.OpenKey(FileType, True) then Exit;

  Reg.WriteString(′′, FileDescription);

  if not Reg.OpenKey(′shell/open/command′, True) then Exit;

  Reg.WriteString(′′, ExecName);{执行程序一般都有参数,例如WinZip的“winzip32.exe ″%1″”,″%1″参数指ZIP文件的文件名。因此ExecName应视情况加入参数}

  Reg.CloseKey;

   finally Reg.Free; end;

  end;

  写与读是一个性质相同、方向相反的过程,因此在SetAssociatedExec函数没有过多的说明,可以参考GetAssociatedExec函数。至于TRegistry的使用,限于篇幅,本文从略。
 
Chm格式的帮助是从windows98以后才出现的新的格式,与.hlp格式相比,具有更简单的编辑方式、更丰富的画面。它是通过Chm制作工具对网页文件进行编译得到的,所以理论上你可以把帮助文件做的和网页一样漂亮。



最简单的制作方法:先用FronPage制作帮助文件,然后用HTML Help Workshop编译就可以得到*.chm的帮助文件了。HTML Help Workshop可以到微软的网站上去下载。



应用程序中的帮助可分为上下文关联和非关联两种。上下文关联,是指用户按F1键后,出现与当前焦点对象(如窗体、文本框、下拉列表框)相关的帮助画面;不同对象,出现的帮助不同。非关联帮助,是指在程序任何位置按F1键后,出现同一帮助画面。下面就这两种方式,谈谈在Delphi中的简单实现方法。



一、非关联的chm帮助

在Delphi中,你可以通过ShellExecute函数直接调用chm帮助文件,具体如下:

uses shellapi
.......

var HWndHelp:Hwnd;

i:integer;

begin

//检查帮助窗口是否已经存在

HWndHelp:=FindWindow(nil,conHelpTitle);

if HwndHelp<>0 then // 如存在则关闭

SendMessage(HwndHelp,WM_CLOSE,0,0);

i:=ShellExecute(handle, 'open',Pchar(strCurExePath+'/help.chm''),nil, nil, sw_ShowNormal);

if i<>42 then

Showmessage(' help.chm 帮助文件损坏!');

end;



二、上下文关联的chm帮助

在Delphi中实现上下文关联的chm帮助,可以调用Windows系统目录System32下的HHCTRL.OCX控件中的HtmlHelpA函数实现。 需要以下几个步骤:



1 设置相关控件的HelpContext属性。

例,主窗体frmMain::10100 ,其中的文本框 edtInput:10101

对话框dlgReport:10200 ,其中的组合列表框 cbReportEdit:10201



2 声明HtmlHelpA函数



function HtmlHelpA (hwndcaller:Longint; lpHelpFile:string; wCommand:Longint;dwData:string): HWND;stdcall; external 'hhctrl.ocx'



3 F1按键响应



//公用函数ShowChmHelp显示不同帮助画面。

procedure ShowChmHelp(sTopic:string);

var i:integer;

begin

i:=HtmlHelpA(Application.Handle,Pchar(ExePath+'/help.chm’),HH_DISPLAY_TOPIC,sTopic);

if i=0 then

begin

Showmessage(' help.chm 帮助文件损坏!');

exit;

end;

end;

….

function TfrmMain.FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;

begin

case Data of

10100: ShowChmHelp(frmMain.htm);

10101: ShowChmHelp('edtInput.htm');



else ShowChmHelp(default.htm');

end;

end;

function TdlgReport.FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;

begin

case Data of

10200: ShowChmHelp('dlgReport.htm');

10201: ShowChmHelp(cbReportEdit.htm');



else ShowChmHelp(default.htm');

end;

end;

这样,通过不同窗体的FormHelp事件,就可以实现帮助的关联。



以上介绍了delphi应用程序与chm帮助关联的一种简单实现方法。如果要实现更复杂的关联(例如,与帮助页面内特定位置/书签的关联,请查看HtmlHelpA函数的说明
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
757
DelphiTeacher的专栏
D
D
回复
0
查看
731
DelphiTeacher的专栏
D
D
回复
0
查看
686
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
790
DelphiTeacher的专栏
D
后退
顶部