Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Отображение формы в нижнем правом углу над панелью задач (http://forum.oszone.net/showthread.php?t=150674)

malev 16-09-2009 14:41 1220222

Отображение формы в нижнем правом углу над панелью задач
 
как отобразить созданную форму в нижнем правом углу над панелью задач. Как делал я:
1. узнаем ширину раб.стола (макро - @DesktopWidth)
2. узнаем высоту раб.стола (макро - @DesktopHeight)
3. вычитаем из 1-го ширину своей формы (макро нет, можно ли как то узнать программно)
4. вычитаем из 2-го высоту своей формы (макро нет, можно ли как то узнать программно)
3 и 4 по идее нужные координаты формы
ньюансы - по 4 пункту, почти у всех есть панель задач как вычислить ее высоту, чтобы форма была строго над панелью
пробовал вычитать из 4 пункта еще высоту панели задач, определял через AU3Info (получилось 30), все равно ниже вычел еще раз т.е. уже 60 более менее но теперь чуть выше, в чем загвоздка и почему надо вычитать 2 раза высоту панели задач. Кстати Qip например сам пристыковывается к краю панели задач ровно ровно, как такого добиться. И что делать у кого панель задач сбоку или вообще сверху?

Creat0R 16-09-2009 15:21 1220246

Код:

#include <GUIConstantsEx.au3>

$hGUI = GUICreate("_WinMoveAboveTaskBar Demo", 200, 500)
GUISetState(@SW_SHOW)

_WinMoveAboveTaskBar($hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _WinMoveAboveTaskBar($hWin)
    Local $aTaskBar_Pos = WinGetPos("[CLASS:Shell_TrayWnd]")

    Local $aWin_Pos = WinGetPos($hWin)
    Local $aClient_Size = WinGetClientSize($hWin)

    Local $iBorder_Width = ($aWin_Pos[2] - $aClient_Size[0])
    Local $iCaption_Height = ($aWin_Pos[3] - $aClient_Size[1])

    Local $iLeft = (@DesktopWidth-$aClient_Size[0]) - $iBorder_Width
    Local $iTop = (@DesktopHeight-$aClient_Size[1]-$aTaskBar_Pos[3]) - $iCaption_Height

    WinMove($hWin, "", $iLeft, $iTop)
EndFunc


FlatX007 16-09-2009 17:21 1220378

Цитата:

Цитата Creat0R
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


Creat0R 16-09-2009 21:35 1220565

Цитата:

Цитата FlatX007
А если панель с верху ? или с боку »

То это уже другая задача (читай внимательнее первый пост).

Creat0R 16-09-2009 22:21 1220602

Цитата:

Цитата FlatX007
если панель не внизу - то окошко создаётся посередине десктопа »

А можно определить где панель находится, и соответственно пристыковывать GUI к нижнему правому краю:

Код:

#include <GUIConstantsEx.au3>

$hGUI = GUICreate("_WinMoveAboveTaskBar Demo", 200, 500)
GUISetState(@SW_SHOW)

_WinStickToRightCorner($hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _WinStickToRightCorner($hWin)
    Local $aWin_Pos = WinGetPos($hWin)
    Local $aClient_Size = WinGetClientSize($hWin)

    Local $iBorder_Width = ($aWin_Pos[2] - $aClient_Size[0])
    Local $iCaption_Height = ($aWin_Pos[3] - $aClient_Size[1])

    Local Const $SPI_GETWORKAREA = 48
    Local $stRECT = DllStructCreate("long;long;long;long")
    Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", _
        "uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
    If @error Or $SPIRet[0] = 0 Then Return SetError(1, 0, 0)

    Local $sRightArea = DllStructGetData($stRECT, 3)
    Local $sBottomArea = DllStructGetData($stRECT, 4)

    Local $iTop = (@DesktopHeight-(@DesktopHeight-$sBottomArea)-$aClient_Size[1]) - $iCaption_Height
    Local $iLeft = (@DesktopWidth-$aClient_Size[0]) - $iBorder_Width

    If $sRightArea < @DesktopWidth Then $iLeft -= (@DesktopWidth - $sRightArea)

    WinMove($hWin, "", $iLeft, $iTop)
EndFunc


malev 17-09-2009 13:41 1221000

Использовал пример из второго сообщения,
Подведу итоги:
Чтобы спозиционировать форму над панелью задач нужно
1. Знать где она, панель задач, находится (справа, слева, сверху или как обычно снизу)
2. Знать размеры панели задач
2. Знать размеры формы
  • при создании формы $hGUI = GUICreate("_WinMoveAboveTaskBar Demo", 200, 500) указываются размеры только клиентской области, т.е. ширина 200 - это ширина без учета бордюров формы, с ними будет 206
  • а высота 500 - это высота без учета бордюров и заголовка формы, с ними будет уже 525
соответственно нужные нам координаты будут вычисляться по следующей формуле
X-координата=Ширина раб.стола- размер клиентской области - размер бордюров (видимо размер кл.области+размер бордюров и есть общий размер формы, так что можно вычитать именно его не рассчитывая бордюры)
Y-координата=Высота раб.стола - высота клиентской области формы-высота панели задач - высота бордюра и заголовка формы (то же замечание что и выше плюс к этому можно прибавить еще и бордюр панели задач)

Creat0R 17-09-2009 15:20 1221067

Цитата:

Цитата malev
Использовал пример из второго сообщения,
Подведу итоги »

Под эти итоги больше подходит последний пример ;) - Хотя в нём форма создаётся не над панелью задач, а в правом нижнем углу, если там панели задачь нет, то форма всё ровно будет в углу, т.е вычитается размер и положение панели задач.


Время: 03:49.

Время: 03:49.
© OSzone.net 2001-