|
| | | |
• II.3. VBA - Okna dialogowe •
- 3.1 Jak pobrać uchwyt okna dialogowego, przecież wywołanie takiego okna wstrzymuje dalsze wykonywanie kodu ?
- 3.2 Jak wyświetlić okno komunikatu, tak by pojawiło się na ekranie, gdy okno Accessa jest (zminimalizowane) nieaktywne przez 3 sek. ?
- 3.3 Jak zmienić wprowadzane znaki w InputBox'ie na ****** ?
- 3.4 Jak sprawdzić, czy w InputBox'ie kliknięto przycisk Anuluj czy OK ?
- 3.5 Jak z MsgBox'a zrobić prymitywny pasek postępu ?
- 3.6 Jak do MsgBox'a wstawić wbudowany wskaźnik postępu MS Access ?
- 3.7 Jak z okna MsgBox'a skopiować tekst komunikatu, zamiast go żmudnie przepisywać ?
- 3.8 Jak zmienić tekst na przyciskach w oknie MsgBox'a ?
| | | | |
|
| | |
|
3.1 Jak pobrać uchwyt okna dialogowego, przecież wywołanie takiego okna wstrzymuje dalsze wykonywanie kodu ?
Private Declare Function GetActiveWindow Lib "user32" () As Long
' poniższe funkcje zadeklarowano jedynie dla potrzeb testu
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function SetWindowText Lib "user32" _
Alias "SetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String) As Long
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long

Private Sub btnTest_Click()
' uruchamiamy Timer, wyświetlamy okno dialogowe i pozostałą część operacji wykonujemy w Form_Timer
Me.TimerInterval = 1500
MsgBox "Okno dialogowe, którego szukamy.", vbExclamation
End Sub

Private Sub Form_Timer()
Dim hActiveWind As Long
Dim hWind As Long
' wyłączamy Timer
Me.TimerInterval = 0
hActiveWind = GetActiveWindow
' Test - sprawdźmy, czy znaleźliśmy właściwe okno
hWind = FindWindowEx(hActiveWind, 0&, _
"Static", vbNullString)
' ukryj ikonę vbExclamation
ShowWindow hWind, False
hWind = FindWindowEx(hActiveWind, hWind, _
"Static", vbNullString)
SetWindowText hWind, "Znaleźliśmy je !" & vbNewLine & _
" Uchwyt okna = " & hActiveWind
End Sub
ΔΔΔ | | | | |
|
| | |
|
3.2 Jak wyświetlić okno komunikatu, tak by pojawiło się na ekranie, gdy okno Accessa jest zminimalizowane (nieaktywne) ?
Private Declare Function MessageBox Lib "user32" _
Alias "MessageBoxA" _
(ByVal hwnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As Long) As Long
Private Const MB_SYSTEMMODAL = &H1000&
Private Const MB_TOPMOST = &H40000
Private Const MB_YESNO = &H4&
Private Const MB_ICONQUESTION = &H20&
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Private Const SW_MINIMIZE = 6
Private Const SW_RESTORE = 9

' przykładowe wywołanie:
Private Sub btnTest_Click()
' minimalizujemy Access'a uruchamiamy Timer
ShowWindow Application.hWndAccessApp, SW_MINIMIZE
Me.TimerInterval = 3000
End Sub

Private Sub Form_Timer()
Dim hWind As Long
Dim lRet As Long
' w timerze formularza sprawdzamy, czy Access jest aktywny porównując uchwyt aktywnego okna z uchwytem okna Accessa
If GetActiveWindow <> Application.hWndAccessApp Then
' wyłączmay Timer
Me.TimerInterval = 0
lRet = zbSysModalMsgBox( _
"Czy zamknąć bazę danych ?", _
"Nieaktywny Access ", _
MB_SYSTEMMODAL Or _
MB_TOPMOST Or MB_YESNO Or _
MB_ICONQUESTION)
If lRet = vbNo Then
ShowWindow Application.hWndAccessApp, SW_RESTORE
Me.TimerInterval = 3000
Else
DoCmd.Quit
End If
End If
End Sub

' wyświetla okno komunikatu, zwraca wartość przycisku, który wybrał użytkownik
Private Function zbSysModalMsgBox( _
sMsg As String, _
sCaption As String, _
lType As Long) As Long
zbSysModalMsgBox = MessageBox( _
Application.hWndAccessApp, _
sMsg, sCaption, lType)
End Function
ΔΔΔ | | | | |
|
| | |
|
3.3 Jak zmienić wprowadzane znaki w InputBox'ie na ****** ?
Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
wParam As Any, _
lParam As Any) As Long
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_GETTEXT = &HD
Private Const WM_SETTEXT = &HC
Private Const EM_SETSEL = &HB1
Private Const MY_PASSWORD_CHAR As Long = 42
Private sDefPsw As String

' przykładowe wywołanie:
Private Sub btnTest_Click()
Dim sRet As String
sDefPsw = "Domyślne hasło"
' uruchom Timer formularza
Me.TimerInterval = 50
' wywołaj InputBox i wpisz gwiazdki, bo przez chwilę jest widoczny jawny tekst,
' reszta zostanie wykonana w Form_Timer
sRet = InputBox("Wprowadź tekst:", "Wpisz hasło", _
String(Len(sDefPsw), _
MY_PASSWORD_CHAR))
If Len(sRet) = 0 Then
MsgBox "Anulowano lub usunięto tekst w InputBox'ie." & _
Else
MsgBox sRet
End If
End Sub

Private Sub Form_Timer()
Dim hWind As Long
Me.TimerInterval = 0
' hWind = FindWindowEx( _
GetActiveWindow, ByVal 0&, _
"Edit", vbNullString)
' lub
hWind = GetFocus
If hWind = 0 Then Exit Sub
SendMessage hWind, _
EM_SETPASSWORDCHAR, _
ByVal MY_PASSWORD_CHAR, _
ByVal 0&
SendMessage hWind, WM_SETTEXT, _
ByVal 0&, ByVal sDefPsw
SendMessage hWind, EM_SETSEL, _
ByVal 0&, ByVal -1&
End Sub
ΔΔΔ | | | | |
|
| | |
|
3.4 Jak sprawdzić, czy w InputBox'ie kliknięto przycisk Anuluj czy OK ?

