|
|
|
|
仿照SDK编程写的窗口 |
| 作者:佚名 来源:csdn 作者: jennyvenus 更新:2006-8-25 21:05:35 错误报告 我要投稿 |
|
Option Explicit
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 LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As String) 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 RegisterClassEx Lib "user32" Alias "RegisterClassExA" (pcWndClassEx As WNDCLASSEX) As Integer Public Declare Function ShowWindow Lib "user32" (ByVal handle_of_window As Long, ByVal nCmdShow As Long) As Long Public Declare Function UpdateWindow Lib "user32" (ByVal handle_of_window As Long) As Long Public Declare Function SetFocus Lib "user32" (ByVal handle_of_window As Long) As Long Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal handle_of_window As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal handle_of_window As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal handle_of_window 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 handle_of_window As Long, lpPaint As PAINTSTRUCT) As Long Public Declare Function EndPaint Lib "user32" (ByVal handle_of_window As Long, lpPaint As PAINTSTRUCT) As Long Public Declare Function GetClientRect Lib "user32" (ByVal handle_of_window 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 Type WNDCLASSEX cbSize As Long style As Long lpfnWndProc As Long cbClsExtra As Long cbWndExtra As Long hInstance As Long hIcon As Long hCursor As Long hbrBackground As Long lpszMenuName As String lpszClassName As String hIconSm As Long End Type
Type POINTAPI x As Long y As Long End Type
Type MSG handle_of_window As Long message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End Type
Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type
Type PAINTSTRUCT hdc As Long fErase As Long rcPaint As RECT fRestore As Long fIncUpdate As Long rgbReserved(32) As Byte 'this was declared incorrectly in VB API viewer End Type
Public Const WS_VISIBLE As Long = &H10000000 Public Const WS_VSCROLL As Long = &H200000 Public Const WS_TABSTOP As Long = &H10000 Public Const WS_THICKFRAME As Long = &H40000 Public Const WS_MAXIMIZE As Long = &H1000000 Public Const WS_MAXIMIZEBOX As Long = &H10000 Public Const WS_MINIMIZE As Long = &H20000000 Public Const WS_MINIMIZEBOX As Long = &H20000 Public Const WS_SYSMENU As Long = &H80000 Public Const WS_BORDER As Long = &H800000 Public Const WS_CAPTION As Long = &HC00000 ' WS_BORDER Or WS_DLGFRAME Public Const WS_CHILD As Long = &H40000000 Public Const WS_CHILDWINDOW As Long = (WS_CHILD) Public Const WS_CLIPCHILDREN As Long = &H2000000 Public Const WS_CLIPSIBLINGS As Long = &H4000000 Public Const WS_DISABLED As Long = &H8000000 Public Const WS_DLGFRAME As Long = &H400000 Public Const WS_EX_ACCEPTFILES As Long = &H10& Public Const WS_EX_DLGMODALFRAME As Long = &H1& Public Const WS_EX_NOPARENTNOTIFY As Long = &H4& Public Const WS_EX_TOPMOST As Long = &H8& Public Const WS_EX_TRANSPARENT As Long = &H20& Public Const WS_GROUP As Long = &H20000 Public Const WS_HSCROLL As Long = &H100000 Public Const WS_ICONIC As Long = WS_MINIMIZE Public Const WS_OVERLAPPED As Long = &H0& Public Const WS_OVERLAPPEDWINDOW As Long = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX) Public Const WS_POPUP As Long = &H80000000 Public Const WS_POPUPWINDOW As Long = (WS_POPUP Or WS_BORDER Or WS_SYSMENU) Public Const WS_SIZEBOX As Long = WS_THICKFRAME Public Const WS_TILED As Long = WS_OVERLAPPED Public Const WS_TILEDWINDOW As Long = WS_OVERLAPPEDWINDOW Public Const CW_USEDEFAULT As Long = &H80000000 Public Const CS_HREDRAW As Long = &H2 Public Const CS_VREDRAW As Long = &H1 Public Const IDI_APPLICATION As Long = 32512& Public Const IDC_ARROW As Long = 32512& Public Const WHITE_BRUSH As Integer = 0 Public Const BLACK_BRUSH As Integer = 4 Public Const WM_KEYDOWN As Long = &H100 Public Const WM_CLOSE As Long = &H10 Public Const WM_DESTROY As Long = &H2 Public Const WM_PAINT As Long = &HF Public Const SW_SHOWNORMAL As Long = 1 Public Const DT_CENTER As Long = &H1 Public Const DT_SINGLELINE As Long = &H20 Public Const DT_VCENTER As Long = &H4
Sub Main()
Call vbWinMain End Sub Public Function vbWinMain() As Long
Const CLASSNAME = "hello_world_vb" Const TITLE = "hello, world!" Dim handle_of_window As Long Dim window_class As WNDCLASSEX Dim message As MSG window_class.cbSize = Len(window_class) window_class.style = CS_HREDRAW Or CS_VREDRAW window_class.lpfnWndProc = GetFuncPtr(AddressOf WindowProc) window_class.cbClsExtra = 0& window_class.cbWndExtra = 0& window_class.hInstance = App.hInstance window_class.hIcon = LoadIcon(App.hInstance, IDI_APPLICATION) window_class.hCursor = LoadCursor(App.hInstance, IDC_ARROW) window_class.hbrBackground = GetStockObject(WHITE_BRUSH) window_class.lpszMenuName = 0& window_class.lpszClassName = CLASSNAME window_class.hIconSm = LoadIcon(App.hInstance, IDI_APPLICATION) RegisterClassEx window_class handle_of_window = CreateWindowEx(0&, CLASSNAME, TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0&, 0&, App.hInstance, 0&) ShowWindow handle_of_window, SW_SHOWNORMAL UpdateWindow handle_of_window SetFocus handle_of_window Do While 0 <> GetMessage(message, 0&, 0&, 0&) TranslateMessage message DispatchMessage message Loop vbWinMain = message.wParam End Function
Public Function WindowProc(ByVal handle_of_window As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim ps As PAINTSTRUCT Dim rc As RECT Dim hdc As Long Dim str As String Select Case message Case WM_PAINT hdc = BeginPaint(handle_of_window, ps) Call GetClientRect(handle_of_window, rc) str = "hello, world!" Call DrawText(hdc, str, Len(str), rc, DT_SINGLELINE Or DT_CENTER Or DT_VCENTER) Call EndPaint(handle_of_window, ps) Exit Function 'Case WM_KEYDOWN ' Call PostMessage(handle_of_window, WM_CLOSE, 0, 0) ' Exit Function Case WM_DESTROY PostQuitMessage 0& Exit Function Case Else WindowProc = DefWindowProc(handle_of_window, message, wParam, lParam) End Select End Function Function GetFuncPtr(ByVal lngFnPtr As Long) As Long GetFuncPtr = lngFnPtr End Function
作者Blog:http://blog.csdn.net/jennyvenus/
相关文章
| 位图快速转化成区域 |
| 一种简单的结束无法关闭的DOS窗口的方法 |
| 用MASK方法传送不规则位图 |
| SCO UNIX 5.06 + INFORMIX ONLINE 7.31安装和配置文档(一) |
| Makefile | |
limitworld ( 2004-04-09) |
| 好,楼上的有QQ吗,拜师 |
chen3feng ( 2003-01-23) |
下面这是我两年前写的,看看咋样? :)
发信人: RoachCock (我要做真正不聪明的程序员), 信区: Programming 标 题: 完全使用API的VB程序 发信站: BBS 水木清华站 (Wed May 16 18:09:55 2001) E这是俺发到VB办的,被删了,俺又从未名考来了,希望有些用 发信人: Roach (我爱你), 信区: VisualBasic 标 题: VB程序之终极 API 调用 发信站: 北大未名站 (2000年11月10日18:08:22 星期五), 站内信件 Attribute VB_Name = "Module1" '最经典的 Windows 程序 '消耗本人两晚上的经历,主要用在参数上,包括用 VC 编制 DLL 供其使用... '目的是考验VB的能力,源于我的突发奇想 Option Explicit Private 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 Long '原声明为 String 型,因为要赋值为 NULL只好改为 Long lpszClassName As String End Type Private Type POINTAPI x As Long y As Long End Type Private Type MSG hwnd As Long message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End Type Private Declare Function GetModuleHandle Lib "kernel32" Alias _ "GetModuleHandleA" _ (ByVal lpModuleName As Long) As Long '原为 String Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" _ (ByVal hInstance As Long, ByVal lpIconName As Long) As Long 'lpIconName原为 String Private Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" _ (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) _ As Long Private Declare Function RegisterClass Lib "user32" Alias "RegisterClassA" _ (Class As WNDCLASS) As Long Private 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, ByVal lpParam As Long) As Long Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal _ nCmdShow As Long) As Long Private Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) _ As Long Private Declare Function GetMessage Lib "user32" Alias "GetMessageA" _ (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, _ ByVal wMsgFilterMax As Long) As Long Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA"_ (lpMsg As MSG) As Long Private Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long) Private 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 '常量声明 '窗口风格 Private Const WS_OVERLAPPED = &H0& Private Const WS_CAPTION = &HC00000 Private Const WS_SYSMENU = &H80000 Private Const WS_THICKFRAME = &H40000 Private Const WS_MINIMIZEBOX = &H20000 Private Const WS_MAXIMIZEBOX = &H10000 Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or _ WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX) '窗口缺省大小 Private Const CW_USEDEFAULT = &H80000000 '系统图标 Private Const IDI_APPLICATION = 32512& '白色刷子 Private Const WHITE_BRUSH = 0 '箭头光标 Private Const IDC_ARROW = 32512& '显示风格 Private Const SW_SHOW = 5 'Windows 消息 Private Const WM_NULL = &H0 Private Const WM_CREATE = &H1 Private Const WM_DESTROY = &H2 Private Const WM_MOVE = &H3 Private Const WM_SIZE = &H5 Private Const WM_CLOSE = &H10 '------------------------------------------- Const MainWindowClass = "MainWindowClass" '窗口回调函数 Private Function WndProc(ByVal hwnd As Long, ByVal message As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Dim hdc As Long Select Case message Case WM_DESTROY PostQuitMessage 0 Case WM_CLOSE If MsgBox("Exit Program?", vbYesNo) = vbYes Then PostQuitMessage 0 End If Case Else WndProc = DefWindowProc(hwnd, message, wParam, lParam) Exit Function End Select WndProc = 0 End Function '因为VB支持函数指针的功能很差,只允许向函数传递函数指针,因此用它来变通一下 '原来用 VC 作的 DLL 中的函数,后来不巧被我碰对 Private Function ProcAddress(lpfn As Long) As Long ProcAddress = lpfn End Function '主程序 Sub Main() Dim hInstance As Long Dim hwnd As Long Dim wndcls As WNDCLASS Dim message As MSG Dim atom As Integer hInstance = GetModuleHandle(0) wndcls.style = 0 wndcls.lpfnwndproc = ProcAddress(AddressOf WndProc) wndcls.cbClsextra = 0 wndcls.cbWndExtra2 = 0 wndcls.hInstance = hInstance wndcls.hIcon = LoadIcon(0, IDI_APPLICATION) wndcls.hCursor = LoadCursor(0, IDC_ARROW) wndcls.hbrBackground = GetStockObject(WHITE_BRUSH) wndcls.lpszMenuName = 0 wndcls.lpszClassName = MainWindowClass '注册窗口类 If (RegisterClass(wndcls) = 0) Then MsgBox "Can't Register Class" Exit Sub '创建窗口 hwnd = CreateWindowEx(0, MainWindowClass, "Main Window", _ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, _ CW_USEDEFAULT, CW_USEDEFAULT, _ 0, 0, hInstance, 0) If (hwnd = 0) Then MsgBox "Can't Create Window" Exit Sub End If '显示窗口 ShowWindow hwnd, SW_SHOW '更新窗口 UpdateWindow hwnd '消息循环 While (GetMessage(message, 0, 0, 0)) TranslateMessage message DispatchMessage message Wend End Sub
'Game over -- -- 去山中贼易,去心中贼难.
| |
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
|
|
|
|