Войти

Показать полную графическую версию : [решено] Как прилепить некое окно GUI к координатам окна другой проги


beve
08-02-2009, 15:53
Имеется код для примера:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form = GUICreate("Какая то программа", 600, 60)
$Button = GUICtrlCreateButton("просто кнопка для примера", 0, 0, 160, 21)
$Form1pos = WinGetPos($Form)

$chForm = GUICreate("Дополнительное окно", 600, 70, $Form1pos[0],$Form1pos[1]+93, _
BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOOLWINDOW, $Form)
GUISetBkColor (0x09FF00)
GUICtrlCreateLabel ("Дочернее окно",5, 5, 185, 25)
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
GUISetState(@SW_SHOW, $Form)

While 1
$msg = GUIGetMsg(1) ;using the "advanced" parameter
Select
Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $Form
ExitLoop
;Следующий Case нужен только если на дочернее окно $chForm не будет установлен стиль $WS_POPUP.
;Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $chForm
;GUISetState(@SW_HIDE, $chForm)
Case $msg[0] = $Button
If Not BitAND(WinGetState($chForm), 2) Then
GUISetState(@SW_SHOW, $chForm)
Else
GUISetState(@SW_HIDE, $chForm)
EndIf
EndSelect
WEnd

Func WM_MOVE($hWndGUI, $MsgID, $WParam, $LParam)
If $hWndGUI = $Form Then
$aParent_Pos = WinGetPos($Form)
WinMove($chForm, "", $aParent_Pos[0], $aParent_Pos[1]+93)
Else
EndIf
EndFunc
Вот в этом примере Дочернее окно Gui прилепляется к Главному окну и при перемещении главного окна, оно перемещается вместе с ним. Вопрос такой, можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги (чтобы вместо Главного окна в примере была моя прога, любое окно, ну хоть блокнот, например), ибо у меня выходит так, что при запуске, если сделать похожее по координатам окна, Дочернее окно прилепляется, но при перемещении окна Моей проги, не двигается вслед за ним.

Creat0R
08-02-2009, 22:36
можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги »
Можно, примерно так:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
;

$hParentWnd = GUICreate("Какая то программа", 600, 60)
;$Button = GUICtrlCreateButton("просто кнопка для примера", 0, 0, 160, 21)

;Следуюзая строка может быть раскомментирована, в этом случае активное окно будет родительским окном
;$hParentWnd = WinGetHandle("[ACTIVE]")

$aParent_Pos = WinGetPos($hParentWnd)

$hChildWnd = GUICreate("Дополнительное окно", 600, 70, $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] + 10, _
BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOOLWINDOW, $hParentWnd)

GUISetBkColor(0x09FF00)
GUICtrlCreateLabel("Дочернее окно", 5, 5, 185, 25)

GUISetState(@SW_SHOW, $hParentWnd)
GUISetState(@SW_SHOW, $hChildWnd)

$iTimer_ID = _Timer_SetTimer($hChildWnd, 10, "_WinMove_Proc")

While 1
$aMsg = GUIGetMsg(1) ;using the "advanced" parameter

Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
If $aMsg[1] = $hParentWnd Then ExitLoop
;Case $GUI_EVENT_CLOSE ;Этот Case нужен только если на дочернее окно $chForm не будет установлен стиль $WS_POPUP.
;If $aMsg[1] = $hChildWnd Then GUISetState(@SW_HIDE, $hChildWnd)
;Case $Button
;If Not BitAND(WinGetState($hChildWnd), 2) Then
;GUISetState(@SW_SHOW, $hChildWnd)
;Else
;GUISetState(@SW_HIDE, $hChildWnd)
;EndIf
EndSwitch
WEnd

_Timer_KillTimer($hChildWnd, $iTimer_ID)

Func _WinMove_Proc($hWnd, $nMsg, $iIDTimer, $dwTime)
Local $aParent_Pos = WinGetPos($hParentWnd)
Local $aChild_Pos = WinGetPos($hWnd)

If $aParent_Pos[0] <> $aChild_Pos[0] Or $aParent_Pos[1] <> ($aChild_Pos[1] - $aParent_Pos[3] - 10) Then _
WinMove($hWnd, "", $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] + 10, $aParent_Pos[2])
EndFunc

