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

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

特别提醒:

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

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...