Что нового

Как прижать окно созданное функцией MsgBox к углу экрана?

Статус
Закрыто для дальнейших ответов.

dr.room

Новичок
Сообщения
283
Репутация
0
В левый нижний или правый нижний угол.
 

mmsgeorge

Новичок
Сообщения
96
Репутация
0
dr.room
тебе именно msgbox нужно или чтобы просто выводилась информация?
 
A

Alofa

Гость
Вы можете конечно это устроить при помощи "WinMove()", но будет выглядеть неприглядно.
ИМХО лучше создать свое GUI, в нужном месте экрана.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Что касается размещений окон с учетом Aero и прочих эффектов, то вот функция, которая это все решает.
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Alofa
Alofa сказал(а):
при помощи...WinMove

Не получается почему-то :(

Код:
MsgBox(262144, "Сообщение" ,"После правки - отжать кнопку Ок")
Sleep(400)
; Перемещает и изменяет размер окна блокнота
WinMove("Сообщение", "" ,  200,200)


mmsgeorge
mmsgeorge сказал(а):
dr.room
тебе именно msgbox нужно или чтобы просто выводилась информация?
Без особой разницы - главное чтобы с кнопкой ок и чтобы после её отжатия скрипт продолжил работу в нормальном потоке. Именно поэтому и была выбрана функция msgbox, как наиболее подходящая.


Добавлено:
Сообщение автоматически объединено:

Yashied
Спасибо, но боюсь не смогу самостоятельно в Вашей функции разобраться. Не силён в функциях пока что
 
A

Alofa

Гость
dr.room сказал(а):
... Не получается почему-то ...
И не старайтесь. Прошу прощения (как не горько в этом сознаваться) ввел вас в заблуждение. Совсем вылетело из головы, что "MsgBox()" является блокирующей функцией, т.е. на ней скрипт останавливается до тех пор, пока окно не будет закрыто.

Вот, как вариант:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISys.au3>

_My_MsgBox()

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

	$hGui = GUICreate("Мое Окно", $iWidth, $iHeight, -1, -1, $DS_SETFOREGROUND)

	$aClientSize = WinGetClientSize($hGui)
	$tRECT = _WinAPI_GetWorkArea()

;~ 	$iLeft = 0 ; Прижимаем к левому нижнему углу
	$iLeft = DllStructGetData($tRECT, 'Right') - $iWidth ;	Прижимаем к правому нижнему углу
	$iTop = DllStructGetData($tRECT, 'Bottom') - $iHeight

	WinMove($hGui, '', $iLeft, $iTop)
	GUICtrlCreateLabel("Это мое суперское окно", 0, 0, $aClientSize[0], $aClientSize[1] - 46, BitOR($SS_CENTERIMAGE, $SS_CENTER))
	GUICtrlSetBkColor(-1, 0xFFFFFF)
	$Button = GUICtrlCreateButton("Ok", $iWidth / 2 - $iWidthBatt / 2, $aClientSize[1] - 46 + ((46 - $iHeightBatt) / 2), $iWidthBatt, $iHeightBatt)
	GUISetState()

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ContinueCase
			Case $Button
				MsgBox(64, 'Инфо', 'Продолжаем работу скрипта!')
				Return 1
		EndSwitch
	WEnd
EndFunc   ;==>_My_MsgBox
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Alofa сказал(а):
ввел вас в заблуждение.
Да мне решение важно :smile: Спасибо
Позвольте уточнить. Я обратил внимание что Вы используете двойное подтверждение. (круто, кстати - надо признать, возьму на вооружение) Но такой уровень надежности не требуется - во всяком случае пока...
Достаточно ли будет просто закоментировать строчку чтобы исключить второе окно ?
Код:
;~                 MsgBox(64, 'Инфо', 'Продолжаем работу скрипта!')
 
A

Alofa

Гость
dr.room сказал(а):
...Вы используете двойное подтверждение...
Честно - не понял о чем это?

dr.room сказал(а):
...Достаточно ли будет просто закоментировать строчку чтобы исключить второе окно ?
Код:
MsgBox(64, 'Инфо', 'Продолжаем работу скрипта!') ; Это просто ДЕМОНСТРАЦИЯ того, что при нажатии "Ok" функция вообще реагирует на эту кнопку. 
Return 1 ; к стати, возвращаемое значение этой пользовательской функции "_My_MsgBox()" соответствует ID одноименной кнопки штатной "MsgBox()"
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
А как можно реализовать чтобы фокус был на кнопке ОК чтобы первое окно как и второе, реагировало на нажатие Enter
И еще - я понял уже что с коде предусмотрена проверка на нажатие. Спасибо
А можно - не проводить такой проверки т.е. используя только 1 окно
- с фокусом на кнопке ОК
- с положением прижатым к углу
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
И ещё вариант:

Код:
#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
 
A

Alofa

Гость
dr.room сказал(а):
... я только не понял как изменить положение окна сообщения: в нижний левый или правый угол
[list type=decimal]
[*]Этот скрипт работает только в версиях Autoit до 3.3.10.2, включительно.
[*]
Код:
$iLeft = 50 ; Координата левого края окна
$iTop = 50 ; Координата верхнего края окна

_MsgBoxEx(64, 'MsgBoxEx', 'Test', 0, 0, $iLeft, $iTop)
[/list]
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Alofa сказал(а):
Вот, как вариант:
А как в Вашем варианте сделать у окна GUICtrlCreateLabel , так, чтобы
- текст мог переносится на новую строку, при необходимости (очень нужно)
- окно при этом автоматически увеличивалось если текст выходит за его пределы (хотя его размеры легко в ручную меняются...)
 
A

Alofa

Гость
dr.room сказал(а):
- текст мог переносится на новую строку
Вот вам ссылка на стили "GUICtrlCreateLabel".
Читайте справку пожалуйста и не бойтесь экспериментировать.

dr.room сказал(а):
(хотя его размеры легко в ручную меняются...)
Вы сейчас имеете дело с ЯП изначально предназначенным для автоматизации подобных операций.
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
У меня проблема
Как я только что прочитал
Код:
$SS_CENTER

Позволяет:
Код:
Выравнивание текста по центру по горизонтали. Если текст не помещается по ширине, то автоматически переносится на следующую строку к центру.
Но -этого не происходит :-\
Текст идет одно строкой а переноса нет - в результате
 
A

Alofa

Гость
dr.room сказал(а):
Текст идет одно строкой а переноса нет
А что если быть хитрее и почитать про стиль "$SS_CENTERIMAGE", который суммируется со стилем "$SS_CENTER" в скрипте?


Добавлено:
Сообщение автоматически объединено:

А вообще этот скрипт - только набросок, который придется доводить до ума вам.
 

mmsgeorge

Новичок
Сообщения
96
Репутация
0
dr.room
не знаю подойдет ли вот это $BS_MULTILINE возможно распространяется только на кнопки
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Тут еще 1 нюанс: если в коде продублировать функцию то окна не закроются пока обе функции не отработают! Т.е. будет открыто 2 окна GUICtrlCreateLabel друг над другом!
Как можно разделить эти функции чтобы они не ждали друг друга а работали автономно и не зависимо.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinAPISys.au3>

_My_MsgBox()

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

    $hGui = GUICreate("Мое Окно", $iWidth, $iHeight, -1, -1, $DS_SETFOREGROUND)

    $aClientSize = WinGetClientSize($hGui)
    $tRECT = _WinAPI_GetWorkArea()

;~  $iLeft = 0 ; Прижимаем к левому нижнему углу
    $iLeft = DllStructGetData($tRECT, 'Right') - $iWidth ;  Прижимаем к правому нижнему углу
    $iTop = DllStructGetData($tRECT, 'Bottom') - $iHeight

    WinMove($hGui, '', $iLeft, $iTop)
    GUICtrlCreateLabel("Это мое суперское окно", 0, 0, $aClientSize[0], $aClientSize[1] - 46, BitOR($SS_CENTERIMAGE, $SS_CENTER))
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $Button = GUICtrlCreateButton("Ok", $iWidth / 2 - $iWidthBatt / 2, $aClientSize[1] - 46 + ((46 - $iHeightBatt) / 2), $iWidthBatt, $iHeightBatt)
    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ContinueCase
            Case $Button
                MsgBox(64, 'Инфо', 'Продолжаем работу скрипта!')
                Return 1
        EndSwitch
    WEnd
EndFunc   ;==>_My_MsgBox


_My_MsgBox1()

Func _My_MsgBox1()
    Local $iWidth = 300 ; Ширина окна
    Local $iHeight = 150 ; Высота окна
    Local $iWidthBatt = 88 ; Ширина кнопки
    Local $iHeightBatt = 26 ; Высота кнопки

    $hGui = GUICreate("Мое Окно", $iWidth, $iHeight, -1, -1, $DS_SETFOREGROUND)

    $aClientSize = WinGetClientSize($hGui)
    $tRECT = _WinAPI_GetWorkArea()

;~  $iLeft = 0 ; Прижимаем к левому нижнему углу
    $iLeft = DllStructGetData($tRECT, 'Right') - $iWidth ;  Прижимаем к правому нижнему углу
    $iTop = DllStructGetData($tRECT, 'Bottom') - $iHeight

    WinMove($hGui, '', $iLeft, $iTop)
    GUICtrlCreateLabel("Это мое суперское окно", 0, 0, $aClientSize[0], $aClientSize[1] - 46, BitOR($SS_CENTERIMAGE, $SS_CENTER))
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $Button = GUICtrlCreateButton("Ok", $iWidth / 2 - $iWidthBatt / 2, $aClientSize[1] - 46 + ((46 - $iHeightBatt) / 2), $iWidthBatt, $iHeightBatt)
    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ContinueCase
            Case $Button
                MsgBox(64, 'Инфо', 'Продолжаем работу скрипта!')
                Return 1
        EndSwitch
    WEnd
EndFunc   ;==>_My_MsgBox
 
Статус
Закрыто для дальнейших ответов.
Верх