Что нового

GUI умеющее рассчитывать расстояние

dr.room

Новичок
Сообщения
275
Репутация
0
Версия AutoIt: 3.
AutoIt Version: 3.3.14.3
Описание:
Всем привет
Ищу GUI чье поведение аналогично сообщению почтовой программы или антивируса
Другими словами:
[list type=decimal]
[*]Умеющего автоматически рассчитывать размер любого экрана ПК
[*]Учитывать размер Панели задач, автоматически
[*]Находить нижний угол справа/внизу и прижиматься к нему, атоматически
[/list]

Примечания:
В самом GUI поле GUICtrlCreateEdit (как вариант) - чтобы можно получить и вывести через переменную информацию

Спасибо большое
 

Вложения

  • Avira.png
    Avira.png
    18.8 КБ · Просмотры: 13
  • 1. png.jpg
    1. png.jpg
    5.7 КБ · Просмотры: 10
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
Да, было. Но тема закрыта и мне нужны дополнительная информация, очень
У вас Alofa, было решение с Msgbox позволяющее задавать вручную координаты по его расположению относительно x y . Пользуясь случаем хочу уточнить: а без ручного ввода данных, чтобы автоматически рассчитывалсь координаты с учетом условий выше описанных, можно реализовать? Мне нужно быть не привязанным только к одному размеру экрана.


Вот классное решение с Msgbox от CreatoR но почему в углу сверху/слева. у CreatoR панель задач сверху? Если да - то у меня как у многих снизу...
Код:
#Include <WinAPI.au3>

_MsgBoxEx(64, 'MsgBoxEx', 'Test', 0, 0, 50, 50)

Func _MsgBoxEx($iFlag, $sTitle, $sText, $iTimeout = 0, $hWnd = 0, $iLeft = -1, $iTop = -1)
    Assign('MsgBoxEx:Left', $iLeft, 2)
    Assign('MsgBoxEx:Top', $iTop, 2)
   
    Local $CBT_ProcCB = DllCallbackRegister('MsgBoxEx_CBT_Proc', 'long', 'int;hwnd;lparam')
    Local $CBT_Hook = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($CBT_ProcCB), 0, _WinAPI_GetCurrentThreadId())
    Local $Ret = MsgBox($iFlag, $sTitle, $sText, $iTimeout, $hWnd)
    Local $Error = @Error
   
    _WinAPI_UnhookWindowsHookEx($CBT_Hook)
    DllCallbackFree($CBT_ProcCB)
   
    Assign('MsgBoxEx:Left', 0, 2)
    Assign('MsgBoxEx:Top', 0, 2)
   
    Return SetError($Error, 0, $Ret)
EndFunc

Func MsgBoxEx_CBT_Proc($nCode, $wParam, $lParam)
    If $nCode = 5 Then ; HCBT_ACTIVATE
        Local $iLeft = Eval('MsgBoxEx:Left')
        Local $iTop = Eval('MsgBoxEx:Top')
       
        If $iLeft <> -1 Or $iTop <> -1 Then
            Local $aMBPos = WinGetPos($wParam)
           
            If $iLeft = -1 Then
                $iLeft = (@DesktopWidth / 2) - ($aMBPos[2] / 2)
            EndIf
           
            If $iTop = -1 Then
                $iTop = (@DesktopHeight / 2) - ($aMBPos[3] / 2)
            EndIf
           
            WinMove($wParam, '', $iLeft, $iTop)
        EndIf
    EndIf
   
    Return _WinAPI_CallNextHookEx(0, $nCode, $wParam, $lParam)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,409
Репутация
597
dr.room [?]
Пользуясь случаем хочу уточнить: а без ручного ввода данных, чтобы автоматически рассчитывалсь координаты с учетом условий выше описанных, можно реализовать? Мне нужно быть не привязанным только к одному размеру экрана.
в примере Alofa и так автоматически расчитывается
Код:
_WinAPI_GetWorkArea()

то есть получаются координаты рабочей области экрана
только в примере можно без перемещения окна, а создавать сразу по координатам

Код:
Func _My_MsgBox()
	Local $iWidth = 300 ; Ширина окна
	Local $iHeight = 150 ; Высота окна
	Local $iWidthBatt = 88 ; Ширина кнопки
	Local $iHeightBatt = 26 ; Высота кнопки
	Local $tRECT = _WinAPI_GetWorkArea()

	Local $iLeft = DllStructGetData($tRECT, 'Right') - $iWidth
	Local $iTop = DllStructGetData($tRECT, 'Bottom') - $iHeight
	Local $hGui = GUICreate("Мое Окно", $iWidth, $iHeight, $iLeft, $iTop, $DS_SETFOREGROUND)

	Local $aClientSize = WinGetClientSize($hGui)
	GUICtrlCreateLabel("Это мое суперское окно!", 0, 0, $aClientSize[0], $aClientSize[1] - 46)
	GUICtrlSetBkColor(-1, 0xFFFFFF)
	Local $Button = GUICtrlCreateButton("Ok", $iWidth / 2 - $iWidthBatt / 2, $aClientSize[1] - 46 + ((46 - $iHeightBatt) / 2), $iWidthBatt, $iHeightBatt)
	GUISetState()

	While 1
		Switch GUIGetMsg()
			Case $Button
				GUIDelete($hGui)
				Return 1
		EndSwitch
	WEnd
EndFunc   ;==>_My_MsgBox
 
A

Alofa

Гость
joiner сказал(а):
... только в примере можно без перемещения окна...
Не всегда координаты полученные от Win... и API... функций стыкуются с координатами GUI, видимо из за оформления окна, поэтому WinMove().
 

joiner

Модератор
Локальный модератор
Сообщения
3,409
Репутация
597
для данного окна выясняется разность и она будет постоянной. её можно использовать как постоянную величину. все остальное вычислять исходя из размеров рабочего области
 
Автор
D

dr.room

Новичок
Сообщения
275
Репутация
0
Спасибо большое, joiner !!

Я только не знаю какие #Include использовать
С теми что привожу ниже -все заработало !
Код:
#Include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISys.au3>


ps
Поэкспериментирую немного ...
 
Верх