📄 040103.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>vb study</title>
<style>
<!--
td {font-size: 9pt}
A:link {text-decoration: none; color: #0033cc;font-size: 9pt}
A:visited {text-decoration: none; color: #0066CC;font-size: 9pt}
A:active {text-decoration: none; color: #ff0000; font-size: 9pt}
A:hover {text-decoration: underline; color: #000000;font-size: 9pt}
-->
</style>
</head>
<body>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0" width="98%">
<tr>
<td width="100%"><a href="#">你的位置</a>:<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="#">VB学习</a>--<a href="#">API函数</a></td>
</tr>
<tr>
<td width="100%">
<p align="center">窗口类函数</td>
</tr>
<tr>
<td width="100%"><br>
SetWindowPos函数:使窗口停留在屏幕最顶层。<br>
声明:<br>
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _<br>
ByVal hWndinsertAfter As Long, ByVal x As Long, ByVal y As Long, _<br>
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long<br>
调用如:<br>
Private Sub Form_Load()<br>
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, &H2 + &H1<br>
End Sub 窗口form1将保留在屏幕表面。<br>
该函数功能是为窗口指定1个新的位置和状态。参数:<br>
hwnd:欲定位的窗口。<br>
hwndinsertAfter:指定窗口的位置。 可能选用下述值之一: <br>
HWND_BOTTOM 将窗口置于窗口列表底部 <br>
HWND_TOP 将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序 <br>
HWND_TOPMOST(值-1) 将窗口置于列表顶部,并位于任何最顶部窗口的前面 <br>
HWND_NOTOPMOST(值-2) 将窗口置于列表顶部,并位于任何最顶部窗口的后面 <br>
x: 窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示 <br>
y: 窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示 <br>
cx:指定新的窗口宽度 <br>
cy:指定新的窗口高度 <br>
wFlags:包含了游标的一个整数,可能为下述值或其组合。 <br>
SWP_DRAWFRAME 围绕窗口画一个框 <br>
SWP_HIDEWINDOW 隐藏窗口 <br>
SWP_NOACTIVATE 不激活窗口 <br>
SWP_NOMOVE 保持当前位置(x和y设定将被忽略) <br>
SWP_NOREDRAW 窗口不自动重画 <br>
SWP_NOSIZE 保持当前大小(cx和cy会被忽略) <br>
SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略) <br>
SWP_SHOWWINDOW 显示窗口 <br>
SWP_FRAMECHANGED 强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有改变 <br>
======<br>
移动无标题栏的窗口:在标准模块中声明<br>
Declare Function ReleaseCapture Lib "user32" () As Long<br>
ReleaseCapture函数:为当前程序释放鼠标捕获。<br>
Declare Function SendMessage Lib "user32" _<br>
Alias "SendMessageA" ( _<br>
ByVal hwnd As Long, ByVal wMsg As Long, _<br>
ByVal wParam As Long, lParam As Any) As Long<br>
Public Const HTCAPTION = 2<br>
Public Const WM_NCLBUTTONDOWN = &HA1 此消息指在窗口的非客户区域内按下左键<br>
在FORM_mousedown事件中写:<br>
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)<br>
ReleaseCapture (此句为释放鼠标本来在Form客户区的捕获)<br>
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&<br>
End Sub<br>
====<br>
创建椭圆(不规则)窗口:SetWindowRgn函数结合CreateEllipticRgn椭圆函数<br>
SetWindowRgn函数用来创建不规则窗口,如椭圆(结合CreateEllipticRgn),多边形(结合CreatePolygonRgn),矩形(结合CreateRectRgn),圆角矩形(结合CreateRoundRectRgn)等。 <br>
声明:<br>
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long<br>
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _<br>
ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long<br>
调用如:<br>
Private Sub Form_Load()<br>
SetWindowRgn hWnd, CreateEllipticRgn(0, 0, 300, 200), True<br>
End Sub<br>
SetWindowRgn函数用于创建不规则窗口,可创建任何几何形状的窗口,只要用Create…Rgn函数返回值传入各种形状区域句柄,参数:<br>
参数 类型及说明 <br>
hWnd:将设置其区域的窗口的句柄。 <br>
hRgn:设置好的区域的句柄,一旦设置了该区域,就不能使用或修改该区域句柄,也不要删除它 <br>
bRedraw:是否立即重画窗口,若为TRUE,则立即重画窗口 <br>
注:为区域指定的所有坐标都以窗口坐标(和客户坐标不完全相同)表示,它们以整个窗口(包括标题栏和边框,而客户坐标是指不包括标题栏的窗口内部有效区域)的左上角为起点<br>
椭圆CreateEllipticRgn函数:创建一个椭圆,该椭圆以X1,Y1和X2,Y2坐标点确定的矩形内切。参数:<br>
X1,Y1:内切矩形左上角X,Y坐标 <br>
X2,Y2:内切矩形右下角X,Y坐标 <br>
====<br>
得到屏幕有效区大小(除去任务条):SystemParametersInfoA<br>
声明:<br>
Private Type RECT <br>
Left As Long<br>
top As Long<br>
Right As Long<br>
Botton As Long<br>
End Type<br>
Private Declare Function SystemParametersInfoA Lib "user32" _<br>
(ByVal uAction As Long, ByVal uParam As Long, ByRef lpvparam _<br>
As Any, ByVal fuWinIni As Long) As Long<br>
调用如:将窗体移到屏幕有效区中央。<br>
Private Sub Command2_Click()<br>
Dim ScreenWidth&<br>
Dim ScreenHeight&<br>
Dim ScreenLeft&<br>
Dim ScreenTop&<br>
Dim DesktopArea As RECT<br>
Const SPI_GETWORKAREA = 48 <br>
Call SystemParametersInfoA(SPI_GETWORKAREA, 0, DesktopArea, 0)<br>
ScreenHeight = (DesktopArea.Botton - DesktopArea.top) * Screen.TwipsPerPixelY<br>
ScreenWidth = (DesktopArea.Right - DesktopArea.Left) * Screen.TwipsPerPixelX<br>
ScreenLeft = DesktopArea.Left * Screen.TwipsPerPixelX<br>
ScreenTop = DesktopArea.top * Screen.TwipsPerPixelY<br>
Form1.Move (ScreenWidth - Form1.Width) / 2 + ScreenLeft, (ScreenHeight - Form1.Height) / 2 + ScreenTop<br>
End Sub<br>
SystemParametersInfoA函数可用来获取和设置数量众多的windows系统参数。<br>
参数请查看资料。<br>
====<br>
获得窗口在屏幕上的范围:GetWindowRect函数<br>
包括窗口的边框,标题栏,滚动条及菜单,客户区等在内,即整个窗口在屏幕上所占的范围.声明:<br>
Declare Function GetWindowRect Lib "user32"(ByVal hwnd As Long, lpRect As RECT) As Long<br>
第一个参数是窗口句柄,第二个参数装载窗口范围的坐标值,为一个结构类型,声明如下:<br>
Public Type RECT<br>
Left As Long<br>
Top As Long<br>
Right As Long<br>
Bottom As Long<br>
End Type<br>
该参数返回窗口在屏幕中的范围值,单位为象素。调用如:<br>
Private Sub Command1_Click()<br>
GetWindowRect Command1.hwnd, lxx<br>
Print lxx.Left, lxx.Top, lxx.Right, lxx.Bottom <br>
End Sub<br>
===========================================<br>
改变指定窗口的位置和大小:MoveWindow函数<br>
相当于VB内置的Move方法,但作为API,功能当然更强大,它可对任何非本进程的窗口进行改变,声明:<br>
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<br>
第一个参数为要移动的窗口句柄,第二,三,四,五个参数为窗口移动后的新横坐标,新纵坐标,新宽度,新高度,第六个参数为是否立即对窗口进行重画,用True或False。调用如:<br>
MoveWindow Command1.hwnd, 0, 0, 100, 100, True<br>
因为改变的是对象在父窗口中的位置,所以Command1按纽被移到窗体Form1的客户区左上角去了。 <br>
=====<br>
判断屏幕上1指定点的客户区坐标:ScreenToClient函数 <br>
判断屏幕上某点相对于指定窗口内的坐标。声明:<br>
Private Type POINTAPI<br>
x As Long<br>
y As Long<br>
End Type<br>
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long<br>
该函数用以测量点lpPoint在句柄为hwnd的窗口内的坐标(如超越此窗口则为负数)。调用如:<br>
Private Sub Command1_Click()<br>
Dim lxn As POINTAPI<br>
lxn.x = 100: lxn.y = 100<br>
Call ScreenToClient(Form1.hwnd, lxn)<br>
Print lxn.x, lxn.y<br>
End Sub<br>
上例在调用前的lxn参数100,100是屏幕坐标,调用函数后lxn的值是"屏幕坐标为(100,100)的点在form1中的客户坐标是多少。如返回lxn.x=41,lxn.y=38,单位仍为象素,不会变为form1内部的缇。<br>
===<br>
获得窗口内以客户坐标表示的1个点的屏幕坐标 : ClientToScreen函数<br>
该函数与上面那个正好相反。这里是已知客户坐标求屏幕坐标。注:客户坐标单位须先转为象素。<br>
声明:<br>
Declare Function ClientToScreen Lib "user32"(ByVal hwnd As Long, lpPoint As POINTAPI) As Long<br>
参数hwnd:点所在的客户区窗口的句柄。<br>
参数lpPoint:传入点的客户区坐标(单位要为象素),并返回点的屏幕坐标(象素)。<br>
调用如: <br>
Dim m As POINTAPI<br>
m.X = 50: m.Y = 70<br>
a = ClientToScreen(Form1.hwnd, m)<br>
Print m.X, m.Y<br>
该函数应用的是参数lpPoint返回值。 <br>
======<br>
获得屏幕上某指定点所在的窗口的句柄 : WindowFromPoint函数 <br>
声明:<br>
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long<br>
参数xPoint,yPoint是某点的"屏幕坐标"。函数返回值为包含该点的窗口句柄。<br>
调用如:<br>
Private Sub Command2_Click()<br>
Dim hwnd As Long<br>
hwnd = WindowFromPoint(1, 1)<br>
Print hwnd<br>
End Sub<br>
上例表示屏幕上点(1,1)处在句柄为hwnd的窗口内。<br>
此函数返回的句柄不包含隐藏、屏蔽、透明窗口的。如果要指出屏幕上某点所属的所有窗口,就请用ChildWindowFromPoint函数。<br>
=========== 获取屏幕上某个窗口内某点的颜色值: GetPixel函数<br>
该函数在指定设备场景中取得1个象素的颜色RGB值。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -