Programowanie od podstaw
Programowanie od podstaw (4)
Common Controls - wspólne kotrolki. Zapewne używasz ich za pomocą dodania do
projektu pliku mscomctl32.ocx, czyż nie? Tą bibliotekę stworzono po to by dosłownie
utrudnić życie programistom. Powinna ona ułatwiać nam życie, jednak tak nie jest, a
czemu? Bo Microsoft nie rozprowadza jej standardowo z Windows'em, dlatego zawsze kiedy
chcemy zainstalować program używający Common Controls na innym komputerze, to musimy
też dodać tego OCX'a który zajmuje trochę (dużo) miejsca.
Cóż, nie wszystko stracone, przecież mscomctl32.ocx to tylko biblioteka
pośrednicząca, a my możemy załadować sobie je prosto z comctl32.dll. Oczywiście
obsługa jest trudniejsza, ale na pewno sobie poradzisz.
Stworzymy pasek stanu - ProgressBar. Utwórz projekt i dodaj do niego moduł, wklej do
Form1 coś takiego:
'stałe programu
Const ICC_PROGRESS_CLAsS =
&H20 ' klasa ProgresBar'a (dla initializacji)
Const GWL_WNDPROC = (-4) 'stała
procedury zdarzeniowej dla SetWindowLong
Const WS_VIsIBLE =
&H10000000 'stałe dla CreateWindowEx
Const WS_CHILD = &H40000000
Private Sub Form_Load()
'załużmy, że Internet Explorer w wersji
przynajmniej trzeciej jest zainstalowany
Const
IE3_INSTALLED = True
If
IE3_INSTALLED = True Then
'tworzymy typ
initializacji
Dim initcc As InitCommonControlsExType
initcc.dwSize = Len(initcc)
'ustawiamy klasę
initcc.dwICC = ICC_PROGRESS_CLAsS
'initializujemy
InitCommonControlsEx
initcc
Else
'initializujemy
InitCommonControls
End If
'tworzymy obiekt (typu okna). Są już dostępne
dodatkowe klasy
mWnd = CreateWindowEx(0, "msctls_progress",
"ProgressBar", WS_VIsIBLE Or
WS_CHILD, 10, 10, 150, 10, Me.hwnd, ByVal 0&, ByVal 0&, ByVal 0&)
'ustawiamy procedure zdarzeniową obiektu o
uchwycie mWnd, procedura stara
'będzie przechowywana w PrevProc, zaś nowa to ProgressProc
PrevProc = SetWindowLong(mWnd,
GWL_WNDPROC, AddressOf ProgressProc)
'ustawiamy właściwości ProgressBar'a
Call
SendMessage(mWnd, PBM_SetPOS, 75, ByVal
0&) 'zapełnienie 75%
End Sub
Private Sub Form_Unload(Cancel As Integer)
'niszczymy obiekt progressbar'a
DestroyWindow mWnd
End Sub
Teraz do modułu wklej:
Type InitCommonControlsExType
dwSize As Long
dwICC As Long
End Type
Declare Sub InitCommonControls Lib "comctl32" ()
Declare Function InitCommonControlsEx Lib "comctl32"
(init As InitCommonControlsExType) As Boolean
Declare Function CreateWindowEx Lib "user32" Alias
"CreateWindowExA" (ByVal dwExStyle As Long, ByVal
lpClassName As String, ByVal lpWindowName As String,
ByVal dwStyle As Long, ByVal x As
Long, ByVal y As Long, ByVal
nWidth As Long,
ByVal nHeight As Long, ByVal hWndParent As Long, ByVal
hMenu As Long, ByVal hInstance As Long, lpParam As Any)
As Long
Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As
Long
Declare Function SetWindowLong Lib
"user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal
nIndex As Long, ByVal dwNewLong As
Long) As Long
Declare Function SendMessage Lib "user32" Alias
"SendMessageA" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal
wParam As Integer, ByVal lParam As Any)
As Long
Public Const WM_USER = &H400
'komunikaty dla Progress Bar'a
Public Const PBM_SetRANGE = (WM_USER + 1)
Public Const PBM_SetPOS = (WM_USER + 2)
Public Const PBM_DELTAPOS =
(WM_USER + 3)
Public Const PBM_SetStep = (WM_USER + 4)
Public Const PBM_StepIT = (WM_USER + 5)
Public Const PBM_SetBARCOLOr = (WM_USER + 9)
Public mWnd As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal
lpPrevWndFunc As Long, ByVal hwnd As Long,
ByVal Msg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
Public PrevProc As Long
'procedura zdarzeniowa ProgressBar'a, tutaj raczej pusta
Public Function ProgressProc(ByVal hwnd As Long,
ByVal uMsg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc,
hwnd, uMsg, wParam, lParam)
End Function
Myślę, że bezproblemowo został stworzony ProgressBar. Podobnie działają inne
kontrolki Common Controls. Przyznasz, że stosunkowo prosto, biorąc jako punkt
odniesienia tworzenie tylko zwykłego okna.
W następnej, ostatniej już części tego obszernego artykułu dowiesz się, jak tworzyć
menu, ale nie te zwykłe, ale systemowe, które pokazuje się po kliknięciu na ikonę
okna...
Artykuł zainspirowany www.allapi.net.
Marcin Porębski ( Doogie )
marcin.porebski@interia.pl
Wyszukiwarka
Podobne podstrony:
15 315Program wykładu Fizyka II 14 1515 zabtechnŁódzkiego z311[15] Z1 01 Wykonywanie pomiarów warsztatowych15 Wykonywanie rehabilitacyjnych ćwiczeń ortoptycznychid24710 15 5815 7 2012ComboFix 15 1 22 2 2015rwięcej podobnych podstron