有些API声明成 Byval pt as POINTAPI,不会用了,请教

cyb1017 2004-04-30 09:28:34
例如:DragDetect
Private Declare Function DragDetect Lib "user32.dll" (ByVal hWnd As Long, ByVal pt As POINTAPI) As Long

还有:
Private Declare Function ChildWindowFromPoint Lib "user32.dll" (ByVal hWndParent As Long, ByVal pt As POINTAPI) As Long

Private Declare Function ChildWindowFromPointEx Lib "user32.dll" (ByVal hWnd As Long, ByVal pt As POINTAPI, ByVal un As Long) As Long

使用时会出现用户定义类型不能这么用的错误,我想提示是对的,自定义类型不能按值传递,难道是声明错了?!

不解,还请指教.

...全文
109 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigpag 2004-05-10
  • 打赏
  • 举报
回复
我已经试验过了
pigpag 2004-05-10
  • 打赏
  • 举报
回复
肯定是声名错误

参考了一下,MSDN对WindowFromPoint的声明是:
HWND WindowFromPoint(
POINT Point
);
在VB中的声明是
Declare Function WindowFromPoint Lib "user32.dll" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

显然是根据数据在内存中的安排,将一个参数拆成了两个。这样的做法在其他Byval pt As POINTAPI的地方一样好用。

所以,这些函数中的pt要拆开来声明
Private Declare Function ChildWindowFromPoint Lib "user32.dll" (ByVal hWndParent As Long, ByVal ptX As Long, ByVal ptY As Long) As Long

Private Declare Function DragDetect Lib "user32.dll" (ByVal hWnd As Long, ByVal ptX as Long, ByVal ptY As Long) As Long
sakurako 2004-05-06
  • 打赏
  • 举报
回复
首先声明POINTAPI结构体
然后定义
dim mypoint as POINTAPI
在相应的位置用该变量即可
DragDetect hwnd,mypoint

BitBlt 2004-05-06
  • 打赏
  • 举报
回复
拜托N楼,N+N楼,你们回复时先看一看帖好吗?
lsftest 2004-04-30
  • 打赏
  • 举报
回复
一个例子:
模块中:
Option Explicit


Type POINTAPI
x As Long
y As Long
End Type

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

程序中:
Option Explicit

Private Sub Command1_Click()
Dim point As POINTAPI
GetCursorPos point
MsgBox "(x,y)=(" & point.x & "," & point.y & ")", , "鼠标位置"
End Sub

程序的功能是显示当前鼠标的坐标。。。。
BitBlt 2004-04-30
  • 打赏
  • 举报
回复
ByVal pt as double
dim pd as double
din pt as pointapi
pt.x=1
pt.y=2
copymemory pd,pt,8
调用时用pd.千万不要对pd进行操作!
cyb1017 2004-04-30
  • 打赏
  • 举报
回复
声明了。我没有敲上。抱歉!

我想问的是这句:ByVal pt As POINTAPI

好像不大对啊!出现错误提示和这句有关的,不知道怎么解决。
lsftest 2004-04-30
  • 打赏
  • 举报
回复
你要先在模块里对POINTAPI类型进行声名:
Public Type POINTAPI
x As Long
y As Long
End Type

BitBlt 2004-04-30
  • 打赏
  • 举报
回复
//楼上说得对,对于结构体不能用 byval 传递参数。

理论上是这样的。但API不是专为VB做的。碰到这种问题还得自己解决。

方法就是找个同样大小的基本类型,用copymemory复制过去。
如果找不到同样大小的基本类型,那就只能用string了。

参见http://www.csdn.net/Develop/read_article.asp?id=6350
铁拳 2004-04-30
  • 打赏
  • 举报
回复
楼上说得对,对于结构体不能用 byval 传递参数。
Option Compare Database Option Explicit 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 LoadIcon Lib "user32" Alias "LoadIconA" _ (ByVal hInstance As Long, _ ByVal lpIconName As String) As Long Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" _ (ByVal hInstance As Long, _ ByVal lpCursorName As String) As Long Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" _ (pcWndClassEx As WNDCLASSEX) As Integer Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Declare Function PostMessage Lib "user32" Alias "ostMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) 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 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 Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long) Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long 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 Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, _ ByVal crKey As Long, _ ByVal bAlpha As Byte, _ ByVal dwFlags 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 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 hwnd 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 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 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 Public Const WS_EX_PALETTEWINDOW As Long = &H188 Public Const LWA_ALPHA = &H2 Public Const GWL_EXSTYLE = (-20) Public Const WS_EX_LAYERED = &H80000 Dim strMessage As String '------------------------------------------------------------------------------- Public Function displayMessage(mess As String) As Long strMessage = mess Const CLASSNAME = "我的信息提示~" Const TITLE = "透明提示框!" Dim hwnd As Long Dim wc As WNDCLASSEX Dim message As MSG wc.cbSize = Len(wc) wc.style = CS_HREDRAW Or CS_VREDRAW wc.lpfnWndProc = GetFuncPtr(AddressOf WindowProc) wc.cbClsExtra = 0& wc.cbWndExtra = 0& wc.hInstance = Application.hWndAccessApp wc.hIcon = LoadIcon(Application.hWndAccessApp, IDI_APPLICATION) wc.hCursor = LoadCursor(Application.hWndAccessApp, IDC_ARROW) wc.hbrBackground = GetStockObject(WHITE_BRUSH) wc.lpszMenuName = 0& wc.lpszClassName = CLASSNAME wc.hIconSm = LoadIcon(Application.hWndAccessApp, IDI_APPLICATION) RegisterClassEx wc hwnd = CreateWindowEx(WS_EX_PALETTEWINDOW, _ CLASSNAME, _ TITLE, _ WS_OVERLAPPEDWINDOW, _ 300, _ 100, _ 200, _ 300, _ 0&, _ 0&, _ Application.hWndAccessApp, _ 0&) ShowWindow hwnd, SW_SHOWNORMAL UpdateWindow hwnd SetFocus hwnd Do While 0 <> GetMessage(message, 0&, 0&, 0&) TranslateMessage message DispatchMessage message Loop displayMessage = message.wParam End Function '-------------------------------------------------------------------------------- Public Function WindowProc(ByVal hwnd 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 Select Case message Case WM_PAINT hdc = BeginPaint(hwnd, ps) Call GetClientRect(hwnd, rc) Call DrawText(hdc, strMessage, Len(strMessage), rc, DT_SINGLELINE Or _ DT_CENTER Or DT_VCENTER) Call EndPaint(hwnd, ps) Dim Ret As Long Ret = GetWindowLong(hwnd, GWL_EXSTYLE) Ret = Ret Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, Ret SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA Exit Function Case WM_KEYDOWN Call PostMessage(hwnd, WM_CLOSE, 0, 0) Exit Function Case WM_DESTROY PostQuitMessage 0& Exit Function Case Else WindowProc = DefWindowProc(hwnd, message, wParam, lParam) End Select End Function '-------------------------------------------------------------------------------- Function GetFuncPtr(ByVal lngFnPtr As Long) As Long GetFuncPtr = lngFnPtr End Function 使用方法: 本帖隐藏的内容 Sub text() Call displayMessage("输入需要警示的内容~") End Sub

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