如何计算VB6中标题栏的高度?

时间:2009-01-30 22:44:16

标签: vb6

我正在尝试相对于其下方控件上的Button显示一个表单。

但Button.top相对于底部表单的标题栏,顶部表单将相对于屏幕。

所以,为了弥补我现在需要的标题栏有多高。

我使用过Form.height-Form.ScalehHeight但是ScaleHeight不包含标题栏边框,因此Scaleheight会略微膨胀。

任何人都知道如何计算 标题栏的高度?

6 个答案:

答案 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
...