我正在尝试相对于其下方控件上的Button显示一个表单。
但Button.top相对于底部表单的标题栏,顶部表单将相对于屏幕。
所以,为了弥补我现在需要的标题栏有多高。
我使用过Form.height-Form.ScalehHeight但是ScaleHeight不包含标题栏或边框,因此Scaleheight会略微膨胀。
任何人都知道如何计算 标题栏的高度?
答案 0 :(得分:9)
您需要使用GetSystemMetrics
API调用来获取标题栏的高度。
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Const SM_CYCAPTION = 4
Property Get TitleBarHeight() as Long
TitleBarHeight = GetSystemMetrics(SM_CYCAPTION)
End Property
注意:这将返回高度(以像素为单位)。如果您需要缇,则必须使用表单的ScaleY
方法进行转换,如下所示:Me.ScaleY(TitleBarHeight(), vbPixels, vbTwips)
答案 1 :(得分:9)
将其减去:
(Form.height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth) / 2
答案 2 :(得分:3)
上面的“递归”答案并不完全正确。它减去边界宽度的两倍 - 左边有一个边框,右边有一个边框!
我们用这个得到了最好的结果:
(Form.Height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth)/2
答案 3 :(得分:3)
' For completeness:
Public Const SM_CYCAPTION = 4
Public Const SM_CYBORDER = 6
Public Const SM_CYFRAME = 33
' in Pixels
Property Get NonClinetHeight()
FrameH = GetSystemMetrics(SM_CYFRAME) ' Total height, Top + Bottom
CaptionH = GetSystemMetrics(SM_CYCAPTION)
BorderH = GetSystemMetrics(SM_CYBORDER) ' Border around Client area
NonClinetHeight = FrameH + CaptionH + (BorderH * 2)
End Property
答案 4 :(得分:1)
您可能需要对GetSystemMetrics()
进行Win32 API调用答案 5 :(得分:1)
您可以使用ClientToScreen()
Windows API函数将点从客户端坐标转换为屏幕坐标:
Dim Position As Point
Position.x = 0
Position.y = 0
ClientToScreen Me.hWnd, Position
FormTop = Position.y
如果你想跳过这个并直接转到按钮,你可以使用按钮的位置(以像素为单位):
Position.x = This.ScaleX(Button.Left, this.ScaleMode, vbPixels)
Position.Y = This.ScaleY(Button.Top, this.ScaleMode, vbPixels)
...
或者只是使用GetWindowRect()
Dim Position2 As Rect
GetClientRect Button.hWnd, Position2
Position.x = Position2.left
Position.y = Position2.top
...