CodeItBetter Programming Another VB Programming Blog

How to create form and controls dynamically

Posted on January 4, 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
'System & API - How to create form and controls dynamically
Option Explicit
 
Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" (Class As WNDCLASS) As Long
Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" _
    (ByVal lpClassName As String, ByVal hInstance As Long) As Long
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 DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As Msg, ByVal hWnd As Long, _
    ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Declare Function TranslateMessage Lib "user32" (lpMsg As Msg) As Long
Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As Msg) As Long
Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _
    ByVal nIndex 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 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
Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, _
    ByVal lpCursorName As Any) As Long
 
Type WNDCLASS
    style As Long
    lpfnwndproc As Long
    cbClsextra As Long
    cbWndExtra2 As Long
    hInstance As Long
    hIcon As Long
    hCursor As Long
    hbrBackground As Long
    lpszMenuName As String
    lpszClassName As String
End Type
Type POINTAPI
    x As Long
    y As Long
End Type
Type Msg
    hWnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type
Public Const COLOR_WINDOW = 5
Public Const BM_CLICK = 245
Public Const CS_VREDRAW = &H1
Public Const CS_HREDRAW = &H2
Public Const CS_KEYCVTWINDOW = &H4
Public Const WS_OVERLAPPED = &H0&
Public Const WS_POPUP = &H80000000
Public Const WS_CHILD = &H40000000
Public Const WS_MINIMIZE = &H20000000
Public Const WS_VISIBLE = &H10000000
Public Const WS_DISABLED = &H8000000
Public Const WS_CLIPSIBLINGS = &H4000000
Public Const WS_CLIPCHILDREN = &H2000000
Public Const WS_MAXIMIZE = &H1000000
Public Const WS_CAPTION = &HC00000    ' WS_BORDER Or WS_DLGFRAME
Public Const WS_BORDER = &H800000
Public Const WS_DLGFRAME = &H400000
Public Const WS_VSCROLL = &H200000
Public Const WS_HSCROLL = &H100000
Public Const WS_SYSMENU = &H80000
Public Const WS_THICKFRAME = &H40000
Public Const WS_GROUP = &H20000
Public Const WS_TABSTOP = &H10000
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_MAXIMIZEBOX = &H10000
Public Const WS_TILED = WS_OVERLAPPED
Public Const WS_ICONIC = WS_MINIMIZE
Public Const WS_SIZEBOX = WS_THICKFRAME
Public Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or _
    WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Public Const WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
Public Const WS_POPUPWINDOW = (WS_POPUP Or WS_BORDER Or WS_SYSMENU)
Public Const WS_CHILDWINDOW = (WS_CHILD)
Public Const WS_EX_CLIENTEDGE = 512
Public Const WM_DESTROY = &H2
Public Const WM_MOVE = &H3
Public Const WM_SIZE = &H5
Public Const SW_HIDE = 0
Public Const SW_SHOWNORMAL = 1
Public Const SW_NORMAL = 1
Public Const SW_SHOW = 5
Public Const SW_MINIMIZE = 6
Public Const IDC_ARROW = 32512&
Public Const GWL_WNDPROC = -4
 
Public lHwndButton As Long
Public lHwndLabel2 As Long
Public lHwndLabel1 As Long
Public lHwndTextbox As Long
Public hWndForm As Long
 
Public Sub Main()
    Dim lStyle As Long
    'Register Class
    Call RegisterClassProc
    'Create a FORM
    lStyle = WS_OVERLAPPED Or WS_SYSMENU Or WS_CLIPCHILDREN Or WS_CLIPSIBLINGS
    hWndForm = CreateWindowEx(0, "MyCoolClass", "Dynamic Form using CreateEx API", lStyle, 0, _
        0, 400, 300, 0, 0, App.hInstance, ByVal 0&)
    'Create controls on the form
    lHwndLabel1 = CreateWindowEx(0, "Static", "New Label1", WS_CHILD, 50, 25, 100, 25, hWndForm, _
        0, App.hInstance, ByVal 0&)
    lHwndLabel2 = CreateWindowEx(0, "Static", "New Label2", WS_CHILD, 50, 55, 100, 25, hWndForm, _
        0, App.hInstance, ByVal 0&)
    lHwndButton = CreateWindowEx(0, "Button", "New Button", WS_CHILD, 50, 90, 100, 25, hWndForm, _
        0, App.hInstance, ByVal 0&)
    lHwndTextbox = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "Sample Text", WS_CHILD, 50, 125, 100, _
        25, hWndForm, 0, App.hInstance, ByVal 0&)
    If hWndForm <> 0 Then ShowWindow hWndForm, SW_SHOWNORMAL
    'Show controls on the new form
    ShowWindow lHwndTextbox, SW_SHOWNORMAL
    ShowWindow lHwndButton, SW_SHOWNORMAL
    ShowWindow lHwndLabel1, SW_SHOWNORMAL
    ShowWindow lHwndLabel2, SW_SHOWNORMAL
    Call MessageProc
End Sub
Private Sub MessageProc()
    Dim ms As Msg
    Do While GetMessage(ms, 0, 0, 0)
        TranslateMessage ms
        DispatchMessage ms
    Loop
End Sub
 
Function ProcessWndProc(ByVal lWndProc As Long) As Long
    ProcessWndProc = lWndProc
End Function
 
Public Sub RegisterClassProc()
    Dim ws As WNDCLASS
    'Prepare Class to be registered
    ws.style = CS_HREDRAW + CS_VREDRAW
    ws.lpfnwndproc = ProcessWndProc(AddressOf WindowProc)
    ws.cbClsextra = 0
    ws.cbWndExtra2 = 0
    ws.hInstance = App.hInstance
    ws.hIcon = 0
    ws.hCursor = LoadCursor(0, IDC_ARROW)
    ws.hbrBackground = COLOR_WINDOW
    ws.lpszMenuName = 0
    ws.lpszClassName = "MyCoolClass"
    'Register Class
    RegisterClass ws
End Sub
 
Private Function WindowProc(ByVal hWnd As Long, ByVal message As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
    Select Case message
    Case WM_DESTROY
        PostQuitMessage (0)
        UnregisterClass "MyCoolClass", App.hInstance
    End Select
    WindowProc = DefWindowProc(hWnd, message, wParam, lParam)
End Function
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


 

No trackbacks yet.