当前位置: 首页 > 编程日记 > 正文

vb中5种打开文件夹浏览框的方法总结(转)

代码
众所周知,在vb中如果是打开某一个文件的话,非常简单,使用CommonDialog组件即可轻松完成,但是他只能选择文件,之后或许选取的文件路径,而如果想要浏览文件夹,就没这么方便了。

这里介绍3个办法来实现文件夹浏览。

第一个非常简单,利用Shell对象
程序代码
'引用Microsoft Shell Controls And Automation
Dim ShellA As New Shell
Private Sub Command1_Click() '建立一个按钮对象
Dim Shellb As Folder
Set Shellb = ShellA.BrowseForFolder(0, "选择文件夹", 0)
ShellA.Open b
End Sub

记得一定要引用Microsoft
Shell Controls And Automation

第二种方法,我们同样利用shell对象,但是加几个函数

程序代码

'引用Microsoft Shell Controls And Automation
Private shlShell As Shell32.Shell
Private shlFolder As Shell32.Folder
Private Const BIF_RETURNONLYFSDIRS = &H1
Private Sub Command1_Click() '
If shlShell Is Nothing Then
Set shlShell = New Shell32.Shell
End If
Set shlFolder = shlShell.BrowseForFolder(Me.hWnd, "请选择文件夹", BIF_RETURNONLYFSDIRS)
If Not shlFolder Is Nothing Then
MsgBox shlFolder.Items.Item.Path '测试
End If
End Sub



上面2个方法的结果如图:


第三个方法,是利用API来操作。

程序代码
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260

Private Declare Function SHBrowseForFolder Lib "Shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Type BrowseInfo
hWndOwner
As Long
pIDLRoot
As Long
pszDisplayName
As Long
lpszTitle
As Long
ulFlags
As Long
lpfnCallback
As Long
lParam
As Long
iImage
As Long
End Type
Private Sub Command1_Click()
Dim lpIDList As Long
Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo
szTitle
= App.Path
With tBrowseInfo
.hWndOwner
= Me.hWnd
.lpszTitle
= lstrcat(szTitle, "")
.ulFlags
= BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With

lpIDList
= SHBrowseForFolder(tBrowseInfo)
If (lpIDList) Then
sBuffer
= Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer
= Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
MsgBox sBuffer
End If
End Sub


如果希望对话框中有“新建文件夹”,那么就给.ulFlags 加上BIF_USENEWUI属性,BIF_RETURNONLYFSDIRS 的意思是仅仅返回文件夹。
效果如图:


同时我也打包2个完整的利用此API的代码,有意者请自己学习了。


第4个方法。
其实是第三个方法的改进,就是打开对话框后,自动定位到当前文件夹位置 。

程序代码

'Objects: Form1、Command1、Module1
'Form1:
Option Explicit
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function LocalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal uBytes As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Const LPTR = (&H0 or &H40)
Private Type BrowseInfo
hWndOwner
As Long
pIDLRoot
As Long
pszDisplayName
As Long
lpszTitle
As Long
ulFlags
As Long
lpfnCallback
As Long
lParam
As Long
iImage
As Long
End Type
Private Function MyAddressOf(AddressOfX As Long) As Long
MyAddressOf
= AddressOfX
End Function

Private Sub Command1_Click()
Dim lpIDList As Long
Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo
Dim Ret As Long
szTitle
= "This is the title"
Dim sPath As String
sPath
= VBA.InputBox("初始路径:", , "C:\program files")
With tBrowseInfo
.hWndOwner
= Me.hWnd
.lpszTitle
= lstrcat(szTitle, "")
.ulFlags
= BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
.lpfnCallback
= MyAddressOf(AddressOf BrowseForFolders_CallbackProc)
Ret
= LocalAlloc(LPTR, VBA.Len(sPath) + 1)
CopyMemory
ByVal Ret, ByVal sPath, VBA.Len(sPath) + 1
.lParam
= Ret
End With
lpIDList
= SHBrowseForFolder(tBrowseInfo)
If (lpIDList) Then
sBuffer
= VBA.Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer
= VBA.Left(sBuffer, VBA.InStr(sBuffer, vbNullChar) - 1)
MsgBox sBuffer
End If
End Sub

