Что нового

Элементы GUI [Решено] Переключение фокуса между элементами GUI по нажатию Tab

vivernet

Знающий
Сообщения
32
Репутация
5
Весь форум перерыл, пробовал все что только можно, но никак не выходит понять, почему у меня не работает переключение фокуса, между элементами GUI по нажатию Tab.
Однако, так как пробовал прям вот все, нашел один вариант при котором работает, но появляется одна проблема, дочернее окно можно двигать внутри родительского окна, просто тыкнув на любое место дочернего окна и передвинув. Добился этого я, прописав при создании дочернего окна:
Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD, $WS_TABSTOP, $hGUI)

PS: если указать $WS_TABSTOP в любом другом месте, то не работает переключение фокуса от слова совсем(((
подскажите пожалуйста, как сделать что бы корректно работало, то есть и переключение фокуса работало, но дочерние окна не таскались куда угодно.
- искал как вариант какой нить флаг что бы закрепить дочернее окно внутри родительского, к сожалению ничего такого не нашел(

вот так создаю формы GUI и Элементы управления

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <UpDownConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#Include <GuiButton.au3>
#include <GuiStatusBar.au3>
#include <GuiTab.au3>

Func _CreateGUI()
    Local $LastPosX = IniRead($g_ConfigFile, "GUI", "LastPosX", -1)
    Local $LastPosY = IniRead($g_ConfigFile, "GUI", "LastPosY", -1)

    If $LastPosX >= 0 Then
        Global $hGUI = GUICreate($g_App_Name, 500, 600, $LastPosX, $LastPosY, -1, -1)
    Else
        Global $hGUI = GUICreate($g_App_Name, 500, 600, -1, -1, -1, -1)
    EndIf

    GUISwitch($hGUI)

    GUISetFont(9, 400, 0, "Segoe UI", $hGUI, $CLEARTYPE_QUALITY)

    Global $hGUI_StatusBar = _GUICtrlStatusBar_Create($hGUI, -1, "", -1, -1)
    _GUICtrlStatusBar_SetMinHeight($hGUI_StatusBar, 20)

    Global $hGUI_Label_Version = GUICtrlCreateLabel("v." & $g_App_Version, 10, 555, 40, 20, $SS_CENTERIMAGE, -1)
    GUICtrlSetFont(-1, 9, 400, 0, "Segoe UI")

    Global $hGUI_Label_Update = GUICtrlCreateLabel(_Tr("Доступна новая версия!", "New version is available!"), 55, 555, 150, 20, $SS_CENTERIMAGE, -1)
    GUICtrlSetColor($hGUI_Label_Update, $g_Color_RED)
    GUICtrlSetFont(-1, 9, 700, 0, "Segoe UI")
    GUICtrlSetState(-1, $GUI_HIDE)

    Global $hGui_Button_Update = GUICtrlCreateButton(_Tr("Обновить", "Update"), 210, 555, 80, 20, -1, -1)
    GUICtrlSetBKColor(-1, $g_Color_RED)
    GUICtrlSetFont(-1, 8, 700, 0, "Segoe UI")
    GUICtrlSetColor(-1, $g_Color_WHITE)
    GUICtrlSetCursor(-1, 0)
    GUICtrlSetState(-1, $GUI_HIDE)

    GUISetState(@SW_HIDE, $hGUI)
EndFunc


Func _CreateGUI_Logo()
    Global $hGUI_Logo = GuiCreate("Logo", 500, 140, 0, 0, $WS_CHILD, -1, $hGUI)
    GUISwitch($hGUI_Logo)
    GuiSetFont(9, 400, 0, "Segoe UI", $hGUI_Logo, $CLEARTYPE_QUALITY)
    Global $hGUI_Logo_IMG_Logo = GUICtrlCreatePic("", 0, 0, 500, 140)
    _Set_Image_XXX($hGUI_Logo_IMG_Logo, "Logo500x140", "PNG")
    GUICtrlSetState($hGUI_Logo_IMG_Logo, $GUI_DISABLE)
    GuiSetState(@SW_HIDE, $hGUI_Logo)
EndFunc


Func _CreateGUI_Login()
    Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD, $WS_TABSTOP, $hGUI)
    GUISwitch($hGUI_Login)

    Global $hGUI_Login_Group_Auth = GUICtrlCreateGroup("Авторизация",100,50,300,175,-1,-1)
    GUICtrlSetFont(-1,9,700,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"0xF0F0F0")

    Global $hGUI_Login_Label_Username = GUICtrlCreateLabel("Логин",130,85,50,15,-1,-1)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"-2")

    Global $hGUI_Login_Input_Username = GUICtrlCreateInput("",220,80,150,20,-1,$WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetState(-1, $GUI_FOCUS)

    Global $hGUI_Login_Label_Password = GUICtrlCreateLabel("Пароль",130,115,50,15,-1,-1)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"-2")

    Global $hGUI_Login_Input_Password = GUICtrlCreateInput("",220,110,150,20,$ES_PASSWORD,$WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    Global $hGUI_Login_Button_SignIn = GUICtrlCreateButton("Войти",220,145,150,25,-1,-1)
    GUICtrlSetOnEvent(-1,"_GuiEvents_hGUI_Login_Button_SignIn")
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    Global $hGUI_Login_Button_SignUp = GUICtrlCreateButton("Зарегистрироваться",220,180,150,25,-1,-1)
    GUICtrlSetOnEvent(-1,"_GuiEvents_hGUI_Login_Button_SignUp")
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    GUICtrlCreateGroup("",100,240,300,60,-1,-1)
    GUICtrlSetBkColor(-1,"0xF0F0F0")

    Global $hGUI_Login_Label_Language = GUICtrlCreateLabel("Язык",130,265,50,15,-1,-1)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"-2")

    Global $hGUI_Login_Combo_Language = GUICtrlCreateCombo("",220,260,150,20,-1,-1)
    GUICtrlSetData(-1,"English|Русский")
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    GuiSetState(@SW_HIDE, $hGUI_Login)
EndFunc

_CreateGUI()
_CreateGUI_Logo()
_CreateGUI_Login()

GUISetState(@SW_SHOW, $hGUI)
GUISetState(@SW_SHOW, $hGUI_Logo)
GUISetState(@SW_SHOW, $hGUI_Login)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Сложно сказать, т.к нет рабочего примера (который воспроизводит проблему).
Но предположу что проблема в неправильном присвоении стилей, скорее всего нужно так:

Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hGUI)
 
Автор
vivernet

vivernet

Знающий
Сообщения
32
Репутация
5
Сложно сказать, т.к нет рабочего примера (который воспроизводит проблему).
Но предположу что проблема в неправильном присвоении стилей, скорее всего нужно так:

Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hGUI)
так тоже пробовал, и тогда не работает совсем...

