Автор Тема: "Склеиваем" два окна при перемещении  (Прочитано 3227 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Данный пример показывает, как можно "приклеить" одно окно к другому при перемещении одного из них. Код писался на Windows XP, для Windows Vista/7 его нужно немного "откалибровать"...

Код: AutoIt [Выделить]
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

$hOpt = 0

$hForm = GUICreate('MyGUI', 400, 400, 600, 100, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
$Button = GUICtrlCreateButton('Options', 165, 366, 70, 23)
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUISetState()

While 1
    $Msg = GUIGetMsg(1)
    Switch $Msg[0]
        Case -3
            Switch $Msg[1]
                Case $hForm
                    Exit
                Case $hOpt
                    GUICtrlSetState($Button, $GUI_ENABLE)
                    GUIDelete($hOpt)
                    $hOpt = 0
            EndSwitch
        Case $Button
            If Not $hOpt Then
                $Pos = WinGetPos($hForm)
                $hOpt = GUICreate('Options', 400, 100, $Pos[0], $Pos[1] + 436, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
                GUISetState(@SW_SHOWNOACTIVATE, $hOpt)
                GUICtrlSetState($Button, $GUI_DISABLE)
            EndIf
    EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFFF)
        Case 1, 2
            Switch $hWnd
                Case 0

                Case $hForm
                    If $hOpt Then
                        WinSetOnTop($hOpt, '', 1)
                        WinSetOnTop($hOpt, '', 0)
                    EndIf
                Case $hOpt
                    WinSetOnTop($hForm, '', 1)
                    WinSetOnTop($hForm, '', 0)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_ACTIVATE

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    $X = BitAND($lParam, 0xFFFF)
    If $X > 0x7FFF Then
        $X -= 0x10000
    EndIf
    $Y = BitShift($lParam, 16)
    If $Y > 0x7FFF Then
        $Y -= 0x10000
    EndIf
    Switch $hWnd
        Case 0

        Case $hForm
            If $hOpt Then
                WinMove($hOpt, '', $X - 3, $Y + 407)
            EndIf
        Case $hOpt
            WinMove($hForm, '', $X - 3, $Y - 465)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE



Думай, прежде чем говорить.

Русское сообщество AutoIt

"Склеиваем" два окна при перемещении
« Отправлен: Июль 15, 2010, 02:07:42 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: "Склеиваем" два окна при перемещении
« Ответ #1, Отправлен: Июль 30, 2010, 19:32:45 »
А для чего все эти проверки с «If $X > 0x7FFF Then»?

Вот так вроде тоже самое:

Код: AutoIt [Выделить]
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

Global $hOpt = 0

$hForm = GUICreate('MyGUI', 400, 400, 600, 100, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
$Button = GUICtrlCreateButton('Options', 165, 366, 70, 23)
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUISetState()

While 1
    $Msg = GUIGetMsg(1)
    Switch $Msg[0]
        Case -3
            Switch $Msg[1]
                Case $hForm
                    Exit
                Case $hOpt
                    GUICtrlSetState($Button, $GUI_ENABLE)
                    GUIDelete($hOpt)
            EndSwitch
        Case $Button
            If BitAND(WinGetState($hOpt), 2) <> 2 Then
                $Pos = WinGetPos($hForm)
                $hOpt = GUICreate('Options', $Pos[2], 100, $Pos[0], $Pos[1] + $Pos[3] + 7, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
                GUISetState(@SW_SHOWNOACTIVATE, $hOpt)
                GUICtrlSetState($Button, $GUI_DISABLE)
            EndIf
    EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFFF)
        Case 1, 2
            Switch $hWnd
                Case $hForm
                    If BitAND(WinGetState($hOpt), 2) = 2 Then
                        WinSetOnTop($hOpt, '', 1)
                        WinSetOnTop($hOpt, '', 0)
                    EndIf
                Case $hOpt
                    WinSetOnTop($hForm, '', 1)
                    WinSetOnTop($hForm, '', 0)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Func WM_MOVE($hWndGUI)
    Local $aParentPos = WinGetPos($hForm), $aChildPos = WinGetPos($hOpt)
   
    If $hWndGUI = $hForm Then
        WinMove($hOpt, "", $aParentPos[0], $aParentPos[1] + $aParentPos[3] + 7)
    ElseIf $hWndGUI = $hOpt Then
        WinMove($hForm, "", $aChildPos[0], $aChildPos[1] - $aParentPos[3] - 7)
    EndIf
EndFunc



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: "Склеиваем" два окна при перемещении
« Ответ #1 Отправлен: Июль 30, 2010, 19:32:45 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
12725 Просмотров
Последний ответ Октябрь 07, 2009, 09:36:42
от akoulev
12 Ответов
12615 Просмотров
Последний ответ Декабрь 01, 2012, 02:05:11
от defens
14 Ответов
12856 Просмотров
Последний ответ Февраль 13, 2010, 22:44:00
от akoulev
0 Ответов
2780 Просмотров
Последний ответ Январь 21, 2010, 14:07:13
от CreatoR
10 Ответов
7280 Просмотров
Последний ответ Апрель 28, 2010, 12:45:00
от Kaster
4 Ответов
3972 Просмотров
Последний ответ Ноябрь 23, 2010, 00:54:34
от drd0s
2 Ответов
2890 Просмотров
Последний ответ Июнь 06, 2011, 17:53:20
от VladUs
4 Ответов
4672 Просмотров
Последний ответ Сентябрь 22, 2011, 19:44:25
от agikon
3 Ответов
1550 Просмотров
Последний ответ Ноябрь 27, 2013, 02:42:50
от joiner
3 Ответов
945 Просмотров
Последний ответ Сентябрь 29, 2016, 20:36:20
от mmsgeorge