'Module1:
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_USER = &H400
Private Const BFFM_SETSelectIONA As Long = (WM_USER + 102)
Private Const BFFM_SETSelectIONW As Long = (WM_USER + 103)
Private Const BFFM_INITIALIZED As Long = 1
Public Function BrowseForFolders_CallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
If uMsg = BFFM_INITIALIZED Then
SendMessage hWnd, BFFM_SETSelectIONA,
True, ByVal lpData
End If
End Function


效果如图:



看了这个代码后,你会发现它确实定位到了当前文件夹,但是他有一个问题就是,没有选定当前文件夹。咱们继续看方法5.

第5个方法。
他同样是第3个方法的加强版,不过这个方法应当是最为完美的方法,不仅定位到当前文件夹,而且选定它。
建立一个模块文件

程序代码

'form1
'
'Module1:
Option Explicit
Private Const BIF_STATUSTEXT = &H4&
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260

Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED = 2
Private Const BFFM_SETSTATUSTEXT = (WM_USER + 100)
Private Const BFFM_SETSelectION = (WM_USER + 102)

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long

Private Type BrowseInfo
hWndOwner
As Long
pIDLRoot
As Long
pszDisplayName
As Long
lpszTitle
As Long
ulFlags
As Long
lpfnCallback
As Long
lParam
As Long
iImage
As Long
End Type

Private m_CurrentDirectory As String 'The current directory
Public Function BrowseForFolder(owner As Form, Title As String, StartDir As String) As String
Dim lpIDList As Long
Dim szTitle As String
Dim sBuffer As String
Dim tBrowseInfo As BrowseInfo
m_CurrentDirectory
= StartDir & vbNullChar

szTitle
= Title
With tBrowseInfo
.hWndOwner
= owner.hWnd
.lpszTitle
= lstrcat(szTitle, "")
.ulFlags
= BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_STATUSTEXT
.lpfnCallback
= GetAddressofFunction(AddressOf BrowseCallbackProc) 'get address of function.
End With

lpIDList
= SHBrowseForFolder(tBrowseInfo)
If (lpIDList) Then
sBuffer
= Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer
= Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
BrowseForFolder
= sBuffer
Else
BrowseForFolder
= ""
End If

End Function

Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long
Dim lpIDList As Long
Dim ret As Long
Dim sBuffer As String
On Error Resume Next
Select Case uMsg
Case BFFM_INITIALIZED
Call SendMessage(hWnd, BFFM_SETSelectION, 1, m_CurrentDirectory)
Case BFFM_SELCHANGED
sBuffer
= Space(MAX_PATH)

ret
= SHGetPathFromIDList(lp, sBuffer)
If ret = 1 Then
Call SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, sBuffer)
End If
End Select
BrowseCallbackProc
= 0
End Function
Private Function GetAddressofFunction(add As Long) As Long
GetAddressofFunction
= add
End Function


建立一个窗口和一个按钮

程序代码
Option Explicit
Private getdir As String
Private Sub Command1_Click()
getdir
= BrowseForFolder(Me, "Select A Directory", Text1.Text)
If Len(getdir) = 0 Then Exit Sub Text1.Text = getdir
End Sub
Private Sub Form_Load()
Text1.Text
= CurDir
End Sub



最终结果如图:


上面是对vb中调用文件夹对话框的一个总结,个人认为第5个方法是最为完美的,这也是从国外坛子淘到的

不得不说,国外对源码共享还是走在我们前面的。

转载于:https://www.cnblogs.com/goole/archive/2010/12/07/1899145.html

相关文章:

R语言文摘:Subsetting Data

原文地址:https://www.statmethods.net/management/subset.html R has powerful indexing features for accessing object elements. These features can be used to select and exclude variables and observations. The following code snippets demonstrate ways…

Ubuntu系统

1. Ubuntu 14.04 LTS安装 直接从官网下载Ubuntu14.04.2LTS http://www.ubuntu.com/download/desktop (你也可以下载最新的14.10---据说改变不大) 个人采用的是U盘安装,用了UltraISO这款软件(百度软件中心中便有---可以不破解试用来完成目的):具体流程: UltraISO上端文件打开,将…

win10下Anaconda如何查看PyTorch版本

以管理员身份打开Anaconda Powershell Prompt 按顺序输入以下三行命令即可

