Страница: 1 | 2 |
Вопрос: получить высоту заголовка и толщину бордеров окна
Добавлено: 13.10.06 16:49
Автор вопроса: Fever
как получить высоту заголовка и толщину бордеров окна?
Ответы
Всего ответов: 27
Номер ответа: 1
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #1
Добавлено: 13.10.06 17:23
Me.FontSize?
Лучше найди получше способ
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 13.10.06 18:18
GetWindowRect & GetClientRect
Номер ответа: 3
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #3
Добавлено: 13.10.06 18:28
Бред советуете.
GetTitleBarInfo - получить RECT тайтлбара
А бордеры есть подозрение можно узнать через GetSystemMetrics.
SM_CXBORDER, SM_CYBORDER Width and height of a window border, in pixels. This is equivalent to the SM_CXEDGE value for windows with the 3-D look. Вроде это
Номер ответа: 4
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #4
Добавлено: 14.10.06 07:47
GetTitleBarInfo тоже явно не в тему, все необходимое автору ищется через GetSystemMetrics. Бордеры - соответственно SM_CXBORDER и SM_СYBORDER, а заголовок окна - SM_CYCAPTION. Это для так сказать стандартных окон. Для окон с хитрыми стилями есть нюансы, стоит внимательние посмотреть описание GetSystemMetrics
Номер ответа: 5
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #5
Добавлено: 14.10.06 14:03
Мне влом искать было Я как-то юзал GetTitleBar, вот и посоветовал. Этот вариант всяко более в тему чем предложения выше.
Номер ответа: 6
Автор ответа:
Nj
ICQ: 223663115
Вопросов: 21
Ответов: 285
Профиль | | #6
Добавлено: 14.10.06 16:23
А зачем? Случайно не для того, чтобы при ресайзинге формы через свойста Width Heиght формы математически выщитать свойства Width Heиght объекта, скажем текстбокса и растянуть его корректно по форме? Если да, то для этого есть ScaleWidth и ScaleHeight формы.
txbMyTextBox.Width=me.ScaleWidth
txbMyTextBox.height=me.scaleheight
end sub
Номер ответа: 7
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #7
Добавлено: 14.10.06 22:24
Nj - чем я люблю юных программистов на вбэйские так это их умением находить путь длиннее, чем возможно себе представить. Не неси бреда. Это не оригинально, это глупо.
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 15.10.06 00:27
)
толщину бордюра можно высчитать так:
open "C:\Windows\Explorer.exe" for input as #1
Size = Lof(1)
Close #1
Size = me.scalewidth + Size - me.width + sqr(Now)... ну итд, формулу можно усложнять до бесконечности ))
Номер ответа: 9
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #9
Добавлено: 16.10.06 13:43
Че мне нравится метод
TitleHeight=Me.Height-Me.ScaleHeight?
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 16.10.06 14:25
2Ra$cal, единственная бредовость метода что я предложил - его 100% работоспособность в каждом конкретном случае. А всякие там GetSystemMetrics не скажут тебе параметры каждого индивидуального окна. Так что сам, пожалуйста, не тупи.
2Calhoon ScaleMode у формы произвольный? Забавный результат получится.
Номер ответа: 11
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #11
Добавлено: 16.10.06 21:11
Дык не надо играться со Scale... Нафига его менять, пусть в твипах мерится...
Номер ответа: 12
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #12
Добавлено: 17.10.06 01:51
2LamerOnLine
Да, ты меня радуешь Изобрёл велосипед и теперь кричать что он рулиД. Ещё раз скажу, что пользоваться надо теми сервисами, которые предоставляет система. GetTitleBarInfo - именно для тех целей, что спросил автор вопроса и предназначена. Работает 100%. А GetClientRect есть у меня такое подозрение юзает имено эту апи.
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 17.10.06 11:18
2Ra$cal Да, с тобой тоже скучать не приходицца Еще раз скажи - где в структуре TITLEBARINFO толщина бордера? Ну а пока ты его там ищешь - велосипед будет рулиДь
2Calhoon Ты сможешь таким образом измерить заголовок и границы ПРОИЗВОЛЬНОГО (не только своего) окна?
Хватит вам пороть чушь про частные случаи, есть конкретный метод, который работает незваисимо от настроек винды, стиля окна, кривых рук юзера, фазы луны и т.п. Но по идейным соображениям мы не желаем им пользоваться )
Номер ответа: 14
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #14
Добавлено: 17.10.06 16:59
2All пасибо, помогли
ЗЫ
Dim cp As POINTAPI
Dim T As Long, L As Long
Dim Pr As Long, Rc As RECT
Dim i As GUI
Dim f As Boolean
GetCursorPos cp
If Container.hwnd = WindowFromPoint(cp.X, cp.Y) Then
If X = -1 Then
Pr = Container.hwnd
GetWindowRect Pr, Rc
L = Rc.Left
T = Rc.Top
Do Until Pr = 0
Pr = GetParent(Pr)
GetClientRect Pr, Rc
L = L + Rc.Left
T = T + Rc.Top
Loop
cp.X = cp.X - L
cp.Y = cp.Y - T
'If LCase(Mid(mContainer.NAME, 1, 3)) = "frm" Then
' cp.X = cp.X - mContainer.Left * Screen.TwipsPerPixelX - CorrX
' cp.Y = cp.Y - mContainer.Top * Screen.TwipsPerPixelY - CorrY
'ElseIf LCase(Mid(mContainer.NAME, 1, 3)) = "pic" Then
' cp.X = cp.X - mContainer.Left * Screen.TwipsPerPixelX - mContainer.Parent.Left \ Screen.TwipsPerPixelX - CorrX
' cp.Y = cp.Y - mContainer.Top * Screen.TwipsPerPixelY - mContainer.Parent.Top \ Screen.TwipsPerPixelX - CorrY
'End If
Else
cp.X = X
cp.Y = Y
End If
'mContainer.PSet (cp.X, cp.Y), vbBlack
For Each i In mCol
If Not f Then
If i.RLeft <= cp.X And cp.X <= i.RLeft + i.RWidth And _
i.RTop <= cp.Y And cp.Y <= i.RTop + i.RHeight Then
If GetAsyncKeyState(vbKeyLButton) < 0 Then
i.Mode = 2
Else
If i.Mode = 2 Then RaiseEvent Clicked(i.Key)
i.Mode = 1
End If
f = True
Else
i.Mode = 0
End If
Else
i.Mode = 0
End If
If i.NeedRedraw Then i.Draw
Next
Else
For Each i In mCol
i.Mode = 0
If i.NeedRedraw Then i.Draw
Next
End If
End Sub
Номер ответа: 15
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #15
Добавлено: 17.10.06 17:00
2All пасибо, помогли
ЗЫ
Dim cp As POINTAPI
Dim T As Long, L As Long
Dim Pr As Long, Rc As RECT
Dim i As GUI
Dim f As Boolean
GetCursorPos cp
If Container.hwnd = WindowFromPoint(cp.X, cp.Y) Then
If X = -1 Then
Pr = Container.hwnd
GetWindowRect Pr, Rc
L = Rc.Left
T = Rc.Top
Do Until Pr = 0
Pr = GetParent(Pr)
GetClientRect Pr, Rc
L = L + Rc.Left
T = T + Rc.Top
Loop
cp.X = cp.X - L
cp.Y = cp.Y - T
'If LCase(Mid(mContainer.NAME, 1, 3)) = "frm" Then
' cp.X = cp.X - mContainer.Left * Screen.TwipsPerPixelX - CorrX
' cp.Y = cp.Y - mContainer.Top * Screen.TwipsPerPixelY - CorrY
'ElseIf LCase(Mid(mContainer.NAME, 1, 3)) = "pic" Then
' cp.X = cp.X - mContainer.Left * Screen.TwipsPerPixelX - mContainer.Parent.Left \ Screen.TwipsPerPixelX - CorrX
' cp.Y = cp.Y - mContainer.Top * Screen.TwipsPerPixelY - mContainer.Parent.Top \ Screen.TwipsPerPixelX - CorrY
'End If
Else
cp.X = X
cp.Y = Y
End If
'mContainer.PSet (cp.X, cp.Y), vbBlack
For Each i In mCol
If Not f Then
If i.RLeft <= cp.X And cp.X <= i.RLeft + i.RWidth And _
i.RTop <= cp.Y And cp.Y <= i.RTop + i.RHeight Then
If GetAsyncKeyState(vbKeyLButton) < 0 Then
i.Mode = 2
Else
If i.Mode = 2 Then RaiseEvent Clicked(i.Key)
i.Mode = 1
End If
f = True
Else
i.Mode = 0
End If
Else
i.Mode = 0
End If
If i.NeedRedraw Then i.Draw
Next
Else
For Each i In mCol
i.Mode = 0
If i.NeedRedraw Then i.Draw
Next
End If
End Sub