Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эффект прилипания к краю экрана 
V
    Опции темы
ProgramerForever
  Дата 16.5.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



День добрый! Возникла задача сделать форму, "прилипающую" к краям экрана. Как, например, в Qip. Написал код:
Код

'Декларации API
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Sub ReleaseCapture Lib "user32" ()
    Private Const WM_NCLBUTTONDOWN = &HA1
    Private Const HTCAPTION = 2
'Глобальные константы
    Const strProduct = "ГишаSoft - QickFlash" 'Строка продукта
    Const strIniFileName = "Global.ini" 'Имя INI-файла
'Переменные для инишки
    Dim intTransparentLevel As Integer 'Уровень прозрачности окна [0..255]
    Dim intFormHeight As Integer 'Высота окна (px)
    Dim intFormWidth As Integer 'Ширина окна (px)
    Dim intFormX As Integer 'X-координата окна (px)
    Dim intFormY As Integer 'Y-координата окна (px)
    Dim intFormGlueKX As Double 'Коэффициент "прилипания" для X
    Dim intFormGlueKY As Double 'Коэффициент "прилипания" для Y
'Вспомогательные переменные
    Dim LastX As Single, LastY As Single 'Для тягания окна не только за заголовок
    'Dim MouseButton As Integer 'Какая кнопка мыши нажата в данный момент
    'Dim old_form_left, old_form_top As Long

Private Sub Form_DblClick()
    End
End Sub


Private Sub Form_Load()
    Me.Caption = strProduct 'Строку продукта - в заголовок окна
    Dim strFullIniFileName As String 'Полный путь до INI-файла
    
    strFullIniFileName = Replace(App.Path + "\" + strIniFileName, "\\", "\")
    
    ' [View] TransparentLevel=200 ; Уровень прозрачности окна [1..255]
    intTransparentLevel = INI.GetValueInteger("View", "TransparentLevel", strFullIniFileName) 'Чтение уровня прозрачности из INI
    If ((intTransparentLevel < 1) Or (intTransparentLevel > 255)) Then 'Если прочитали корявое значение, то
        intTransparentLevel = 200 'Сбрасываем переменную в Default
        INI.SetValue "View", "TransparentLevel", "200 ; Уровень прозрачности окна [1..255]", strFullIniFileName 'И записываем Default в файл
    End If
    MakeTransparent Me.hwnd, intTransparentLevel 'Отрисовка прозрачности
    
    ' [View] FormHeight=150 ; Высота окна (px) [1..1024]
    intFormHeight = INI.GetValueInteger("View", "FormHeight", strFullIniFileName) 'Чтение значения высоты окна из INI
    If ((intFormHeight < 1) Or (intFormHeight > 1024)) Then 'Если прочитали корявое значение, то
        intFormHeight = 150 'Сбрасываем переменную в Default
        INI.SetValue "View", "FormHeight", "150 ; Высота окна (px) [1..1024]", strFullIniFileName 'И записываем Default в файл
    End If
    ' [View] FormWidth=150 ; Ширина окна (px) [1..1024]
    intFormWidth = INI.GetValueInteger("View", "FormWidth", strFullIniFileName) 'Чтение значения ширины окна из INI
    If ((intFormWidth < 1) Or (intFormWidth > 1024)) Then 'Если прочитали корявое значение, то
        intFormWidth = 150 'Сбрасываем переменную в Default
        INI.SetValue "View", "FormWidth", "150 ; Ширина окна (px) [1..1024]", strFullIniFileName 'И записываем Default в файл
    End If
    ' [View] FormX=1 ; X-координата окна [1..1024]
    intFormX = INI.GetValueInteger("View", "FormX", strFullIniFileName) 'Чтение X-координаты окна из INI
    If ((intFormX < 1) Or (intFormX > 1024)) Then 'Если прочитали корявое значение, то
        intFormX = 1 'Сбрасываем переменную в Default
        INI.SetValue "View", "FormX", "0 ; X-координата окна [1..1024]", strFullIniFileName 'И записываем Default в файл
    End If
    ' [View] FormY=1 ; Y-координата окна [1..1024]
    intFormY = INI.GetValueInteger("View", "FormY", strFullIniFileName) 'Чтение Y-координаты окна из INI
    If ((intFormY < 1) Or (intFormY > 1024)) Then 'Если прочитали корявое значение, то
        intFormY = 1 'Сбрасываем переменную в Default
        INI.SetValue "View", "FormY", "0 ; Y-координата окна [1..1024]", strFullIniFileName 'И записываем Default в файл
    End If
    Me.Move intFormX, intFormY, intFormWidth * Screen.TwipsPerPixelX, intFormHeight * Screen.TwipsPerPixelY 'Изменяем положение и размеры окна на экране
    
    ' [View] FormGlueKX=0.01 ; Коэффициент 'прилипания' для X [0,01..0,3]
    intFormGlueKX = Val(INI.GetValueString("View", "FormGlueKX", strFullIniFileName)) 'Чтение коэффициента 'прилипания' для X из INI
    If ((intFormGlueKX < 0.01) Or (intFormGlueKX > 0.3)) Then 'Если прочитали корявое значение, то
        intFormGlueKX = 0.01 'Сбрасываем переменную в Default
        INI.SetValue "View", "FormGlueKX", "0.01 ; Коэффициент 'прилипания' для X [0,01..0,3]", strFullIniFileName 'И записываем Default в файл
    End If
    ' [View] FormGlueKY=0.01 ; Коэффициент "прилипания" для Y [0,01..0,3]
    intFormGlueKY = Val(INI.GetValueString("View", "FormGlueKY", strFullIniFileName)) 'Чтение коэффициента 'прилипания' для Y из INI
    If ((intFormGlueKY < 0.01) Or (intFormGlueKY > 0.3)) Then 'Если прочитали корявое значение, то
        intFormGlueKY = 0.01 'Сбрасываем переменную в Default
        INI.SetValue "View", "FormGlueKY", "0.01 ; Коэффициент 'прилипания' для Y [0,01..0,3]", strFullIniFileName 'И записываем Default в файл
    End If
    Form_Glue 'Принудительное 'прилипание'
    
    
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Перетаскивание мышкой за любое место формы
    Dim ReturnValue As Long
    If Button = 1 Then
        Call ReleaseCapture
        ReturnValue = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
        
        Form_Glue 'Эффект прилипания
    End If
End Sub


Public Sub Form_Glue()
'Эффект прилипания
    '
    '
    '
    '
    '
    '
    '
    '
    If (Me.Left < (Screen.Width * intFormGlueKX)) Then Me.Left = 0
    If (Me.Top < (Screen.Height * intFormGlueKY)) Then Me.Top = 0
    If ((Me.Left + Me.Width) > (Screen.Width * (1 - intFormGlueKX))) Then Me.Left = Screen.Width - Me.Width
    If ((Me.Top + Me.Height) > ((Screen.Height - Windows.GetTaskBarHeight(False)) * (1 - intFormGlueKY))) Then Me.Top = Screen.Height - Windows.GetTaskBarHeight(False) - Me.ScaleHeight
End Sub

Так вот. Она прилипает только когда двигается мышкой за "рабочее поле". А мне надо чтобы это происходило и тогда, когда окно двигается и за заголовок. Вот, собственно проблема. Помогите, плиз, решить.
PM MAIL WWW ICQ   Вверх
neic
Дата 17.5.2009, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: нет
Всего: 7



Код

    Dim intFormX As Integer 'X-координата окна (px)
    Dim intFormY As Integer 'Y-координата окна (px)

    Dim LastX As Single, LastY As Single

Ты уже практически всё сделал =)

