Как вы рассчитываете высоту строки заголовка в VB6? - PullRequest
7 голосов
/ 31 января 2009

Я пытаюсь отобразить одну форму относительно кнопки на элементе управления под ним.

Но Button.top относится к заголовку нижней формы, а верхняя форма будет относиться к экрану.

Итак, чтобы компенсировать это, мне нужно выяснить, какова высота заголовка.

Я использовал Form.height-Form.ScalehHeight, но ScaleHeight не включает в себя строку заголовка или границу, поэтому Scaleheight слегка завышена.

Кто-нибудь знает, как рассчитать высоту , просто в строке заголовка?

Ответы [ 6 ]

9 голосов
/ 31 января 2009

Вычтите это обратно:

(Form.height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth) / 2
9 голосов
/ 31 января 2009

Вам нужно использовать вызов API GetSystemMetrics, чтобы получить высоту заголовка.

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)

3 голосов
/ 10 июня 2011
' 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
3 голосов
/ 02 февраля 2009

Ответ "рекурсивного" выше не совсем корректен. Вычитает вдвое ширину границы - слева есть граница, а справа одна!

Мы получаем лучшие результаты с этим:

(Form.Height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth)/2
1 голос
/ 05 апреля 2013

Вы можете использовать функцию 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
...
1 голос
/ 31 января 2009

Вам, вероятно, потребуется выполнить вызов Win32 API для GetSystemMetrics ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...