感悟网 导航

我想用vb在当前应用窗口指定位置画一个数学函数的图象请问高手用api函数如何实现?

作者&投稿:颜闹 (若有异议请与网页底部的电邮联系)
VB API函数移动窗口~

前提是DNF的标题你知道不?
我写的下面的代码,点击DNF窗体后按[Home]键就能获取句柄,然后控制DNF,可移动,可改变其大小,在窗体上按住右键并移动来确定DNF在屏幕中的位置

'添加时钟控件Timer1,然后复制代码即可
''''''''''''''移动窗体
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
''''''''''''''获取活动窗口句柄
Private Declare Function GetForegroundWindow Lib "user32" () As Long
''''''''''''''判断按键是否按下
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
''''''''''''''获取窗体标题
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
''''''''''''''半透明
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Const WS_EX_LAYERED = &H80000
Private Const GWL_EXSTYLE = (-20)



Dim intGetWindowHWnd As Long
Dim myWidth, myHeight As Long
Dim getWidth As Long
Dim getHeight As Long

Public Sub TMS(hwnd As Long)
Dim ExsTyle As Long, crKey As Long, bAlpha As Byte, dwFlags As Long
ExsTyle = GetWindowLong(hwnd, GWL_EXSTYLE)
ExsTyle = ExsTyle Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, ExsTyle
dwFlags = 2
bAlpha = 150
SetLayeredWindowAttributes hwnd, 0, bAlpha, dwFlags
End Sub


Private Sub Form_Load()
On Error Resume Next
Timer1.Interval = 100
Timer1.Enabled = True
Call TMS(Me.hwnd)
Me.BackColor = vbBlack
Me.AutoRedraw = True
Me.ForeColor = vbGreen
Print: Print "请调整本窗体大小使其与须控制窗口大小相同!"
Me.ForeColor = vbYellow
Print: Print "请将鼠标点击需要控制的窗口,然后按下【Home键】"
myWidth = Width: myHeight = Height
End Sub

Private Sub Form_MouseDown(button As Integer, Shift As Integer, x As Single, y As Single)
On Error Resume Next
If button = 2 Then
Call FormMove(intGetWindowHWnd, getWidth, getHeight, x, y)
End If
End Sub

Private Sub Form_MouseMove(button As Integer, Shift As Integer, x As Single, y As Single)
If button = 2 Then
If FormMove(intGetWindowHWnd, getWidth, getHeight, x, y) Then
Cls
Me.ForeColor = vbRed
Print: Print "移动窗体成功!你可以继续以下操作"
Me.ForeColor = vbGreen
Print: Print "请调整本窗体大小使其与须控制窗口大小相同!"
Me.ForeColor = vbYellow
Print: Print "请将鼠标点击需要控制的窗口,然后按下【Home键】"
End If
End If
End Sub

Private Function FormMove(hwnd As Long, gWidth As Long, gHeight As Long, x As Single, y As Single)
Dim aLeft, aTop, aWidth, aHeight As Long
On Error Resume Next
aLeft = (Screen.Width / Width * x) / Screen.TwipsPerPixelX
aTop = (Screen.Height / Height * y) / Screen.TwipsPerPixelY
aWidth = gWidth / Screen.TwipsPerPixelX
aHeight = gHeight / Screen.TwipsPerPixelY
FormMove = MoveWindow(hwnd, aLeft, aTop, aWidth, aHeight, True)
End Function

Private Sub Timer1_Timer()
Dim strTitle As String * 1024
If GetAsyncKeyState(vbKeyHome) Then
getWidth = Me.Width: getHeight = Me.Height
Me.Width = myWidth: Me.Height = myHeight
intGetWindowHWnd = GetForegroundWindow()
Call GetWindowText(intGetWindowHWnd, strTitle, 1024)
Caption = "窗体移动:" & strTitle
Cls
Me.ForeColor = vbGreen
Print: Print "请调整本窗体大小使其与须控制窗口大小相同!"
Me.ForeColor = vbYellow
Print: Print "请将鼠标点击需要控制的窗口,然后按下【Home键】"
Me.ForeColor = vbRed
Print: Print "获取目标句柄成功成功!请按以下步骤继续操作.."
Me.ForeColor = RGB(150, 150, 255)
Print: Print "请按住鼠标右键在本窗体中移动可控制指定的窗体移动"
End If
End Sub