beve
09-02-2009, 01:30
---Спасибо,почти то что нужно, классно придумано, насчет, изменения ширины Дочернего окна под ширину окна нужной мне проги. Но возникли некоторые трудности, помоги решить. При запуске скрипта (а в моем случае я переделал, чтобы скрипт, приклеивался не снизу, а чуть ниже от верха и был поверх этого самого окна) - Дочернее окно прилепляется к любому окну которое активно в этот самый час и которое я двигаю мышкой, будь то блокнот - оно с блокнотом двигается, я схватил мышкой SciTe - двигается вместе с SciTe!, а мне нужно что бы Дочернее окно двигалось только вместе с моим окном, например с Блокнотом в нижеописанном скрипте, и при свертывании в трей Блокнота, Дочернее окно тоже свертывалось вместе с ним.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>

$hParentWnd=Wingetpos("Безымянный - Notepad2")

$aParent_Pos = WinGetPos($hParentWnd)

$hChildWnd = GUICreate("Дополнительное окно", 600, 70, $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, _
BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOPMOST, $hParentWnd)

GUISetBkColor(0x09FF00)
GUICtrlCreateLabel("Дочернее окно", 5, 5, 185, 25)

GUISetState(@SW_SHOW, $hParentWnd)
GUISetState(@SW_SHOW, $hChildWnd)

$iTimer_ID = _Timer_SetTimer($hChildWnd, 10, "_WinMove_Proc")

While 1
$aMsg = GUIGetMsg(1) ;using the "advanced" parameter

Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
If $aMsg[1] = $hParentWnd Then ExitLoop
EndSwitch
WEnd

_Timer_KillTimer($hChildWnd, $iTimer_ID)

Func _WinMove_Proc($hWnd, $nMsg, $iIDTimer, $dwTime)
Local $aParent_Pos = WinGetPos($hParentWnd)
Local $aChild_Pos = WinGetPos($hWnd)

If $aParent_Pos[0] <> $aChild_Pos[0] Or $aParent_Pos[1] <> ($aChild_Pos[1] - $aParent_Pos[3] - 10) Then _
WinMove($hWnd, "", $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, $aParent_Pos[2])
EndFunc
Для работы этого примерочного кода, notepad2 должен быть запущен...ну или другую прогу там можно прописать.

Creat0R
09-02-2009, 02:13
beve,
Дочернее окно прилепляется к любому окну которое активно в этот самый час и которое я двигаю мышкой
Ну и правильно, ведь первая строчка почему то пытается получить позицию окна, а не хендл :) - там возвращается массив, а для Win* функции это тоже самое что и пустая строка (""), т.е текущее (активное) окно. Нужно использовать WinGetHandle...

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
;

Run("Notepad.exe")
WinWait("[REGEXPCLASS:Notepad.*]")

$hParentWnd = WinGetHandle("[REGEXPCLASS:Notepad.*]")
$aParent_Pos = WinGetPos($hParentWnd)

$hChildWnd = GUICreate("Дополнительное окно", 600, 70, $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, _
BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOPMOST, $hParentWnd)

GUISetBkColor(0x09FF00)
GUICtrlCreateLabel("Дочернее окно", 5, 5, 185, 25)

$iTimer_ID = _Timer_SetTimer($hChildWnd, 10, "_WinMove_Proc")

GUISetState(@SW_SHOW, $hChildWnd)

While 1
Sleep(100)
WEnd

Func _WinMove_Proc($hWnd, $nMsg, $iIDTimer, $dwTime)
If Not WinExists($hParentWnd) Then Exit _Timer_KillTimer($hChildWnd, $iTimer_ID)

Local $aParent_Pos = WinGetPos($hParentWnd)
If @error Then Return

Local $aChild_Pos = WinGetPos($hWnd)
If @error Then Return

If WinGetHandle("[Active]") <> $hParentWnd Then
WinSetOnTop($hChildWnd, "", 0)
Else
WinSetOnTop($hChildWnd, "", 1)
EndIf

If $aParent_Pos[0] <> $aChild_Pos[0] Or $aParent_Pos[1] <> ($aChild_Pos[1] - $aParent_Pos[3] - 10) Then _
WinMove($hWnd, "", $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, $aParent_Pos[2])
EndFunc

beve
09-02-2009, 13:41
Супер, именно то что нужно! Спасибо за ответ, и за разъяснение. :yahoo:




© OSzone.net 2001-2012