Сейчас рабочий пример сделаю
Сообщение автоматически объединено:

Вот рабочий вариант, тут в принципе как раз работает переключение фокуса при нажатии Tab, но возникает большая проблема, что можно дочернее окно двигать куда угодно внутри родительского, просто мышкой нажав на любое место дочернего окна...

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <UpDownConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#Include <GuiButton.au3>
#include <GuiStatusBar.au3>
#include <GuiTab.au3>
$CLEARTYPE_QUALITY = 5
$g_App_Name = "App"
$g_App_Version = "0.0.1"
$g_App_Language = "Русский"
Global Const $g_COLOR_GREEN = 5158692
Global Const $g_COLOR_ORANGE = 16217624
Global Const $g_COLOR_RED = 16711737
Global Const $g_COLOR_PURPUR = 10048699
Global Const $g_COLOR_WHITE = 16777215

Opt("GUIOnEventMode", 1)

Func _CreateGUI()
;~     Local $LastPosX = IniRead($g_ConfigFile, "GUI", "LastPosX", -1)
;~     Local $LastPosY = IniRead($g_ConfigFile, "GUI", "LastPosY", -1)

;~     If $LastPosX >= 0 Then
;~         Global $hGUI = GUICreate($g_App_Name, 500, 600, $LastPosX, $LastPosY, -1, -1)
;~     Else
        Global $hGUI = GUICreate($g_App_Name, 500, 600, -1, -1, -1, -1)
