两种方式实现调用美化文件夹选择对话框功能

By admin at 2020-01-19 • 0人收藏 • 534人看过

特别提醒:

aardio作者已在aardio v25.81之后版本增加了调用IFileOpenDialog接口打开文件夹选择框的功能, 只需要调用以下代码:

import com.interface.IFileOpenDialog;
var path = com.interface.IFileOpenDialog.dir(,winform,'请选择目录')

相关的范例在

用法参考:aardio范例 / 文件操作 / 文件对话框

image.png

查看这个功能实现代码,同时也可以学习com.interface接口的用法.





感谢aardio培训群: 心在安 分享dll和方案


我们知道在aardio里目前dlg.opendir() 打开的对话框是默认的小框

如下图:

image.png

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

image.png

代码如下:

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下载:

NewFolderPicker.zip

生成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
2020-01-20   #1

感谢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();


2020-01-25   #2

老大,使用NewFolderPicker.zip打开的路径目录,如果有中文,会乱码20200125-161531.jpg

2020-01-30   #3

回复#2 @ccbwx :

用作者封装好的,不要用那个dll

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...