6年iOS开发程序员总结组件化—让你的项目一步到位

纯个人学习笔记分享, 不喜勿喷,自行取关! 技术不缺乏缔造者,网络不缺乏键盘侠,但缺乏分享技术的源动力! 近几年组件化大家吵的沸沸扬扬的,它其实也不是什么黄金圣衣,穿上立马让你的小宇宙提升几个档次,也不是海皇的三叉戟,入手就能…

处理问题的方法--抽象和特例化

事实上我们在软件开发的过程中总是:遇到问题,解决问题,这么一个 简单的过程。处理一般类似问题的时候,我们经过抽象,有的提取算法,有的提取结构,有的提取流程等等,这样的过程可以简单…

121-Best Time to Buy and Sell Stock

题目: Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum p…

控制行输入以下两句命令16倍速播放青年大学习

//得到视频标签 playRate document.getElementsByTagName(video); //改变播放速率 playRate.Bvideo.playbackRate 16;

ios 8+ (xcode 6.0 +)应用程序Ad Hoc 发布前多设备测试流程详解

我们开发的程序在经过simulator以及自己的iOS设备测试后,也基本完成应用程序了,这时候我们就可以把它发布出去了更更多的人去测试,我们可以在iOS平台使用ad hoc实现。 你在苹果购买的开发者会员账号,允许100台设备和你的账号关联。…

SHELL训练营--day5__shell脚本(1)

shell脚本意义 shell是一种脚本语言,具备计算机语言的基本特点:逻辑判断、循环、自定义函数等。shell脚本 主要使用 linux系统的命令,来实现特定目的。可用于自动化运维,提长运维效率。 shell脚本基本结构和运行方法 shell脚本名字…

让程序主窗口不显示在任务栏中

// 这样一句就能搞定了 在Form创建是调用 procedure TfrmWaitWindow.FormCreate(Sender: TObject); begin SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); end; 相关方法1 Application.Initialize; Application.CreateForm(TForm1, Form1); Application.S…

查缺补漏 | Python控制结构

1. if 表达式的简介写法 x if E else y 意思是如果条件表达式E成立,执行x,否则执行y 等价于 if E:x else:y 2. Python的while循环和其他语言相似(只是少了大括号),但是for循环区别大很多 for iter_var in iterable_object: sui…

Android学习——R文件丢失异常原因汇总

Console报错:R.java was modified manually! Reverting to generated version! 引言: R文件丢失异常在java开发中是个比较常见的异常,造成这个异常的原因可能非常微小,但是给Android开发者们造成的麻烦可是巨大的,当程序员们费尽千…

举个栗子看如何做MySQL 内核深度优化

2019独角兽企业重金招聘Python工程师标准>>> 本文由云社区发表 作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设;先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾…

Ubuntu--开启TELNET服务

1 sudo apt-get install xinetd telnetd 安装成功后,系统也会有相应提示, 测试安装完之后就可以Telnet,要是还不行继续 2 sudo vi /etc/inetd.conf 并加入以下一行 telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd …

Python的range()函数

如果想产生一个等差数列,用range()函数再合适不过。 range()函数可以有起始值、终值、步长三个参数。 range(start 0,end,step 1) 但是起始值和步长是可以缺省的。起始值的缺省值是0,步长的缺省值是1。 起始值被包含,终值不包含。 为了方…

C++链式继承

继承,对于学习C的每一个人来说,都不会陌生。在Qt的开发中,如果你需要对一个无边框的界面支持move操作,那么你就得通过继承重写虚函数来实现,这并不难,但如果我还需要对一个按钮支持移动,一般情况…

调度框架学习笔记(3)—— 集群调度框架的架构演进过程

本章是 The evolution of cluster scheduler architectures 文章的学习笔记。这篇文章讨论了这些年调度架构是如何发展的以及为什么会这样发展。 首先介绍一下这篇文章的作者:Malte Schwarzkopf,他目前在 MIT 的 PDOS实验室 作博士后,说起作者…

查缺补漏 | Python自定义函数

1 默认参数要放在自定义函数参数列表的最后,也就是说下面的定义是不允许的 2 调用函数时熟悉的是位置参数,但是也可以用关键字参数,也就是调用时把参数名写出来(可以通过它来改变参数的顺序)。不过貌似系统定义的函数不能用关键字参数&#x…