;~     EndIf

    GUISetFont(9, 400, 0, "Segoe UI", $hGUI, $CLEARTYPE_QUALITY)

    GuiSetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hGUI)

    Global $hGUI_StatusBar = _GUICtrlStatusBar_Create($hGUI, -1, "", -1, -1)
    _GUICtrlStatusBar_SetMinHeight($hGUI_StatusBar, 20)

    Global $hGUI_Label_Version = GUICtrlCreateLabel("v." & $g_App_Version, 10, 555, 40, 20, $SS_CENTERIMAGE, -1)
    GUICtrlSetFont(-1, 9, 400, 0, "Segoe UI")

    Global $hGUI_Label_Update = GUICtrlCreateLabel(_Tr("Доступна новая версия!", "New version is available!"), 55, 555, 150, 20, $SS_CENTERIMAGE, -1)
    GUICtrlSetColor($hGUI_Label_Update, $g_Color_RED)
    GUICtrlSetFont(-1, 9, 700, 0, "Segoe UI")
    GUICtrlSetState(-1, $GUI_HIDE)

    Global $hGui_Button_Update = GUICtrlCreateButton(_Tr("Обновить", "Update"), 210, 555, 80, 20, -1, -1)
    GUICtrlSetBKColor(-1, $g_Color_RED)
    GUICtrlSetFont(-1, 8, 700, 0, "Segoe UI")
    GUICtrlSetColor(-1, $g_Color_WHITE)
    GUICtrlSetCursor(-1, 0)
    GUICtrlSetState(-1, $GUI_HIDE)
EndFunc

Func _CreateGUI_Logo()
    Global $hGUI_Logo = GuiCreate("Logo", 500, 140, 0, 0, $WS_CHILD, -1, $hGUI)
    GuiSetFont(9, 400, 0, "Segoe UI", $hGUI_Logo, $CLEARTYPE_QUALITY)
    Global $hGUI_Logo_IMG_Logo = GUICtrlCreatePic("", 0, 0, 500, 140)
   ; _Set_Image_XXX($hGUI_Logo_IMG_Logo, "Logo500x140", "PNG")
    GUICtrlSetState($hGUI_Logo_IMG_Logo, $GUI_DISABLE)
EndFunc

Func _CreateGUI_Login()
    Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD, $WS_TABSTOP, $hGUI)

    Global $hGUI_Login_Group_Auth = GUICtrlCreateGroup("Авторизация",100,50,300,175,-1,-1)
    GUICtrlSetFont(-1,9,700,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"0xF0F0F0")

    Global $hGUI_Login_Label_Username = GUICtrlCreateLabel("Логин",130,85,50,15,-1,-1)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"-2")

    Global $hGUI_Login_Input_Username = GUICtrlCreateInput("",220,80,150,20,-1,$WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetState(-1, $GUI_FOCUS)

    Global $hGUI_Login_Label_Password = GUICtrlCreateLabel("Пароль",130,115,50,15,-1,-1)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"-2")

    Global $hGUI_Login_Input_Password = GUICtrlCreateInput("",220,110,150,20,$ES_PASSWORD,$WS_EX_CLIENTEDGE)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    Global $hGUI_Login_Button_SignIn = GUICtrlCreateButton("Войти",220,145,150,25,-1,-1)
;~     GUICtrlSetOnEvent(-1,"_GuiEvents_hGUI_Login_Button_SignIn")
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    Global $hGUI_Login_Button_SignUp = GUICtrlCreateButton("Зарегистрироваться",220,180,150,25,-1,-1)
;~     GUICtrlSetOnEvent(-1,"_GuiEvents_hGUI_Login_Button_SignUp")
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

    GUICtrlCreateGroup("",100,240,300,60,-1,-1)
    GUICtrlSetBkColor(-1,"0xF0F0F0")

    Global $hGUI_Login_Label_Language = GUICtrlCreateLabel("Язык",130,265,50,15,-1,-1)
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")
    GUICtrlSetBkColor(-1,"-2")

    Global $hGUI_Login_Combo_Language = GUICtrlCreateCombo("",220,260,150,20,-1,-1)
    GUICtrlSetData(-1,"English|Русский")
    GUICtrlSetFont(-1,9,400,0,"Segoe UI")

EndFunc

Func _Tr($Russian, $English)
    Return $g_App_Language = "Русский" ? $Russian : $English
