文件托放

熟悉 Windows 的读者都知道,“运行”对话框的“打开”编辑控件,提供了两个比较特别的功能:一个是自动完成功能,即键入字符后编辑控件提供建议选项供选用 (AutoSuggest),如图1;另一个是拖放功能,即将文件拖放到“运行”对话框后编辑控件会显示文件列表,如图2。通过在 PowerBuilder 中调用 Win32 API 函数可以使单行编辑控件 (Single-line Edit Control) 和多行编辑控件 (Multi-line Edit Control) 实现上述功能。本文将就如何实现上述功能展开讨论。
图1
 
图2
自动完成功能
 Win32 API 函数 SHAutoComplete 是实现该功能的关键,它的 Powersoft 原型是:
Function ULong SHAutoComplete(ULong hwndEdit,ULong dwFlags) Library "Shlwapi.dll"
参数 hwndEdit 是编辑控件的句柄,可以用 Handle 函数获得。
参数 dwFlags 是控件 SHAutoComplete 操作的标志,具体如下:
SHACF_AUTOAPPEND_FORCE_OFF 2147483648 忽略注册表的缺省值并强行关闭自动添加功能。
SHACF_AUTOAPPEND_FORCE_ON 1073741824 忽略注册表的缺省值并强行打开自动添加功能。
SHACF_AUTOSUGGEST_FORCE_OFF 536870912 忽略注册表的缺省值并强行关闭自动建议功能。
SHACF_AUTOSUGGEST_FORCE_ON 268435456 忽略注册表的缺省值并强行打开自动建议功能。
SHACF_DEFAULT 0 缺省值,等价于SHACF_FILESYSTEM | SHACF_URLALL。
SHACF_FILESYSTEM 1 包括文件系统和虚拟文件夹。
SHACF_URLALL 6 包括用户历史和最近使用列表中的URL。
SHACF_URLHISTORY 2 包括用户历史列表中的URL。
SHACF_URLMRU 4 包括最近使用列表中的URL。
SHACF_USETAB 8 允许用户按Tab键选择建议选项列表。
该函数需要 Internet Explorer 5 提供的动态链接库 Shlwapi.dll (ver 5.00)。
该功能的实现脚本如下:
sle_autocom.Event Constructor( ) returns long
// dwFlags: SHACF_USETAB | SHACF_FILESYSTEM | SHACF_URLALL = 15
SHAutoComplete(Handle(this), 15)
 拖放功能
实现拖放功能要用到 Win32 API 函数 DragAcceptFiles、DragFinish、DragQueryFileA 和 PathIsLFNFileSpecA,他们的 Powersoft 原型为:
Subroutine DragAcceptFiles(ULong hWnd,Boolean fAccept) Library "Shell32.dll"
函数 DragAcceptFiles 用于注册窗口是否接受放下的文件。
Subroutine DragFinish(ULong hDrop) Library "Shell32.dll"
函数 DragFinish 用于释放为接受文件分配的内存。参数 hDrop 是用于描述被放下文件的结构的标识号。
Function ULong DragQueryFileA(ULong hDrop,ULong iFile,ref String lpszFile,ULong cch) Library "Shell32.dll"
函数 DragQueryFileA 用于获取被放下的文件名。参数 iFile 是文件名的索引值;参数 cch 是 lpszFile 长度。
Function Boolean PathIsLFNFileSpecA(String pszName) Library "Shlwapi.dll"
函数 PathIsLFNFileSpecA 用于判断文件名是否是长文件名。该函数需要 Internet Explorer 5 提供的动态链接库 Shlwapi.dll (ver 5.00)。
该功能的实现脚本如下:
w_main.Event Open( ) returns long
DragAcceptFiles(Handle(this), true)
w_main.Event Close( ) returns long
DragAcceptFiles(Handle(this), false)
 声明自定义事件 DropFiles:
w_main.Event DropFiles(long handle) returns long [pbm_dropfiles]
UInt  lui_index // 文件索引值 (基于0)
UInt  lui_filenum // 文件数
String  ls_filename // 文件名
 
lui_filenum = DragQueryFileA(handle, -1, ls_filename, 256) // 获取文件数
for lui_index = 0 to lui_filenum - 1
    DragQueryFileA(handle, lui_index, ls_filename, 256) // 获取文件名   
    if sle_autocom.text <> "" then sle_autocom.text += " " // 在文件名间放置空格
    if PathIsLFNFileSpecA(ls_fileName) then       
        ls_fileName = '"' + ls_fileName + '"' // 长文件名加双引号
    end if
    sle_autocom.text += ls_fileName
next
 
DragFinish(handle) //释放内存
发表于 @ 2007年01月10日 22:20:00 | 评论( 3 ) | 编辑| 举报| 收藏
旧一篇:PB: 使用任务栏通知区域 | 新一篇:PB: 带位图的菜单项实现mawei2 发表于2007年1月26日 15:00:13  IP:举报
1.我声明了这个external function:
Subroutine DragAcceptFiles(ULong hWnd,Boolean fAccept) Library "Shell32.dll"
2.在窗口的open事件中加了代码:DragAcceptFiles(Handle(this), true)
为什么拖拽文件到窗口时,鼠标仍然是不可拖拽的标志呢,相应的窗口pbm_dropfiles的事件也不能执行,哪里有问题?
keyssoft 发表于2007年2月8日 03:00:01  IP:举报
/*Required IDE: PB 10 or later*/
forward
global type w_main from window
end type
end forward
global type w_main from window
integer width = 1262
integer height = 540
boolean titlebar = true
string title = "Untitled"
boolean controlmenu = true
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor = 67108864
string icon = "AppIcon!"
boolean center = true
event dropfiles pbm_dropfiles
end type
global w_main w_main
type prototypes
Subroutine DragAcceptFiles(ULong hWnd, Boolean fAccept) Library "Shell32.dll"
Subroutine DragFinish(ULong hDrop) Library "Shell32.dll"
Function ULong DragQueryFileW(ULong hDrop, ULong iFile, ref String lpszFile, ULong cch) Library "Shell32.dll"
Function Boolean PathIsLFNFileSpecW(String pszName) Library "Shlwapi.dll"
end prototypes
event dropfiles;UInt lui_index // 文件索引值 (基于0)
UInt lui_filenum // 文件数
String ls_filename // 文件名
lui_filenum = DragQueryFileW(handle, -1, ls_filename, 256) // 获取文件数
for lui_index = 0 to lui_filenum - 1
DragQueryFileW(handle, lui_index, ls_filename, 256)
MessageBox("DropFiles", ls_filename);
next
DragFinish(handle)
end event
on w_main.create
end on
on w_main.destroy
end on
event open;DragAcceptFiles(Handle(this), true)
end event

 

1、窗口在打开时需是OPEN方式,如果是OPENSHEET方式打开的窗口不能接收拖拽事件,在应用程序中可以写在MDI窗口中。
2、在PB8和PB9中拖拽多次或打开其他窗口时,很容易死机,在DragQueryFileA之前需设一下参数ref String lpszFile,让lpszFile有一个初始的长度,例如256个空格之类。

 

http://blog.csdn.net/keyssoft/archive/2007/01/10/1479618.aspx 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值