最近在学习Program Windows这本巨著.
非常不幸,电脑上没有装VC,不过有VB.
能不能用VB来跑跑其中的程序呢.
答案是可以的.
代码如下,立此存照.
先是API,结果,常量的定义引入
- '方法定义
- Public 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
- Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As String) As Long
- Public Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
- Public Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" (Class As WNDCLASS) As Long
- Public Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long
- Public 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
- Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
- Public Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
- Public Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
- Public Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
- Public Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
- Public Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
- Public Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
- Public Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
- Public Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
- Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
- '下面是数据类型定义
- Public 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
- Public Type POINTAPI
- x As Long
- y As Long
- End Type
- Public Type MSG
- hwnd As Long
- message As Long
- wParam As Long
- lParam As Long
- time As Long
- pt As POINTAPI
- End Type
- Public Type RECT
- Left As Long
- Top As Long
- Right As Long
- Bottom As Long
- End Type
- Public Type PAINTSTRUCT
- hdc As Long
- fErase As Long
- rcPaint As RECT
- fRestore As Long
- fIncUpdate As Long
- rgbReserved(32) As Byte
- End Type
- '下面是常数定义
- Public Const CS_HREDRAW = &H2
- Public Const CS_VREDRAW = &H1
- Public Const IDC_ARROW = 32512&
- Public Const WHITE_BRUSH = 0
- Public Const COLOR_WINDOW = 5
- Public Const WS_OVERLAPPED = &H0&
- Public Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME
- Public Const WS_SYSMENU = &H80000
- Public Const WS_THICKFRAME = &H40000
- Public Const WS_MINIMIZE = &H20000000
- Public Const WS_MINIMIZEBOX = &H20000
- Public Const WS_MAXIMIZEBOX = &H10000
- Public Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
- Public Const CW_USEDEFAULT = &H80000000
- Public Const SW_SHOWNORMAL = 1
- Public Const WM_DESTROY = &H2
- Public Const WM_PAINT = &HF
- Public Const DT_SINGLELINE = &H20
- Public Const DT_CENTER = &H1
- Public Const DT_VCENTER = &H4
'方法定义
Public 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
Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As String) As Long
Public Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
Public Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" (Class As WNDCLASS) As Long
Public Declare Function UnregisterClass Lib "user32" Alias "UnregisterClassA" (ByVal lpClassName As String, ByVal hInstance As Long) As Long
Public 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
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Public Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
Public Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
Public Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long)
Public Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
Public Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long
Public Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
'下面是数据类型定义
Public 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
Public Type POINTAPI
x As Long
y As Long
End Type
Public Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type PAINTSTRUCT
hdc As Long
fErase As Long
rcPaint As RECT
fRestore As Long
fIncUpdate As Long
rgbReserved(32) As Byte
End Type
'下面是常数定义
Public Const CS_HREDRAW = &H2
Public Const CS_VREDRAW = &H1
Public Const IDC_ARROW = 32512&
Public Const WHITE_BRUSH = 0
Public Const COLOR_WINDOW = 5
Public Const WS_OVERLAPPED = &H0&
Public Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME
Public Const WS_SYSMENU = &H80000
Public Const WS_THICKFRAME = &H40000
Public Const WS_MINIMIZE = &H20000000
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_MAXIMIZEBOX = &H10000
Public Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Public Const CW_USEDEFAULT = &H80000000
Public Const SW_SHOWNORMAL = 1
Public Const WM_DESTROY = &H2
Public Const WM_PAINT = &HF
Public Const DT_SINGLELINE = &H20
Public Const DT_CENTER = &H1
Public Const DT_VCENTER = &H4
下面是代码
- Option Explicit
- '代码从program windows这本书里面抄过来
- '改造成直接调用windowsAPI的形式
- Public Sub Main()
- '1定义一个window类型
- Dim wndclass1 As WNDCLASS
- wndclass1.style = CS_HREDRAW + CS_VREDRAW
- wndclass1.lpfnwndproc = GetMyWndProc(AddressOf WndProc)
- wndclass1.cbClsextra = 0
- wndclass1.cbWndExtra2 = 0
- wndclass1.hInstance = App.hInstance
- wndclass1.hIcon = 0
- wndclass1.hCursor = LoadCursor(0, IDC_ARROW)
- wndclass1.hbrBackground = COLOR_WINDOW
- wndclass1.lpszMenuName = 0
- wndclass1.lpszClassName = "myhello1"
- '2注册这个window类
- If RegisterClass(wndclass1) = 0 Then
- MsgBox "This program need WindowsNT!", vbOKOnly, "register failed!"
- Exit Sub
- Else
- 'MsgBox "register ok"
- End If
- '3.创建一个window窗口出来
- Dim hwnd As Long
- hwnd = CreateWindowEx(0, "myhello1", "mywindow", WS_OVERLAPPEDWINDOW, _
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, App.hInstance, ByVal 0&)
- If hwnd <> 0 Then
- MsgBox "create window ok."
- 'ShowWindow hwnd, SW_SHOWNORMAL
- 'UpdateWindow hwnd
- Else
- MsgBox "create window fail."
- Exit Sub
- End If
- ShowWindow hwnd, SW_SHOWNORMAL
- UpdateWindow hwnd
- '4.消息处理
- Dim msg1 As MSG
- Do While GetMessage(msg1, hwnd, 0, 0) > 0
- TranslateMessage msg1
- DispatchMessage msg1
- Loop
- MsgBox ("unregister window class")
- '3取消类的注册
- UnregisterClass "myhello1", App.hInstance
- End Sub
- 'window procedure
- '窗口消息处理程序
- '先不进行额外处理
- Private Function WndProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Select Case (message)
- Case WM_PAINT
- Dim ps As PAINTSTRUCT
- Dim hdc As Long
- Dim rect1 As RECT
- hdc = BeginPaint(hwnd, ps)
- GetClientRect hwnd, rect1
- DrawText hdc, "Hello, Windows 98!", -1, rect1, _
- DT_SINGLELINE + DT_CENTER + DT_VCENTER
- EndPaint hwnd, ps
- WndProc = 0
- Exit Function
- Case WM_DESTROY
- PostQuitMessage (0)
- WndProc = 0
- Exit Function
- End Select
- WndProc = DefWindowProc(hwnd, message, wParam, lParam)
- End Function
- '得到回调函数地址的方法
- Function GetMyWndProc(ByVal lWndProc As Long) As Long
- GetMyWndProc = lWndProc
- End Function