EndFunc

Func _Exit()
    Exit
EndFunc

Func _MainLoop()
    While 1
        Sleep(1000)
    WEnd
EndFunc

_CreateGUI()
_CreateGUI_Logo()
_CreateGUI_Login()

GUISetState(@SW_SHOW, $hGUI)
GUISetState(@SW_SHOW, $hGUI_Logo)
GUISetState(@SW_SHOW, $hGUI_Login)

_MainLoop()
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
У меня получилось так
Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD,0x8000, $hGUI)
 
Автор
vivernet

vivernet

Знающий
Сообщения
32
Репутация
5
У меня получилось так
Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD,0x8000, $hGUI)
работает примерно как и в моем примере, в плане с недостатками...

работает только если в форме только одно дочернее окно((( и еще заметил при этом стиле, игнорируется положение дочернего окна, в том план что в примере например дочернее должно находится по координатам относительно родительского окна: x=0 y=140, а отображает x=0 y=0

а если в форме больше одного дочернего окна, вообще все формы дочерние тупо пропали(((
Сообщение автоматически объединено:

эх, не думал что настроить переключение фокуса по табу так сложно будет(((
Сообщение автоматически объединено:

В готовом проекте прописал этот стиль у дочерних окон, и вот такой результат, отображается только первая созданная дочерняя форма
1.png
хотя по логике должно быть вот так (без этого стиля)
2.png

разница только в наличии/отсутствии стиля 0x8000
Сообщение автоматически объединено:

как понял жопа с этим вариантом, английский плохо знаю, но как понял в текущей версии AutoIt, $WS_TABSTOP тут не корректно работает(((
судя например по этой статье: https://www.autoitscript.com/forum/topic/202986-solved-parent-child-guis-and-input-control-fails/

хотя вроде написано Решено, но решения проблемы не увидел(
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
возникает большая проблема, что можно дочернее окно двигать куда угодно
Естественно, ведь используется стиль в том месте где не должен использоваться (ExStyle).
Можно сделать так, но минус тут в том, что при фокусе дочернего окна видно как теряется фокус с главного):

Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, BitOR($WS_POPUP, $WS_CHILD), $WS_EX_MDICHILD, $hGUI)


или так, тут минус в том, что не срабатывают события, например закрытие GUI:
Код:
Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, BitOR($WS_POPUP, $WS_CHILD), -1, $hGUI)
_WinAPI_SetParent($hGUI_Login, $hGUI)
 

CreatoR

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

Func _CreateGUI_Login()
    Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD, $WS_EX_CONTROLPARENT, $hGUI)
    
    ....
EndFunc

...

Func __WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    Return 0 ; ..to not continue
EndFunc

_CreateGUI()
_CreateGUI_Logo()
_CreateGUI_Login()

GUIRegisterMsg($WM_NCHITTEST, '__WM_NCHITTEST')

GUISetState(@SW_SHOW, $hGUI)
GUISetState(@SW_SHOW, $hGUI_Logo)
GUISetState(@SW_SHOW, $hGUI_Login)

_MainLoop()
 
Автор
vivernet

vivernet

Знающий
Сообщения
32
Репутация
5
Естественно, ведь используется стиль в том месте где не должен использоваться (ExStyle).
Это да понимаю, но написал чисто как единственный вариант при котором хоть как то работало
Сообщение автоматически объединено:

А вот же оно...
Код:
...

Func _CreateGUI_Login()
    Global $hGUI_Login = GUICreate("Login", 500, 420, 0, 140, $WS_CHILD, $WS_EX_CONTROLPARENT, $hGUI)
   
    ....
EndFunc

...

Func __WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    Return 0 ; ..to not continue
EndFunc

_CreateGUI()
_CreateGUI_Logo()
_CreateGUI_Login()

GUIRegisterMsg($WM_NCHITTEST, '__WM_NCHITTEST')

GUISetState(@SW_SHOW, $hGUI)
GUISetState(@SW_SHOW, $hGUI_Logo)
GUISetState(@SW_SHOW, $hGUI_Login)

_MainLoop()
Супер! Спасибо за помощь работает идеально!

PS: больше месяца голову ломал, уже даже думал что безнадежно
 
Верх