
Опытный
 
Профиль
Группа: Участник
Сообщений: 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
|
Так вот. Она прилипает только когда двигается мышкой за "рабочее поле". А мне надо чтобы это происходило и тогда, когда окно двигается и за заголовок. Вот, собственно проблема. Помогите, плиз, решить.
|