两种方式实现调用美化文件夹选择对话框功能
By
admin
at 2020-01-19 • 0人收藏 • 2486人看过
特别提醒:
aardio作者已在aardio v25.81之后版本增加了调用IFileOpenDialog接口打开文件夹选择框的功能, 只需要调用以下代码:
import com.interface.IFileOpenDialog; var path = com.interface.IFileOpenDialog.dir(,winform,'请选择目录')
相关的范例在
用法参考:aardio范例 / 文件操作 / 文件对话框

查看这个功能实现代码,同时也可以学习com.interface接口的用法.
感谢aardio培训群: 心在安 分享dll和方案
我们知道在aardio里目前dlg.opendir() 打开的对话框是默认的小框
如下图:

我们下面利用 分享的dll来实现如下图的对话框

代码如下:
import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio工程14";right=759;bottom=375)
mainForm.add(
button={cls="button";text="Button";left=216;top=226;right=571;bottom=317;z=1};
edit={cls="edit";left=178;top=46;right=570;bottom=181;edge=1;multiline=1;z=2}
)
/*}}*/
var dll = ..raw.loadDll("\res\NewFolderPicker.dll","picklib","cdecl,unicode");
PickAFolder = dll.api("PickAFolder","void(pointer& path)" );
var GetFloder = function(){
var path = PickAFolder(null);
if(path!=null){
var pathStr = raw.tostring(path,1,520);
var PpathStr = string.split(pathStr);
var retstr;
for(i=1;520;1){
if(PpathStr[i]!='\0'){
retstr = string.concat(retstr,PpathStr[i]);
}else {
if(PpathStr[i+1]=='\0'){
break;
}
}
}
return retstr;
}
return null;
}
import console
console.open()
mainForm.button.oncommand = function(id,event){
var path = GetFloder()
console.log(path)
}
mainForm.show();
return win.loopMessage();dll下载:
生成dll的vc2019工程源码如下:
链接:https://pan.baidu.com/s/1Q1CYGkUWp7TYFdfhoB-1-w
提取码:gz33
备注:
以上生成dll是采用的com方式使用IFileOpenDialog接口实现,所以应该可以用com.interface实现同样的功能.
参考如下:
https://www.cnblogs.com/marvelousone/p/10327253.html
有机会com.interface方式实现后,同样会分享到楼下.
3 个回复 | 最后更新于 2020-01-30
登录后方可回帖

感谢aardio群: fish 提供com静态接口版本源码
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=759;bottom=469) winform.add() /*}}*/ import com.interface; class IFileOpenDialog{ ctor(){ this = ..com.interface.IUnknown(); }; pointer Show = "int(int hwnd)"; pointer SetFileTypes; pointer SetFileTypeIndex; pointer GetFileTypeIndex; pointer Advise; pointer Unadvise; pointer SetOptions = "int(int FILEOPENDIALOGOPTIONS)"; pointer GetOptions; pointer SetDefaultFolder; pointer SetFolder; pointer GetFolder; pointer GetCurrentSelection; pointer SetFileName; pointer GetFileName; pointer SetTitle; pointer SetOkButtonLabel; pointer SetFileNameLabel; pointer GetResult = "int(pointer &IShellItem)"; pointer AddPlace; pointer SetDefaultExtension; pointer Close; pointer SetClientGuid; pointer ClearClientData; pointer SetFilter; pointer GetResults; pointer GetSelectedItems; } namespace IFileOpenDialog{ IID = "{42f85136-db7e-439c-85f1-e4075d135fc8}" } class IShellItem{ ctor(){ this = ..com.interface.IUnknown(); }; pointer BindToHandler; pointer GetParent; pointer GetDisplayName = "int(int sign, pointer &ppszName)"; pointer GetAttributes; pointer Compare; } namespace IShellItem{ IID = "{43826d1e-e718-42ee-bc55-a1e261c37bfe}" } winform.show(); var FileOpenDialog = com.interface.create( "{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}", IFileOpenDialog, 1/*_CLSCTX_INPROC_SERVER*/ ) FileOpenDialog.SetOptions( 0x20 ) var hr = FileOpenDialog.Show( winform.hwnd ) if( hr < 0 ){ winform.msgbox("取消") } elseif( hr == 0 ){ var hr, ptr = FileOpenDialog.GetResult() var Item = com.interface( ptr, IShellItem ) var hr , path = Item.GetDisplayName(0x80058000) winform.msgbox( "路径:" ++ string.fromUnicode(raw.str(path,true)) ) } winform.show(); win.loopMessage();