Показать полную графическую версию : [решено] Отображение формы в нижнем правом углу над панелью задач
как отобразить созданную форму в нижнем правом углу над панелью задач. Как делал я:
1. узнаем ширину раб.стола (макро - @DesktopWidth)
2. узнаем высоту раб.стола (макро - @DesktopHeight)
3. вычитаем из 1-го ширину своей формы (макро нет, можно ли как то узнать программно)
4. вычитаем из 2-го высоту своей формы (макро нет, можно ли как то узнать программно)
3 и 4 по идее нужные координаты формы
ньюансы - по 4 пункту, почти у всех есть панель задач как вычислить ее высоту, чтобы форма была строго над панелью
пробовал вычитать из 4 пункта еще высоту панели задач, определял через AU3Info (получилось 30), все равно ниже вычел еще раз т.е. уже 60 более менее но теперь чуть выше, в чем загвоздка и почему надо вычитать 2 раза высоту панели задач. Кстати Qip например сам пристыковывается к краю панели задач ровно ровно, как такого добиться. И что делать у кого панель задач сбоку или вообще сверху?
#include <GUIConstantsEx.au3>
$hGUI = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("_WinMoveAboveTaskBar Demo", 200, 500)
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_SHOW))
_WinMoveAboveTaskBar($hGUI)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _WinMoveAboveTaskBar($hWin)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aTaskBar_Pos = WinGetPos (http://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm)("[CLASS:Shell_TrayWnd]")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aWin_Pos = WinGetPos (http://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm)($hWin)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aClient_Size = WinGetClientSize (http://www.autoitscript.com/autoit3/docs/functions/WinGetClientSize.htm)($hWin)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iBorder_Width = ($aWin_Pos[2] - $aClient_Size[0])
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iCaption_Height = ($aWin_Pos[3] - $aClient_Size[1])
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iLeft = (@DesktopWidth (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopWidth)-$aClient_Size[0]) - $iBorder_Width
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iTop = (@DesktopHeight (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopHeight)-$aClient_Size[1]-$aTaskBar_Pos[3]) - $iCaption_Height
WinMove (http://www.autoitscript.com/autoit3/docs/functions/WinMove.htm)($hWin, "", $iLeft, $iTop)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
FlatX007
16-09-2009, 17:21
Creat0R »
- А если панель с верху ? или с боку ... :) (Если с права то я вообще окна не нашол)
Я вот себе делал ... если панель не внизу - то окошко создаётся посередине десктопа. :happy:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $aPositionToolBar[3]
Global $aPositionToolBar = ControlGetPos("[CLASS:Shell_TrayWnd]", "", "[CLASS:ToolbarWindow32; INSTANCE:2]")
Switch _PosToolbarWindow()
Case 1
$WIDTH_GUI = 280
$HEIGHT_GUI = 70
$TOP_GUI = @DesktopHeight - $HEIGHT_GUI * 1.35 - $aPositionToolBar[3]
$LEFT_GUI = @DesktopWidth - $WIDTH_GUI - 5
Case 2 To 5
$WIDTH_GUI = 280
$HEIGHT_GUI = 70
$LEFT_GUI = @DesktopWidth / 2 - $WIDTH_GUI / 2
$TOP_GUI = @DesktopHeight / 2 - $HEIGHT_GUI / 2
EndSwitch
GUICreate("", $WIDTH_GUI, $HEIGHT_GUI, $LEFT_GUI, $TOP_GUI, -1, BitOR($WS_EX_APPWINDOW, $WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
GUISetState()
Do
Until GUIGetMsg() = -3
Exit
Func _PosToolbarWindow()
Global $aReturnValue[5]
$aReturnValue[0] = 1
$aReturnValue[1] = 2
$aReturnValue[2] = 3
$aReturnValue[3] = 4
$aReturnValue[4] = 5
Local $vPosToolbarWindow = ControlGetPos( "[CLASS:Shell_TrayWnd]", "", "[CLASS:ReBarWindow32; INSTANCE:1]")
Local $vPosProgramManager = ControlGetPos( "[CLASS:Progman]", "", "[CLASS:SysListView32; INSTANCE:1]")
If $vPosProgramManager[2] = @DesktopWidth And $vPosProgramManager[3] = @DesktopHeight Then
Return $aReturnValue[4]
Else
If $vPosToolbarWindow[1] = 0 Then
If $vPosProgramManager[1] = 0 Then Return $aReturnValue[0]
If $vPosProgramManager[1] > 0 Then Return $aReturnValue[1]
EndIf
If $vPosToolbarWindow[0] = 0 Then
If $vPosProgramManager[0] = 0 Then Return $aReturnValue[2]
If $vPosProgramManager[0] > 0 Then Return $aReturnValue[3]
EndIf
EndIf
EndFunc
А если панель с верху ? или с боку »
То это уже другая задача (читай внимательнее первый пост).
если панель не внизу - то окошко создаётся посередине десктопа »
А можно определить где панель находится, и соответственно пристыковывать GUI к нижнему правому краю:
#include <GUIConstantsEx.au3>
$hGUI = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("_WinMoveAboveTaskBar Demo", 200, 500)
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_SHOW))
_WinStickToRightCorner($hGUI)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _WinStickToRightCorner($hWin)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aWin_Pos = WinGetPos (http://www.autoitscript.com/autoit3/docs/functions/WinGetPos.htm)($hWin)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aClient_Size = WinGetClientSize (http://www.autoitscript.com/autoit3/docs/functions/WinGetClientSize.htm)($hWin)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iBorder_Width = ($aWin_Pos[2] - $aClient_Size[0])
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iCaption_Height = ($aWin_Pos[3] - $aClient_Size[1])
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $SPI_GETWORKAREA = 48
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $stRECT = DllStructCreate (http://www.autoitscript.com/autoit3/docs/functions/DllStructCreate.htm)("long;long;long;long")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $SPIRet = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)("User32.dll", "int", "SystemParametersInfo", _
"uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetPtr.htm)($stRECT), "uint", 0)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $SPIRet[0] = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sRightArea = DllStructGetData (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetData.htm)($stRECT, 3)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sBottomArea = DllStructGetData (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetData.htm)($stRECT, 4)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iTop = (@DesktopHeight (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopHeight)-(@DesktopHeight (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopHeight)-$sBottomArea)-$aClient_Size[1]) - $iCaption_Height
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iLeft = (@DesktopWidth (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopWidth)-$aClient_Size[0]) - $iBorder_Width
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sRightArea < @DesktopWidth (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopWidth) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) $iLeft -= (@DesktopWidth (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopWidth) - $sRightArea)
WinMove (http://www.autoitscript.com/autoit3/docs/functions/WinMove.htm)($hWin, "", $iLeft, $iTop)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Использовал пример из второго сообщения,
Подведу итоги:
Чтобы спозиционировать форму над панелью задач нужно
1. Знать где она, панель задач, находится (справа, слева, сверху или как обычно снизу)
2. Знать размеры панели задач
2. Знать размеры формы
при создании формы $hGUI = GUICreate("_WinMoveAboveTaskBar Demo", 200, 500) указываются размеры только клиентской области, т.е. ширина 200 - это ширина без учета бордюров формы, с ними будет 206
а высота 500 - это высота без учета бордюров и заголовка формы, с ними будет уже 525
соответственно нужные нам координаты будут вычисляться по следующей формуле
X-координата=Ширина раб.стола- размер клиентской области - размер бордюров (видимо размер кл.области+размер бордюров и есть общий размер формы, так что можно вычитать именно его не рассчитывая бордюры)
Y-координата=Высота раб.стола - высота клиентской области формы-высота панели задач - высота бордюра и заголовка формы (то же замечание что и выше плюс к этому можно прибавить еще и бордюр панели задач)
Использовал пример из второго сообщения,
Подведу итоги »
Под эти итоги больше подходит последний пример ;) - Хотя в нём форма создаётся не над панелью задач, а в правом нижнем углу, если там панели задачь нет, то форма всё ровно будет в углу, т.е вычитается размер и положение панели задач.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.