ZBar与ZXing使用后感觉

[原]ZBar与ZXing使用后感觉(上) 2014-3-18阅读2011 评论1 最近对二维码比较感兴趣,还是那句老话,那么我就对比了一下zxing和zbar 如果对于这两个的背景不了解的话,可以看我以前的文章,介绍了几个比较基础的…

X-UA-Compatible

X-UA-Compatible是IE8的一个专有<meta>属性&#xff0c;它告诉IE8采用何种IE版本去渲染网页&#xff0c;在html的<head>标签中使用。可以在微软官方文档获取更多介绍。 在IE8刚推出的时候&#xff0c;很多网页由于重构的问题&#xff0c;无法适应较高级的浏览器&a…

[转]【 视频 】PAR、DAR和SAR都是啥

原地址:http://blog.yikuyiku.com/?cat3 PAR —— Pixel Aspect Ratio 像素纵横比DAR —— Display Aspect Ratio 显示纵横比SAR —— Sample Aspect Ratio 采样纵横比 16&#xff1a;9和4&#xff1a;3指的是DAR&#xff0c;DAR和SAR之间没有必然联系。横向上的像素数目/纵向…

登高自卑 | 我的NumPy笔记

注&#xff1a;以下内容来自NumPy中文网 1 NumPy的矢量化和广播两个特征是大部分功能的基础。 矢量化让代码更接近标准的数学符号&#xff0c;更Pythonic&#xff0c;隐藏了所有的显示循环(幕后是C在做显示循环)。 广播即操作的隐式逐元素行为&#xff0c;不仅仅局限于算数运…

TI IPNC Web网页之网页修改教程

web网页程序修改 打开gStudio之后&#xff0c;点击菜单栏中Help->Contents。先把这个诡异的编程语言看一遍吧。这里搬一些东西出来。 GoDB简介 从第一副图片中&#xff0c;我们可以看出&#xff0c;从源文件到可执行文件的过程。 从第二幅图我们可以了解到GoDB是如何跨平台的…

Spring Cloud构建分布式电子商务平台:服务消费(基础)

使用LoadBalancerClient在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口&#xff0c;包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介绍服务注册与发现时已经说过&#xff0c;Spring Cloud做这一层抽象&#x…

OPENGL ES 对象的拾取

时间&#xff1a;19:51 2010-12-14 用户问题的说明 响应鼠标操作&#xff0c;其当中有一个非常重要的知识&#xff1a;使用鼠标点取&#xff0c;达到对三维模型对象的捕捉。 对象的拾取&#xff0c;这是3D当中的一个专业术语。也就是在二维屏幕当中选择三维对象。 我们要使用之…

如何禁止NumPy自动跳过数组的中心部分并仅打印角点

import numpy as np import sys np.set_printoptions(thresholdsys.maxsize)

用C#创建Windows服务(Windows Services)

转载自 hyslove最终编辑 hysloveWindows服务在Visual Studio 以前的版本中叫NT服务&#xff0c;在VS.net启用了新的名称。用Visual C# 创建Windows服务不是一件困难的事&#xff0c;本文就将指导你一步一步创建一个Windows服务并使用它。这个服务在启动和停止时&#xff0c;向一…

JS判断滚动条到底部

form:http://www.uphtm.com/js/269.html判断滚动条到底部&#xff0c;需要用到DOM的三个属性值&#xff0c;即scrollTop、clientHeight、scrollHeight。 scrollTop为滚动条在Y轴上的滚动距离。 clientHeight为内容可视区域的高度。 scrollHeight为内容可视区域的高度加上溢出…

docker容器网络 - 同一个host下的容器间通信

2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用&#xff0c;不可避免需要多个服务部署在多个容器中&#xff0c;并且服务间存在相互间通信的情况。比如服务A需要连接mysql的容器。本文将介绍docker的容器网络&#xff0c;并通过实践解决在同一个docker …

登高自卑 | 我的PyTorch入门与实践笔记

1 函数名后带下划线会修改函数本身。如y.add_(x)会改变张量y。 2 PyTorch的Tensor和NumPy中的ndarray是可以互相转换的&#xff0c;转换后的对象共享内存(一个变另一个也跟着变)。