有些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

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

不解,还请指教.

...全文
124 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 传递参数。

1,488

社区成员

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

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