|
楼主 |
发表于 2017-7-30 01:11:18
|
显示全部楼层
- Option Explicit: c0 k7 T. G ^) X6 w+ V/ K: }* T
" h' W, p, e* s% ?* p- ' 定义用户类型,以减少#if VBA7语句的数量,但不能消除他们...
+ @' {3 I% B9 _7 M5 x- V' W - Private Type LongPtr_T& P0 o" g+ u$ i+ Y
- #If VBA7 Then D4 }$ t0 A& I5 ~8 O; m
- Value As LongPtr2 \+ q, v1 T$ e6 K
- ' Compare automatically resized LongPtr to fixed size Long and LongLong
, ^# ?4 p [7 _ - #Else2 b6 ~+ F- T# ]
- Value As Long
- L/ u( q9 |( \) M. N+ k - #End If3 _$ u- ?9 A( }4 b& X" `! E
- End Type
8 |/ ^6 n- O# U! _ - * k8 v; g; f/ P! `
- ' Win32 数据类型. Different signatures for different versions of VBA
( L& l# t5 L& t& Y9 {6 w, ` - Private Type BROWSEINFO
2 Y$ `( B- F* w9 R w5 f: Z - #If VBA7 Then
; ^, r; l& c% Q5 P! D9 { - hWndOwner As LongPtr, d1 \- k6 z3 o+ D6 T
- pIDLRoot As LongPtr; D4 G/ [" B/ p, d! R4 p
- pszDisplayName As Long( e$ ]! B- e E' D. q
- lpszTitle As String" u% f8 Y3 j4 U+ ~9 y1 ^2 D
- ulFlags As Long8 _! p$ E1 r+ h: c: b }
- lpfnCallback As LongPtr5 F' w y z/ D8 [: [& \( m
- lParam As Long* e8 W& {4 L0 `0 X6 v% A& P
- iImage As Long
: x- b% Q/ q: [, N4 L; i - #Else7 N, h& M+ B$ u
- hWndOwner As Long- b; M; m7 k, k; q9 _; L
- pIDLRoot As Long
3 |/ _5 M* I$ J4 x4 C4 l: M0 v - pszDisplayName As Long! p- B$ a4 u6 ?
- lpszTitle As String8 i4 F1 e% i$ L2 N# ]
- ulFlags As Long7 Q7 Y5 w7 l# e
- lpfnCallback As Long( i. N: [. m, `. n$ W
- lParam As Long8 o1 `- T9 o7 e7 p* ^& v4 f
- iImage As Long
' C* N# f5 W" v - #End If
- m6 g& `3 S$ q' P; u& x - End Type
1 t4 k1 \# @$ w0 w3 c) ~ - ) L7 ^4 t$ h$ {
- Private Const MAX_PATH = 260+ S* E* |. M. V9 w$ n
- 'Directories only
6 Y6 a: }' @6 X - Private Const BIF_RETURNONLYFSDIRS = &H1&
' o8 v) M; o2 Q2 F# B& D; Y3 V a - 'Windows 2000 (Shell32.dll 5.0) extended dialog# ?5 N: x! J/ P0 N: I
- Private Const BIF_NEWDIALOGSTYLE = &H407 Y( |4 U$ m! Z0 O1 w0 ]! l
- ' show edit box* L' Q: D/ v0 F
- Private Const BIF_EDITBOX = &H10&, c6 w9 X6 _9 d& P0 ~
- . P' u/ p' W( L$ f
- Private Const WM_USER = &H400
5 P' A. R( U/ g" b& q - Private Const BFFM_INITIALIZED = 1& b! r2 O9 c5 L% t) \' m
- Private Const BFFM_SELCHANGED = 2
2 b+ H x1 W8 u; u - Private Const BFFM_SETSTATUSTEXTA = (WM_USER + 100)$ G$ M8 n2 g; V! [% w0 l4 @! t
- . S1 u4 m9 U$ Z
- Private Const BFFM_SETSELECTIONA = (WM_USER + 102)# W' _! h5 H1 \2 r$ B/ E
- Private Const BFFM_SETEXPANDED = (WM_USER + 16)
5 r* o! m8 _' \/ r, E; e4 p
' |+ @0 h! O: S( Y4 X- ?' x ?* Q- Private m_sDefaultFolder As String
( A" w4 j1 ~3 \7 ?8 n) u/ w
/ J9 u* Y% C* W( s3 g+ g- Public Const SWP_NOMOVE = 2
$ L5 C' t3 g2 F" n3 ] - Public Const SWP_NOSIZE = 1
% t- p' A' d1 _9 R' H - Private Const SWP_NOZORDER = 47 W8 {) ^' E3 H: }% `2 ]8 ]
- . l) F6 j9 T5 @# q9 N2 d7 } b
- Private Type RECT
" k1 Y% x2 l8 X! k a, [8 M, E - Left As Long
E. Z ~' z5 L9 D! ]& n( o - Top As Long
2 j( l* N; o# ]; Y, x0 ` - Right As Long
$ ~+ E7 Z3 [9 K9 O2 ?/ J" G# J! l - Bottom As Long
2 k9 G& }# i) b& ^0 V: i4 C - End Type* y0 f/ }& |% I3 h" C( H
5 q! t- u5 G7 o" A- ' Win32 API declarations. Different signatures for different versions of VBA.
) R, {& Y7 L% n' t2 \ - ' Note the mandatory use of PtrSafe keyword in VBA7.
C$ }' n, Z" b# g% J5 d6 e - #If VBA7 Then, u3 Y4 e8 P0 e* c6 Q
- Private Declare PtrSafe Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long9 a3 K" b; Q* S+ Y( G. l& Q3 R
- Private Declare PtrSafe Function SHBrowseForFolder Lib "Shell32" (lpbi As BROWSEINFO) As Long% t8 @% K% }7 o: h4 q, J, K( u1 \% K6 ^
- Private Declare PtrSafe Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As LongPtr, ByVal lpBuffer As String) As Long
9 j+ F- W% V5 u6 K) b% Y - Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32" (ByVal hMem As LongPtr)* k9 D) s0 Y" B, e5 a, N
- Private Declare PtrSafe Function SetWindowPos Lib "USER32" (ByVal hWnd As LongPtr, _
+ Z- d: [2 y8 |2 M+ ~" `9 V9 X/ M - ByVal hWndInsertAfter As LongPtr, _
0 m, B( f. a8 ?3 ~8 X ?1 w - ByVal x As Long, _
/ e0 A e* Z# t- k# O: J+ n% M: } - ByVal y As Long, _
1 t9 ^4 e' H% D* }# y% G - ByVal cx As Long, _# l* q( G2 l9 R: a1 {) [2 L* g) o
- ByVal cy As Long, _
0 _ {8 n/ d2 V9 E4 v - ByVal wFlags As Long) As Long
4 J1 s; c& d# \7 \ - Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" (ByVal hWnd As LongPtr, lpRect As RECT) As Long; K+ F0 [- a. \. T
- - t# n0 v- G# m; D. ?
- #Else8 c. |; r+ m& o, X- a
- 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
; G {4 W" h) ^; ~* c) L1 { - Private Declare Function SHBrowseForFolder Lib "Shell32" (lpbi As BROWSEINFO) As Long5 P0 }+ e$ w. s
- Private Declare Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long1 e8 ?" j0 y( s( }5 Y. S$ g
- Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal hMem As Long)
, A. N, Q9 p8 C6 _: ?* c - Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, _" v. Q6 }- H' ]6 h; V; f
- ByVal hWndInsertAfter As Long, _
% @3 t1 y% {, S% K - ByVal x As Long, _
$ R# ]3 Q1 J) I0 s - ByVal y As Long, _
: v7 R- C" q, e6 A$ T9 J5 D+ _ - ByVal cx As Long, _
+ G0 b2 y! I- }, X% ]- s - ByVal cy As Long, _, k. g: a+ O X$ C9 k. ]
- ByVal wFlags As Long) As Long# `+ _0 j$ y, b
- Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, lpRect As RECT) As Long
1 O: b" n6 h4 E3 v+ I3 b - 6 H6 _+ x" Q6 b4 h
- #End If: u1 c7 ^ U, N- K
- & t e0 o" x8 [3 J. @5 ]. ~* c
- Private lastKnownPosition As RECT
7 U2 N& c: F* o( Z% B$ g/ Y) I% ~1 x - Private lockLastKnownPosition As Boolean
复制代码 ( m7 I2 z9 {! |. l5 J s
梁大,将这一段修改一下 |
|