Private Sub knInputBoxCancelOrOK()
Dim s As String
s = InputBox("Wpisz coś")
If StrPtr(s) Then
MsgBox "wpisano: """ & s & """", , "knInputBox"
Else
MsgBox "Wciśnięto Anuluj", , "knInputBox"
End If
End Sub

' dla tych co nie lubią nieudokumentowanych funkcji:
Private Declare Function lstrcpy Lib "kernel32" _
Alias "lstrcpyA" _
(ByVal lpString1 As String, _
ByVal lpString2 As String) As Long

Private Sub zbInputBoxCancelOrOK()
Dim sOut As String
sOut = Space$(255)
lstrcpy sOut, InputBox("Wprowadź tekst:", "zbInputBox")
sOut = RTrim$(sOut)
If Len(sOut) = 0 Then
MsgBox "Anulowano.", , "zbInputBox"
Else
sOut = Left$(sOut, InStr(1, sOut, _
vbNullChar, vbBinaryCompare) - 1)
MsgBox "Wprowadzono:[" & sOut & "]", , _
"zbInputBoxCancelOrOK"
End If
End Sub
ΔΔΔ | | | | |
|
| | |
|
3.5 Jak z MsgBox'a zrobić prymitywny pasek postępu ?
Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function GetDlgItem Lib "user32" ( _
ByVal hDlg As Long, _
ByVal nIDDlgItem As Long) As Long
Private Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal fEnable As Long) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
wParam As Any, _
lParam As Any) As Long
Private Const WM_CLOSE = &H10
Private Const WM_SETTEXT = &HC
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function MoveWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)
Private Const MY_SIZE_PROGBAR As Long = 32
Private Const MY_CHAR_PROGBAR As String = "#"
Private Const MY_CHR_END As String = "="
Private Type typeMSGBOX
hWndMsg As Long
hBtnOK As Long
hWndStatic As Long
End Type
Private msg As typeMSGBOX
Private lMaxFor As Long
Private Const MY_ID_BTN_OK As Long = 2
Private Const MY_CLASS_STATIC As String = "Static"

' zainicjuj pasek postępu
Private Sub zbIniMsgProgBar()
' uruchom Timer
Me.TimerInterval = 200
' zablokuj odświeżanie pulpitu
LockWindowUpdate GetDesktopWindow
' wywołaj MsgBox, by zrobić z niego ProgressBar
MsgBox "" & vbNewLine & vbNewLine & _
String(MY_SIZE_PROGBAR, _
MY_CHAR_PROGBAR), vbExclamation
LockWindowUpdate False
End Sub

Private Sub Form_Timer()
Dim i As Integer
Dim rctOK As RECT
Dim rctMsg As RECT
Dim hTmp As Long
On Error Resume Next
Me.TimerInterval = 0
With msg
' pobierz uchwyt MsgBox'a i przycisku OK
.hWndMsg = GetActiveWindow
.hBtnOK = GetDlgItem(.hWndMsg, MY_ID_BTN_OK)
' deaktywuj przycisk OK
EnableWindow .hBtnOK, False
' pobierz wymiary okna MsgBox i położenie btnOK
GetWindowRect .hWndMsg, rctMsg
GetWindowRect .hBtnOK, rctOK
' przytnij okno MsgBox nad przyciskiem btnOK
With rctMsg
MoveWindow msg.hWndMsg, .Left, .Top, _
.Right - .Left, _
rctOK.Top - .Top, True
End With
DoEvents
' szukaj ostatniego okna klasy "Static"
Do
hTmp = FindWindowEx(.hWndMsg, ByVal hTmp, _
MY_CLASS_STATIC, vbNullString)
If hTmp <> 0 Then .hWndStatic = hTmp
Loop Until hTmp = 0
' wyzeruj tekst
SendMessage .hWndStatic, WM_SETTEXT, _
ByVal 0&, ByVal vbNullString
End With
' odblokuj odświeżanie
LockWindowUpdate False
DoEvents
' uruchom procedurę przetwarzania
Call zbUpdateMsgProgBar(MY_CHR_END)
End Sub

' ze względu na wykorzystanie okna MsgBox'a jako właściciela paska postępu, musimy poniżej rozpisać całą procedurę przetwarzania
Private Sub zbUpdateMsgProgBar( _
Optional sChrEnd As String = " ")
Dim snCountStep As Single
Dim sStr As String
Dim i As Long
Dim j As Long
Dim k As Long
snCountStep = MY_SIZE_PROGBAR / lMaxFor
REM If Len(sChrEnd) = 0 Then sChrEnd = " "
For i = 0 To lMaxFor
j = CLng(i * snCountStep)
If j > k Then
k = j
sStr = "Wykonuję operację: " & _
CLng(j / snCountStep) & " z " & lMaxFor & _
vbNewLine & vbNewLine & _
String(k, MY_CHAR_PROGBAR)
sStr = sStr & String(MY_SIZE_PROGBAR - k, sChrEnd)
SendMessage msg.hWndStatic, WM_SETTEXT, _
ByVal 0&, ByVal sStr
End If
Sleep 10&
Next
' wtrzymaj działanie, <= tylko w celach poglądowych
Sleep 500&
' zamknij okno MsgBox
EnableWindow msg.hBtnOK, True
SendMessage msg.hWndMsg, WM_CLOSE, _
ByVal 0&, ByVal 0&
End Sub

' przykładowe wywołanie:
Private Sub btnTest_Click()
' ustaw ilość operacji
lMaxFor = 250
zbIniMsgProgBar
End Sub
ΔΔΔ | | | | |
|
| | |
|
3.6 Jak do MsgBox'a wstawić wbudowany wskaźnik postępu MS Access ?
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function SetParent Lib "user32" _
(ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long
Private Declare Function MoveWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Private Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal fEnable As Long) As Long
Private Declare Function GetDlgItem Lib "user32" ( _
ByVal hDlg As Long, _
ByVal nIDDlgItem As Long) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
wParam As Any, _
lParam As Any) As Long
Private Const WM_CLOSE = &H10
Private Const WM_SETTEXT = &HC
Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
Private Const SM_CYCAPTION = 4&
Private Const SM_CXDLGFRAME = 7&
Private Const SM_CYDLGFRAME = 8&
Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Type typeMSGBOX
hWndMsg As Long
hBtnOK As Long
hWndStatic As Long
End Type
Private hOldParent As Long | ' uchwyt rodzica wskaźnika postępu |
Private hProgBar As Long | ' uchwyt okna wskaźnika postępu |
Private hStatBar As Long | ' uchwyt okna StatusBar |
Private rctProgBar As RECT | ' struktura RECT wskaźnika postępu |
Private fStatBarVisible As Boolean | ' początkowy stan paska stanu |
Private lMySizeProgBar As Long | ' wysokość wskaźnika postępu (od 20 do 50 pikseli) |
Private msg As typeMSGBOX | ' uchwyty okien MsgBox'a |
Private Const MY_ID_BTN_OK As Long = 2
Private Const MY_CLASS_STATIC As String = "Static"
Private Const MY_TEXT_MSGBOX As String = "qwerty"

Private Sub zbIniMsgProgBar( _
Optional lSizeProgBar As Long = 28)
fStatBarVisible = Application.GetOption("Show Status Bar")
' możesz ukryć pozostałości paska stanu
' Application.SetOption ("Show Status Bar"), False
' doświadczalnie dobrane ograniczenia
If lSizeProgBar > 50 Then
lMySizeProgBar = 50
ElseIf lSizeProgBar < 21 Then
lMySizeProgBar = 21
Else
lMySizeProgBar = lSizeProgBar
End If
' uruchom Timer
Me.TimerInterval = 100
' wywołaj MsgBox, by wstawić do niego wskaźnik postępu
MsgBox MY_TEXT_MSGBOX
End Sub

Private Sub Form_Timer()
On Error GoTo ErrHandler
Dim rctMsg As RECT | ' struktura RECT okna komunikatu |
Dim rctStatic As RECT | ' struktura RECT pola tekstowego MsgBox |
Dim lHCaption As Long | ' wysokość paska tytułowego okna |
Dim lHBorder As Long | ' wysokość okna dialogowego |
Dim lWBorder As Long | ' szerokość okna dialogowego |
Dim lWProgBar As Long | ' przewidywana szerokość wskaźnika postępu |
Dim lWMsg As Long | ' szerokość okna MsgBox |
Dim lHMsg As Long | ' wysokość okna MsgBox |
Dim lRet As Long | ' zwracana wartość |
Const MY_MARGIN As Long = 20 | ' margines MsgBox'a z prawej strony |
Me.TimerInterval = 0
lWProgBar = (lMySizeProgBar - 12&) * 20& + 6&
' pobierz wysokość paska tytułowego okna
' i wymiary obramowania okna
lHCaption = GetSystemMetrics(SM_CYCAPTION)
lHBorder = GetSystemMetrics(SM_CXDLGFRAME)
lWBorder = GetSystemMetrics(SM_CYDLGFRAME)
msg.hWndMsg = GetActiveWindow
hStatBar = FindWindowEx( _
Application.hWndAccessApp, _
ByVal 0&, "OStatbar", vbNullString)
hProgBar = FindWindowEx( _
hStatBar, ByVal 0&, _
"OStatProg", vbNullString)
' pobierz wymiary okna MsgBox
GetWindowRect msg.hWndMsg, rctMsg
' znajdź uchwyt przycisku OK
msg.hBtnOK = GetDlgItem(msg.hWndMsg, _
MY_ID_BTN_OK)
ShowWindow msg.hBtnOK, False
EnableWindow msg.hBtnOK, False
DoEvents
' niestety MS zmienił ID okna klasy Static w Acc2k
' znajdź uchwyt okna tekstowego ' REM hStatic = GetDlgItem(hDlgMsg, cIdStatic)
' tutaj zakładam, że okno to jest ostatnim dzieckiem okna MsgBox
' W razie problemów można pobrać tekst okna i porównać
' z MY_TEXT_MSGBOX= "qwerty"

msg.hWndStatic = 0
Do
lRet = FindWindowEx( _
msg.hWndMsg, _
ByVal msg.hWndStatic, _
MY_CLASS_STATIC, _
vbNullString)
If lRet = 0 Then Exit Do
msg.hWndStatic = lRet
Loop Until lRet = 0&
' pobierz wymiary okna tekstowego
GetWindowRect msg.hWndStatic, rctStatic
' pobierz wymiary wskaźnika postępu
GetWindowRect hProgBar, rctProgBar
' szerokość okna MsgBox
lWMsg = rctMsg.Right - rctMsg.Left
' jeżeli wskaźnik zaawansowania jest szerszy niż okno MsgBox
With rctMsg
If lWProgBar > lWMsg - 20& Then
.Left = .Left - ((lWProgBar - lWMsg) \ 2&) - MY_MARGIN
.Right = .Right + ((lWProgBar - lWMsg) \ 2&) + MY_MARGIN
End If
' przytnij okno MsgBox poniżej okna tekstowego i powiększ o lMySizeProgBar
.Bottom = .Bottom - (.Bottom - rctStatic.Bottom) + _
lMySizeProgBar
lHMsg = .Bottom - .Top
End With
' ustaw nowego rodzica dla wskaźnika postępu
hOldParent = SetParent(hProgBar, msg.hWndMsg)
With rctMsg
' ustaw wymiary okna MsgBox
MoveWindow msg.hWndMsg, .Left, .Top, _
.Right - .Left, .Bottom - .Top, True
' ustaw położenie i wymiar wskaźnika postępu
MoveWindow hProgBar, 0, _
lHMsg - lMySizeProgBar - _
(lHCaption + lHBorder + lWBorder), _
22& * lMySizeProgBar, _
lMySizeProgBar, True
' pobierz wymiary okna tekstowego
GetWindowRect msg.hWndStatic, rctStatic
' powiększ okno Static na przyjęcie dłuższego tekstu
MoveWindow msg.hWndStatic, rctStatic.Left - .Left, _
(rctStatic.Top - .Top) - (lHCaption + _
lHBorder + lWBorder), _
.Right - .Left - 20&, _
rctStatic.Bottom - rctStatic.Top, True
End With
LockWindowUpdate False
Call zbUpdateMsgProgBar
ExitHere:
Exit Sub
ErrHandler:
DoCmd.SetWarnings True
LockWindowUpdate False
MsgBox Err.Description
Resume ExitHere
End Sub

' ze względu na wykorzystanie MsgBox'a,
' musimy poniżej wpisać całą
' procedurę przetwarzania pętli
Private Sub zbUpdateMsgProgBar()
Dim sStr As String
Dim lMyForTo As Long
Dim i As Long
' musimy znać zakres wywoływanej pętli
lMyForTo = 250
' zainicjuj pasek postępu
Application.SysCmd acSysCmdInitMeter, " ", lMyForTo
' wykonaj przykładową pętlę
For i = 1 To lMyForTo
Application.SysCmd acSysCmdUpdateMeter, i
DoEvents
sStr = "Wykonuję operację: " & i & " z " & lMyForTo
SendMessage msg.hWndStatic, WM_SETTEXT, _
ByVal 0&, ByVal sStr
' zwolnij pętlę w celach poglądowych
Sleep 10&
Next
' usuń wskaźnik postępu
Call zbRemoveMsgProgBar
End Sub

Private Sub zbRemoveMsgProgBar()
' przywróć wskaźnika postępu rodzicowi
hOldParent = SetParent(hProgBar, hOldParent)
' przywróć stare ustawienia wskaźnika postępu
With rctProgBar
MoveWindow hProgBar, 0&, 0&, _
.Right - .Left, .Bottom - .Top, True
End With
' zamknij okno MsgBox i usuń pasek postępu
EnableWindow msg.hBtnOK, True
SendMessage msg.hWndMsg, WM_CLOSE, _
ByVal 0&, ByVal 0&
Application.SysCmd acSysCmdClearStatus
Application.SysCmd acSysCmdRemoveMeter
Application.SetOption ("Show Status Bar"), fStatBarVisible
DoEvents
End Sub

Private Sub btnTest_Click()
On Error Resume Next
LockWindowUpdate GetDesktopWindow
Call zbIniMsgProgBar(28)
LockWindowUpdate False
End Sub
ΔΔΔ | | | | |
|
| | |
|
3.7 Jak z okna MsgBox'a skopiować tekst komunikatu, zamiast go żmudnie przepisywać ?

<cyt>
Totalnie NTG, ale założę się o cokolwiek, że 95% czytających tego posta zaklnie siarczyście w duszy, że tego nie znało wcześniej...
Mianowicie...
Dowolny MsgBox z dowolnej aplikacji Windows ma tę właściwość, że reaguje
(poprawnie!) na Ctrl-C. Wystarczy potem odpalić notepada i wykonać Ctrl-V...
Przyznać się, kto ile razy w życiu przepisywał jakiś długachny komunikat błędu ... :)
</cyt>
ΔΔΔ | | | | |
|
| | |
|
3.8 Jak zmienić tekst na przyciskach w oknie MsgBox'a ?

Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function SetWindowText Lib "user32" _
Alias "SetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String) As Long
Private aBtnTitle(0 To 2) As String

Private Sub btnTest_Click()
Me.TimerInterval = 140
Call LockWindowUpdate(GetDesktopWindow)
' przypisz tytuły dla poszczególnych przycisków okna
aBtnTitle(0) = "Pierwszy"
aBtnTitle(1) = "Drugi"
aBtnTitle(2) = "Trzeci"
'MsgBox "Mój komunikat !", vbYesNo
MsgBox "Mój komunikat !", vbAbortRetryIgnore
End Sub

Private Sub Form_Timer()
Dim hWind As Long
Dim hBtn As Long
Dim i As Long
On Error Resume Next
Me.TimerInterval = 0
' pobierz uchwyt aktywnego okna
hWind = GetActiveWindow
' szukaj przycisków w oknie MsgBox'a i zmieniaj kolejno tytuły
hBtn = FindWindowEx(hWind, 0&, _
"Button", vbNullString)
Do Until hBtn = 0
SetWindowText hBtn, aBtnTitle(i)
hBtn = FindWindowEx(hWind, hBtn, _
"Button", vbNullString)
i = i + 1
Loop
Call LockWindowUpdate(False)
On Error GoTo 0
End Sub
ΔΔΔ | | | | |
|
| |