虽然很长,但是很完整,毕竟是我做好的程序而不仅是为了答题

关于API函数的书!市场上太少了!就算是有,也介绍得很粗浅!你到书店好好找找!我没有API函数的好书介绍给你!
谈一下我的心得吧:
首先,有必要向大家讲一讲,什么是API。API是包含在一个附加名为DLL的动态连接库文件中的。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。

如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,API函数总共大约有110多个。如果要全部掌握!那你非下苦功不可,但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。API函数和WINDOWS具有密切的关系,如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的。

如果你不依靠API会怎么样?我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的,而是在一开始的《本书内容》中指明《本书的阅读对象是具有一定VB基础的读者》的那些书),首先提的问题一般大都是从API开始。因此可以说,你不学API,你大概将停留在初级水平,无法往上攀登。

很多API函数都是很长很长的。想看什么样子吗?如下就是作为例子的API DdeClientTransaction函数∶
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇!这么长?如果你从来没有接触过API,我想你肯定被吓住了。你也许考虑,该不该继续学下去。不过不要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API
文本查看器。

通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪贴板,最后再粘贴到VB程序的代码段中。在大多数情况下,只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通过对API文本游览器的以上操作将他们加入到程序段中,从而程序中可以使用这些函数了。这些是学习API最基本的常识问题,它远远占不到API的庞大的体系内容。今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是∶
什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数。
API函数声明 [返回]

让我们回想一下。在VB中,如何声明函数呢?我想,如果你正在看此文,那么你绝对能够回答得出这个问题。以下便是你应该很熟悉的函数声明∶
Function SetWindowRgn Lib "user32"Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

即,这行代码定义了名为SetWindowRgn的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据。
API函数的声明也很类似,如,API中的SetWindowRgn 函数是这样写的∶

Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long


Declare 语句用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。对此,你只要记住任何API函数声明都必须写这个语句就可以了。
Iib 指明包含所声明过程或函数的动态链接库或代码资源。也就是说,它说明的是,函数或过程从何而来的问题。
如在上例中,SetWindowRgn Lib "user32"说明 函数 SetWindowRgn 来自 user32.dll文件。主要的dll动态连接库文件有∶
user32.dll Windows管理。生成和管理应用程序的用户接口。

GDI32.dll 图形设备接口。产生Windows设备的图形输出
Kernel32.dll 系统服务。访问操作系统的计算机资源。
注意,当DLL文件不在Windows或System文件夹中的时候,必须在函数中说明其出处(
路径)。如,SetFocus Lib "c:\Mydll\user32"
函数声明中的Alias 是可选的。表示将被调用的过程在动态链接库 (DLL) 中还有另外的名称(别名)。如,Alias "SetWindowRgn" ,说明SetWindowRgn函数在User32.dll中的另外一个名称是,
SetWindowRgn。怎么两个名都一样呢?当然,也可以是不同的。在很多情况下,Alias说明的函数名,即别名最后一个字符经常是字符A,如SetWindowsText函数的另一个名称是
SetWindowsTextA,表示为Alias "SetWindowsTextA"。这个A只不过是设计家们的习惯的命名约定,表示函数属于ANSI版本。

需要注意的是,不是所有的API函数都有别名.选用Alias的时候,应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从API
文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。
最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的"通用(General Declarations)段。
数据类型与"类型安全" [返回]

API函数中使用的数据类型基本上和VB中的一样。但作为WIN32的API函数中,不存在Integer
数据类型。另外一点是在API函数中看不到Boolean数据类型。 Variant数据类型在API函数中是以Any的形式出现,如Data As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。

要学好API函数,还得靠自己去慢慢琢磨,勤钻勤练,领会各个API函数的功能和用法!在实际应用中自然会得心应手,游刃有余!



