2009-01-30 1 views
7

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

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

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

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

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

ответ

9

Вычесть его обратно:

(Form.height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth)/2 
+0

Элегантный! FYI, есть опечатка, закрепленная ниже. (Мне не хватает репутации для редактирования) (Form.height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth) –

+0

Sneaky. Мне это нравится! – rpetrich

+1

Мы используем ту же технику. Есть еще опечатка. Как написано выше, вы дважды вычитаете границу. Должно быть (Form.height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth)/2 – MarkJ

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)

3

«Рекурсивный в» ответ выше, не совсем правильно. Он вычитает в два раза ширину границы - есть левая и правая границы.

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

(Form.Height-Form.ScaleHeight) - (Form.Width-Form.ScaleWidth)/2 
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 
1

Вы можете использовать функцию ClientToScreen() окна 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 
...