在vfp6.0中如何修改GETDIR弹出窗口的丑陋的图标?

aikill 2005-10-13 04:54:39
如题。
...全文
262 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2005-10-13
  • 打赏
  • 举报
回复
修正一下:

*!* 2、如果用VFP6.0,那就改用

*!* 调用系统选择目录对话框(等价于GETDIR)


DECLARE INTEGER FindWindow IN user32 INTEGER, STRING
DECLARE INTEGER SHBrowseForFolder IN shell32 STRING
DECLARE INTEGER SHGetPathFromIDList IN shell32 INTEGER, STRING @
oHeap = CREATEOBJ("Heap")
WITH oHeap
howner = FindWindow(0, _SCREEN.CAPTION)
pidlroot = 0
pszdisplayname= .CopyToHeap("C:\")
lpsztitle = .CopyToHeap("调用系统选择目录对话框 " + CHR(13) + CHR(10) + "请选择目录:")
ulflags = 0
lpfn = 0
lnparam = 0
iimage = 0
browseinfo = .NumToDWORD(howner) ;
+ .NumToDWORD(pidlroot) ;
+ .NumToDWORD(pszdisplayname);
+ .NumToDWORD(lpsztitle) ;
+ .NumToDWORD(ulflags) ;
+ .NumToDWORD(lpfn) ;
+ .NumToDWORD(lnparam) ;
+ .NumToDWORD(iimage)
rhn = SHBrowseForFolder(browseinfo)
ENDWITH
RELEASE oHeap
getpath = SPACE(512)
IF SHGetPathFromIDList(rhn, @getpath) = 1
mypath = LEFT(getpath, AT(CHR(0),getpath)-1) +'\'
mypath=IIF(RIGHT(mypath,2)='\\',LEFT(mypath,LEN(mypath)-1),mypath)
ELSE
mypath=''
ENDIF
? mypath &&选择的目录
CLEAR DLLS


DEFINE CLASS Heap AS CUSTOM
PROTECTED inAllocs, iaAllocs[1]
inAllocs = 0
iaAllocs = 0
NAME = "heap"

FUNCTION CopyToHeap (lcInStr)
DECLARE INTEGER lstrcpyn IN kernel32 AS RtlCopytoMem INTEGER lnDestBuffer, STRING @lpSource, INTEGER nLength
DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER wFlags, INTEGER dwBytes
DECLARE INTEGER GlobalSize IN kernel32 INTEGER HMEM
HMEM = GlobalAlloc(0, LEN(lcInStr)) && 创建内存块
lncb = GlobalSize ( HMEM ) && 获得内存块大小
nPtr = RtlCopytoMem( HMEM, lcInStr, lncb ) && 写入内存块内容
WITH THIS
IF nPtr # 0
.inAllocs = .inAllocs + 1
DIMENSION .iaAllocs[.inAllocs]
.iaAllocs[.inAllocs,1] = nPtr && 内存地址
ENDIF
ENDWITH
RETURN nPtr
ENDFUNC

FUNCTION CopyFromHeap (lnHmem)
DECLARE INTEGER lstrcpyn IN kernel32 AS RtlCopyfromMem STRING @lpDestString, INTEGER lpSource, INTEGER nLength
DECLARE INTEGER GlobalSize IN kernel32 INTEGER HMEM
lncb = GlobalSize ( lnHmem ) && 获得内存块大小
lpDestString = REPL(CHR(0),lncb)
= RtlCopyfromMem( @lpDestString, lnHmem, lncb)
lcOutString = CHRTRANC( lpDestString, CHR(0), "")
RETURN lcOutString
ENDFUNC

FUNCTION NumToWORD
LPARAMETER tnNum
LOCAL x
x=INT(tnNum)
RETURN CHR(MOD(x,256))+CHR(INT(x/256))
ENDFUNC

FUNCTION NumToDWORD
LPARAMETER Num
DECLARE INTEGER RtlMoveMemory IN WIN32API AS RtlCopyLong STRING @pDestString, INTEGER @pVoidSource, INTEGER nLength
oLong = SPACE(4)
= RtlCopyLong(@oLong, BITOR(Num,0), 4)
RETURN oLong
ENDFUNC

PROCEDURE DESTROY
DECLARE INTEGER GlobalFree IN kernel32 INTEGER HMEM
WITH THIS
FOR nCtr = 1 TO .inAllocs
= GlobalFree (.iaAllocs[nCtr]) && 释放内存块
ENDFOR
ENDWITH
ENDPROC

ENDDEFINE
十豆三 2005-10-13
  • 打赏
  • 举报
回复
2、如果还要用VFP6.0,那就改用

调用系统选择目录对话框(等价于GETDIR)


DECLARE INTEGER FindWindow IN user32 INTEGER, STRING
DECLARE INTEGER SHBrowseForFolder IN shell32 STRING
DECLARE INTEGER SHGetPathFromIDList IN shell32 INTEGER, STRING @
oHeap = CREATEOBJ("Heap")
WITH oHeap
howner = FindWindow(0, _SCREEN.CAPTION)
pidlroot = 0
pszdisplayname= .CopyToHeap("C:\")
lpsztitle = .CopyToHeap("调用系统选择目录对话框 " + CHR(13) + CHR(10) + "请选择目录:")
ulflags = 0
lpfn = 0
lnparam = 0
iimage = 0
browseinfo = .NumToDWORD(howner) ;
+ .NumToDWORD(pidlroot) ;
+ .NumToDWORD(pszdisplayname);
+ .NumToDWORD(lpsztitle) ;
+ .NumToDWORD(ulflags) ;
+ .NumToDWORD(lpfn) ;
+ .NumToDWORD(lnparam) ;
+ .NumToDWORD(iimage)
rhn = SHBrowseForFolder(browseinfo)
ENDWITH
RELEASE oHeap
getpath = SPACE(512)
IF SHGetPathFromIDList(rhn, @getpath) = 1
mypath = LEFT(getpath, AT(CHR(0),getpath)-1) + IIF(RIGHT(ALLTRIM(getpath),1)='\','','\')
mypath=IIF(RIGHT(mypath,2)='\\',LEFT(mypath,LEN(mypath)-1),mypath)
ELSE
mypath=''
ENDIF
? mypath &&选择的目录
CLEAR DLLS


DEFINE CLASS Heap AS CUSTOM
PROTECTED inAllocs, iaAllocs[1]
inAllocs = 0
iaAllocs = 0
NAME = "heap"

FUNCTION CopyToHeap (lcInStr)
DECLARE INTEGER lstrcpyn IN kernel32 AS RtlCopytoMem INTEGER lnDestBuffer, STRING @lpSource, INTEGER nLength
DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER wFlags, INTEGER dwBytes
DECLARE INTEGER GlobalSize IN kernel32 INTEGER HMEM
HMEM = GlobalAlloc(0, LEN(lcInStr)) && 创建内存块
lncb = GlobalSize ( HMEM ) && 获得内存块大小
nPtr = RtlCopytoMem( HMEM, lcInStr, lncb ) && 写入内存块内容
WITH THIS
IF nPtr # 0
.inAllocs = .inAllocs + 1
DIMENSION .iaAllocs[.inAllocs]
.iaAllocs[.inAllocs,1] = nPtr && 内存地址
ENDIF
ENDWITH
RETURN nPtr
ENDFUNC

FUNCTION CopyFromHeap (lnHmem)
DECLARE INTEGER lstrcpyn IN kernel32 AS RtlCopyfromMem STRING @lpDestString, INTEGER lpSource, INTEGER nLength
DECLARE INTEGER GlobalSize IN kernel32 INTEGER HMEM
lncb = GlobalSize ( lnHmem ) && 获得内存块大小
lpDestString = REPL(CHR(0),lncb)
= RtlCopyfromMem( @lpDestString, lnHmem, lncb)
lcOutString = CHRTRANC( lpDestString, CHR(0), "")
RETURN lcOutString
ENDFUNC

FUNCTION NumToWORD
LPARAMETER tnNum
LOCAL x
x=INT(tnNum)
RETURN CHR(MOD(x,256))+CHR(INT(x/256))
ENDFUNC

FUNCTION NumToDWORD
LPARAMETER Num
DECLARE INTEGER RtlMoveMemory IN WIN32API AS RtlCopyLong STRING @pDestString, INTEGER @pVoidSource, INTEGER nLength
oLong = SPACE(4)
= RtlCopyLong(@oLong, BITOR(Num,0), 4)
RETURN oLong
ENDFUNC

PROCEDURE DESTROY
DECLARE INTEGER GlobalFree IN kernel32 INTEGER HMEM
WITH THIS
FOR nCtr = 1 TO .inAllocs
= GlobalFree (.iaAllocs[nCtr]) && 释放内存块
ENDFOR
ENDWITH
ENDPROC

ENDDEFINE
zsjiaming 2005-10-13
  • 打赏
  • 举报
回复
VFP6.0下getdir()作为不大.

当然 你完全可以用ADIR()+列表框...自己做一个类似功能的类出来

或者用winapi来
=======以下为转载===========
* 调用 Windows 选择目录对话框
* 红雨
*------------------------------------
Clea
Declare integer SHBrowseForFolder in shell32 string
Declare integer SHGetPathFromIDList in shell32 integer, string @
Declare integer FindWindow in user32 string, string

oHeap = Createobj("Heap")
With oHeap
howner = FindWindow("", _screen.caption)
pidlroot = 0 && 指定根目录 0:我的电脑,1:IE目录,2:程序菜单,3:控制面板,4:打印机,5:我的文档,6:收藏夹,7:启动,8:Recent,9:SendTo,10:回收站,11:开始菜单
pszdisplayname= .CopyToHeap("C:\temp")
lpsztitle = .CopyToHeap("* 调用 Windows 选择目录对话框 红雨设计" + chr(13) + chr(10) + "* [请选择所需目录:]")
ulflags = 0
lpfn = 0
lnparam = 0
iimage = 0
? .CopyFromHeap (lpsztitle)

browseinfo = .NumToDWORD(howner) ;
+ .NumToDWORD(pidlroot) ;
+ .NumToDWORD(pszdisplayname);
+ .NumToDWORD(lpsztitle) ;
+ .NumToDWORD(ulflags) ;
+ .NumToDWORD(lpfn) ;
+ .NumToDWORD(lnparam) ;
+ .NumToDWORD(iimage)
rhn = SHBrowseForFolder(browseinfo)
Endwith
Release oHeap

getpath = space(512)
If SHGetPathFromIDList(rhn, @getpath) = 1
mypath = left(getpath, at(chr(0),getpath)-1)
Else
mypath = [<空>]
Endif
? [* 所选目录为: ] + mypath
Return

*----------------------------
Define class Heap as custom
Protected inAllocs, iaAllocs[1]
inAllocs = 0
iaAllocs = 0
Name = "heap"

Function CopyToHeap (lcInStr)
Declare integer lstrcpyn in kernel32 as RtlCopytoMem integer lnDestBuffer, string @lpSource, integer nLength
Declare integer GlobalAlloc in kernel32 integer wFlags, integer dwBytes
Declare integer GlobalSize in kernel32 integer hMem
Hmem = GlobalAlloc(0, len(lcInStr)) && 创建内存块
lncb = GlobalSize ( hMem ) && 获得内存块大小
nPtr = RtlCopytoMem( hMem, lcInStr, lncb ) && 写入内存块内容
With this
If nPtr # 0
.inAllocs = .inAllocs + 1
Dimension .iaAllocs[.inAllocs]
.iaAllocs[.inAllocs,1] = nPtr && 内存地址
Endif
Endwith
Return nPtr
Endfunc

Function CopyFromHeap (lnHmem)
Declare integer lstrcpyn in kernel32 as RtlCopyfromMem string @lpDestString, integer lpSource, integer nLength
Declare integer GlobalSize in kernel32 integer hMem
lncb = GlobalSize ( lnHmem ) && 获得内存块大小
lpDestString = repl(chr(0),lncb)
= RtlCopyfromMem( @lpDestString, lnHmem, lncb)
lcOutString = chrtranc( lpDestString, chr(0), "")
Return lcOutString
Endfunc

Function NumToWORD
Lparameter tnNum
Local x
x=int(tnNum)
Return chr(mod(x,256))+chr(int(x/256))
Endfunc

Function NumToDWORD
Lparameter Num
Declare integer RtlMoveMemory in WIN32API as RtlCopyLong string @pDestString, integer @pVoidSource, integer nLength
oLong = SPACE(4)
= RtlCopyLong(@oLong, Bitor(Num,0), 4)
Return oLong
Endfunc

Procedure Destroy
Declare integer GlobalFree in kernel32 integer hMem
With this
For nCtr = 1 to .inAllocs
= GlobalFree (.iaAllocs[nCtr]) && 释放内存块
Endfor
Endwith
Endproc

Enddefine

十豆三 2005-10-13
  • 打赏
  • 举报
回复
1、改为VFP8或VFP9
因为VFP8或VFP9增加了一个nFlags参数,详情参考VFP8或VFP9的帮助



2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