API函数大全:
http://www.gissky.com/Database/ShowArticle.asp?Bid=2&SID=26&ID=1102

API函数系统编程教程:
http://www.qqgb.com/Program/VB/VBAPI/List_1.html

这个我也做过,不必用api函数。你用一个Picturebox,自己设定最大值与最小值,再用描点的方法,每1/10000个自变量描一个点,再用直线把这些点连起来就行了,很简单。

如果你很需要,你可把你的要求发到我的信箱,我给你做再发给你也行。
我的信箱:mark_david@163.com

下载安装matrixvb,用现成的函数,获知留下邮箱我发给你

《vb将指定标题的窗口移动到指定位置》
答:用API函数SETWINDOWSPOS实现 函数声明:Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 函数调用:(将,...

《VB后台点击,执行窗口指定位置点击.就是相对坐标.问题》
答:GetCursorPos Point0 '获取当前鼠标坐标 Point1.X = 2 '指定偏移坐标X值,实际应用时视目标窗体而定 Point1.Y = 2 '指定偏移坐标Y值,实际应用时视目标窗体而定 '将偏移Command2的偏移坐标转换成屏幕坐标 '实际应用时使用指定窗口的句柄 ClientToScreen Command2.hWnd, Point1 '将鼠标移动到...

《用vb做鼠标点击向窗口中任意位置添加指定图片 怎么做》
答:filename = "" Then Exit Sub ' 如果用户添加图片退出该过程filename = CommonDialog1.filename '获得图片路径Image1.Picture = LoadPicture(filename) '加载图片PaintPicture Image1.Picture, X, Y '在鼠标位置添加图片End Sub运行之后点击窗体,就会要求选择图片。添加的图片会出现在鼠标的位置。

《VB中.窗口显示位置:屏幕居中、输入对象正下方、输入对象正上方、右侧...》
答:from有个属性,可以选择界面启动后位置。如果是要自定义位置,使用frm.left,frm.top设置.也可以使用move。不过都要做一下计算。比如一个frm在txt正下方,应该为:frm2.left = frm1.left + frm1.txt1.left;frm2.top = frm1.top + frm1.txt1.top + frm1.txt1.height;

《vb 固定窗口位置》
答:StartUpPosition属性设置为2或者1,启动后都是在同一位置了

《VB 能否控制 office 应用程序窗口的位置和大小》
答:改变指定窗口的位置和大小。顶级窗口可能受最大或最小尺寸的限制,那些尺寸优先于这里设置的参数 返回值 Long,非零表示成功,零表示失败 参数表 参数 类型及说明 hwnd Long,欲移动窗口的句柄 x Long,窗口新的左侧位置 y Long,窗口新的顶部位置 nWidth Long,窗口的新宽度 nHeight Long,窗口的高...

《VB 模拟点击窗口中的某一点坐标》
答:这个很简单的问题,使用方法有很多种我给你思路 1。使用MOUSEEVENTF来模拟,只不过需要算出具体坐标是多少!例如你先要获取窗口在屏幕中的位置然后再换算成实际坐标,这个也是相对坐标的问题 2。使用sendmessage给窗口送一个鼠标消息,消息里带上坐标就可以了 ...

《用VB程序移动某个程序的窗口至300,600(屏幕坐标)》
答:这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,...

《VB滚动条控制窗口位置》
答:不需要最大化除了自画窗体之外 还可以通过把Form的MaxButton设置为False来使最大化按钮失效 想实现滚动条移动窗体只能通过把控件放在载体上面来实现 给你一个简单的思路 新建一个窗体 在窗体上放一个符合你需求 宽度比窗体大的Picture1 在窗体底部放一个HScroll1 把HScroll1的max属性设置为你需要的...

《VB怎么获取当前活动窗口的坐标?》
答:'在窗体上画一个Timer控件,设置其Interval属性为100 '把代码复制到Form1的代码窗口中 '获得活动窗口句柄的API Private Declare Function GetForegroundWindow Lib "user32" () As Long '获得窗口区域结构的API Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, wndRect As ...

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网