Можно пробовать запихнуть в таймер и поставь интервал, допустим 100.

Код будет выглядеть примерно таким:

Код

Private Sub Timer1_Timer()
If LastX <> intFormX then
' тут делаешь проверку прилипать к краю или нет

LastX = intFormX
end if
End Sub


Я так понял что LastX - это последнее значение координаты X на момент последнего перетягивания, а ntFormX - X на данный момент.
PM MAIL WWW ICQ Skype   Вверх
ProgramerForever
Дата 17.5.2009, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Таймером пробовал. Получается некрасивое "дёргнье".
Нужно событие вроде Form_Move, когда форма перемещается по экрану.

Это сообщение отредактировал(а) ProgramerForever - 17.5.2009, 02:42
PM MAIL WWW ICQ   Вверх
ProgramerForever
  Дата 17.5.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 2
Всего: 5



Сделал так:
Код

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As KeyCodeConstants) As Integer

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Перетаскивание мышкой за любое место формы
    Dim ReturnValue As Long
    If Button = 1 Then
        Call ReleaseCapture
        ReturnValue = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
        Form_Glue 'Эффект прилипания
    End If
End Sub


Public Sub Form_Glue()
'Эффект прилипания
    If (Me.Left < (Screen.Width * intFormGlueKX)) Then Me.Left = 0
    If (Me.Top < (Screen.Height * intFormGlueKY)) Then Me.Top = 0
    If ((Me.Left + Me.Width) > (Screen.Width * (1 - intFormGlueKX))) Then Me.Left = Screen.Width - Me.Width
    If ((Me.Top + Me.Height) > ((Screen.Height - Windows.GetTaskBarHeight(False)) * (1 - intFormGlueKY))) Then Me.Top = Screen.Height - Windows.GetTaskBarHeight(False) - Me.ScaleHeight
End Sub

Private Sub Timer1_Timer()
    If (MouseButton <> MButtonDown(1)) Then Form_Glue 'Если отпущена левая кнопка, то вызываем эффект прилипания
    MouseButton = MButtonDown(1)
End Sub

Public Function MButtonDown(btButton As Byte) As Boolean
' Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As KeyCodeConstants) As Integer
'
' Данный пример покажет, нажаты ли клавиши мыши момент загрузки формы.
' Обращение MButtonDown(I) вы можете использовать в любом месте вашей программы,
' где 1 (левая клавиша мыши),
'     2 (правая клавиша мыши) или
'     3 (средняя клавиша мыши)
'
' If MButtonDown(1) Then MsgBox "Левая клавиша нажата!"
' If MButtonDown(2) Then MsgBox "Правая клавиша нажата!"
' If MButtonDown(3) Then MsgBox "Средняя клавиша нажата!"
'
' From http://www.vbnet.ru/faq/showtopic.asp?id=157
'
    Select Case btButton
        Case Is = 1
            MButtonDown = CBool(GetKeyState(vbKeyLButton) And &H8000)
        Case Is = 2
            MButtonDown = CBool(GetKeyState(vbKeyRButton) And &H8000)
        Case Is = 3
            MButtonDown = CBool(GetKeyState(vbKeyMButton) And &H8000)
    End Select
End Function

Всё работает.

Это сообщение отредактировал(а) ProgramerForever - 17.5.2009, 14:21
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.