ART5 (15)









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 3
15
Program wykładu Fizyka II 14 15
15 zabtechnŁódzkiego z
311[15] Z1 01 Wykonywanie pomiarów warsztatowych
15 Wykonywanie rehabilitacyjnych ćwiczeń ortoptycznychid247
10 15 58
15 7 2012
ComboFix 15 1 22 2 2015r

więcej podobnych podstron