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 |