Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: получить высоту заголовка и толщину бордеров окна Добавлено: 13.10.06 16:49  

Автор вопроса:  Fever
как получить высоту заголовка и толщину бордеров окна?

Ответить

  Ответы Всего ответов: 27  

Номер ответа: 1
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #1
Добавлено: 13.10.06 17:23
как получить высоту заголовка

Me.FontSize?
толщину бордеров окна
Когда-то я делал так: x, полученный через getcursorpos, минус x, полученный в mousedown развернутого окна...
Лучше найди получше способ

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 13.10.06 18:18
GetWindowRect & GetClientRect

Ответить

Номер ответа: 3
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #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-сайт: www.rascalspb.narod.ru
 Профиль | | #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 формы.
sub form_resize
txbMyTextBox.Width=me.ScaleWidth
txbMyTextBox.height=me.scaleheight
end sub
Отсюда следует также, что бордюры слева и справа (общий размер) можно получить через me.width-me.scalewidth, обычно бордеры одинаковые и делением пополам получим толщину бордера. Обычно нижний бордер = левому и правому, они же типа рамка :)) Следовательно ТитлБар равен me.height - (me.scaleheight -((me.width-me.scalewidth)\2)) Вот такое изощрение визаут АПИ :)) ИМХо. Оригинально, да? Работает только для стандартных окон

Ответить

Номер ответа: 7
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #7
Добавлено: 14.10.06 22:24
Nj - чем я люблю юных программистов на вбэйские так это их умением находить путь длиннее, чем возможно себе представить. Не неси бреда. Это не оригинально, это глупо.

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 15.10.06 00:27
Отсюда следует также, что бордюры слева и справа (общий размер) можно получить через me.width-me.scalewidth

:))
толщину бордюра можно высчитать так:
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-сайт: 4elovekssn.blog.ru
 Профиль | | #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-сайт: 4elovekssn.blog.ru
 Профиль | | #11
Добавлено: 16.10.06 21:11
ScaleMode у формы произвольный? Забавный результат получится.

Дык не надо играться со Scale... Нафига его менять, пусть в твипах мерится...

Ответить

Номер ответа: 12
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #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 пасибо, помогли
ЗЫ
ScaleMode у формы произвольный? Забавный результат получится.
Да, есть чуток... Короче такая нетривиальная задачка: дан HWND и абсолютные координаты курсора. Надо найти относительные координаты курсора в пикселях. Короче вышло что-то вроде

Public Sub Moved()
    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 пасибо, помогли
ЗЫ
ScaleMode у формы произвольный? Забавный результат получится.
Да, есть чуток... Короче такая нетривиальная задачка: дан HWND и абсолютные координаты курсора. Надо найти относительные координаты курсора в пикселях. Короче вышло что-то вроде

Public Sub Moved()
    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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам