Что нового

Окна, Диалоги GUICtrlCreateListView перекрывает дочернее окно

kodges

Новичок
Сообщения
42
Репутация
0
Если запустите данный код и поклацаете по вкладкам то увидите что на вкладке с ListView, дочернее окно находится под таблицей. я специально сдвинул его так чтобы было заметно это. Вопрос как сделать так чтобы дочернее окно всегда было над таблицей и доступно без геморроя.
И второй вопрос, как запретить доступ к родительскому окну пока открыто дочернее ?
Буду весьма признателен за помощь.

Код:
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <Constants.au3>
#include <WinAPI.au3>
#include <Json.au3>
#include <File.au3>


Opt('GUIOnEventMode',         1)
;Opt('MustDeclareVars',         1)

Global    $hParentWin, $hChildWin

_Example3()

While 1
    Sleep(10)
WEnd

Func _ProExit()
    Exit
EndFunc

Func _CloseWin()
    GUIDelete(@GUI_WinHandle)
EndFunc


Func _Example3()
    $hParentWin = GUICreate('Родителськое окно',520, 540, 500, 500)
    GUICtrlCreateLabel('', -100, -100, 0, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit')


    $tab = GUICtrlCreateTab(1, 1, 500, 500, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS, $TCS_FOCUSNEVER))
    GUICtrlCreateTabItem("Вкладка1")
    $ListView = GUICtrlCreateListView("Заголовок1|Заголовок2|Заголовок3", 10, 30, -1, -1 )
    GUICtrlSetBkColor(-1, 0xFFFEEE) ; устанавливает цвет фона ListView
    $item1 = GUICtrlCreateListViewItem("пункт2|кол22|кол23", $ListView)
    $item2 = GUICtrlCreateListViewItem("пункт1|кол12|кол13", $ListView)
    $item3 = GUICtrlCreateListViewItem("пункт3|кол32|кол33", $ListView)
    GUICtrlCreateTabItem("Вкладка2")
    GUICtrlCreateTabItem("Вкладка3")
    GUICtrlCreateTabItem("")

    $hChildWin = GUICreate('Дочерное окно', 300, 200, 10, 15, $WS_SYSMENU)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')

    GUISetState(@SW_SHOW, $hParentWin)
    _WinAPI_SetParent($hChildWin, $hParentWin)
    GUISetState(@SW_SHOW, $hChildWin)
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вот Здесь всё очень хорошо написал CreatoR , вообще - вся тема очень полезная с массой простых примеров. лёгких для понимания.
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Вот Здесь всё очень хорошо написал CreatoR , вообще - вся тема очень полезная с массой простых примеров. лёгких для понимания.
К сожалению я не нашел в указанной вами ветке решения того что таблица ListView перекрывает дочернее окно :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А почему не так?
Код:
;............
    $hChildWin = GUICreate('Дочерное окно', 300, 200, 10, 15, $WS_SYSMENU, $WS_EX_MDICHILD, $hParentWin)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')
    
    GUISetState(@SW_SHOW, $hParentWin)
    ;_WinAPI_SetParent($hChildWin, $hParentWin)
    GUISetState(@SW_SHOW, $hChildWin)
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
А почему не так?
Код:
;............
    $hChildWin = GUICreate('Дочерное окно', 300, 200, 10, 15, $WS_SYSMENU, $WS_EX_MDICHILD, $hParentWin)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')
   
    GUISetState(@SW_SHOW, $hParentWin)
    ;_WinAPI_SetParent($hChildWin, $hParentWin)
    GUISetState(@SW_SHOW, $hChildWin)

Потому что использование _WinAPI_SetParent($hChildWin, $hParentWin), позволяет не покидать дочернему окну границ родительского при перетаскивании дочернего. Хотелось бы как раз этот функционал. Но как временное решение использую как раз то что предложили вы.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
использование _WinAPI_SetParent($hChildWin, $hParentWin), позволяет не покидать дочернему окну границ родительского при перетаскивании дочернего
Как вариант:
Код:
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <Constants.au3>
#include <WinAPI.au3>
;#include <Json.au3>
#include <File.au3>


Opt('GUIOnEventMode',         1)
;Opt('MustDeclareVars',         1)

Global    $hParentWin, $hChildWin

_Example3()

While 1
    Sleep(10)
WEnd

Func _ProExit()
    Exit
EndFunc

Func _CloseWin()
    GUIDelete(@GUI_WinHandle)
EndFunc


Func _Example3()
    $hParentWin = GUICreate('Родителськое окно',520, 540) ;, 500, 500)
    GUICtrlCreateLabel('', -100, -100, 0, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit')

    $tab = GUICtrlCreateTab(1, 1, 500, 500, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS, $TCS_FOCUSNEVER))
    GUICtrlCreateTabItem("Вкладка1")
    $ListView = GUICtrlCreateListView("Заголовок1|Заголовок2|Заголовок3", 10, 30, -1, -1)
    GUICtrlSetBkColor(-1, 0xFFFEEE) ; устанавливает цвет фона ListView
    $item1 = GUICtrlCreateListViewItem("пункт2|кол22|кол23", $ListView)
    $item2 = GUICtrlCreateListViewItem("пункт1|кол12|кол13", $ListView)
    $item3 = GUICtrlCreateListViewItem("пункт3|кол32|кол33", $ListView)
    GUICtrlCreateTabItem("Вкладка2")
    GUICtrlCreateTabItem("Вкладка3")
    GUICtrlCreateTabItem("")
    
    $hChildWin = GUICreate('Дочерное окно', 300, 200, 10, 15, $WS_SYSMENU, $WS_EX_MDICHILD, $hParentWin)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseWin')
    
    ;_WinAPI_SetParent($hChildWin, $hParentWin)
    GUISetState(@SW_SHOW, $hChildWin)
    GUISetState(@SW_SHOW, $hParentWin)
    
    GUIRegisterMsg($WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING")
EndFunc

Func WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam)
    If $hWnd <> $hChildWin Then
        Return $GUI_RUNDEFMSG
    EndIf
    
    Local $aParentPos = WinGetPos($hParentWin)
    Local $aParentCS = WinGetClientSize($hParentWin)
    
    Local $iParentLeft = $aParentPos[0]
    Local $iParentTop = $aParentPos[1]
    Local $iParentWidth = $aParentPos[2]
    Local $iParentHeight = $aParentPos[3]
    Local $iParentBrdrSize = $iParentWidth - $aParentCS[0]
    Local $iParentCaptionSize = $iParentHeight - $aParentCS[1]
    
    Local $stChildPos = DllStructCreate("uint;uint;int;int;int;int;uint", $lParam)
    Local $iChildLeft = DllStructGetData($stChildPos, 3)
    Local $iChildTop = DllStructGetData($stChildPos, 4)
    Local $iChildWidth = DllStructGetData($stChildPos, 5)
    Local $iChildHeight = DllStructGetData($stChildPos, 6)
    
    If $iChildLeft < $iParentLeft Then
        DllStructSetData($stChildPos, 3, $iParentLeft + $iParentBrdrSize)
    EndIf
    
    If ($iChildLeft + $iChildWidth) > ($iParentLeft + $iParentWidth - $iParentBrdrSize) Then
        DllStructSetData($stChildPos, 3, ($iParentLeft + $iParentWidth - $iChildWidth - $iParentBrdrSize))
    EndIf
    
    If $iChildTop < $iParentTop + $iParentCaptionSize Then
        DllStructSetData($stChildPos, 4, $iParentTop + $iParentCaptionSize)
    EndIf
    
    If ($iChildTop + $iChildHeight) > ($iParentTop + $iParentHeight - $iParentBrdrSize) Then
        DllStructSetData($stChildPos, 4, ($iParentTop + $iParentHeight - $iChildHeight - $iParentBrdrSize))
    EndIf
    
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Этот вариант не позволяет вообще двигать дочернее окно )) Но спасибо!
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Отсутствие предсказуемого поведения не есть гуд :( У меня дочернее окно появляется и с места не сдвинуть его...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проверил, все работает. окно можно перемещать
версии языка
3.3.12.0
3.3.15.0
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Все разобрался. Действительно все работает. Я пишу скрипт в Notepad++ и при запуске с него окно не двигается, а если запустить этот же скрипт из редактора SciTE то окно двигается. Спасибо за решение!
Сообщение автоматически объединено:

Добавлю, при запуске через Notepad++ я использовал x64 версию AutoIt. Сейчас указал в нем 32 битную версию и там тоже дочернее окно двигается корректно. Еще раз спасибо.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
я использовал x64 версию AutoIt
Вот так будет работать и с ней:
Код:
Func WM_WINDOWPOSCHANGING($hWnd, $iMsg, $wParam, $lParam)
    If $hWnd <> $hChildWin Then
        Return $GUI_RUNDEFMSG
    EndIf
    
    Local $aParentPos = WinGetPos($hParentWin)
    Local $aParentCS = WinGetClientSize($hParentWin)
    
    Local $iParentLeft = $aParentPos[0]
    Local $iParentTop = $aParentPos[1]
    Local $iParentWidth = $aParentPos[2]
    Local $iParentHeight = $aParentPos[3]
    Local $iParentBrdrSize = ($iParentWidth - $aParentCS[0])
    Local $iParentCaptionSize = ($iParentHeight - $aParentCS[1])
    
    Local $stChildPos = DllStructCreate($tagWINDOWPOS, $lParam)
    Local $iChildLeft = DllStructGetData($stChildPos, 'X')
    Local $iChildTop = DllStructGetData($stChildPos, 'Y')
    Local $iChildWidth = DllStructGetData($stChildPos, 'CX')
    Local $iChildHeight = DllStructGetData($stChildPos, 'CY')
    
    If $iChildLeft < $iParentLeft Then
        DllStructSetData($stChildPos, 'X', ($iParentLeft + $iParentBrdrSize))
    EndIf
    
    If ($iChildLeft + $iChildWidth) > ($iParentLeft + $iParentWidth - $iParentBrdrSize) Then
        DllStructSetData($stChildPos, 'X', ($iParentLeft + $iParentWidth - $iChildWidth - $iParentBrdrSize))
    EndIf
    
    If $iChildTop < ($iParentTop + $iParentCaptionSize) Then
        DllStructSetData($stChildPos, 'Y', ($iParentTop + $iParentCaptionSize))
    EndIf
    
    If ($iChildTop + $iChildHeight) > ($iParentTop + $iParentHeight - $iParentBrdrSize) Then
        DllStructSetData($stChildPos, 'Y', ($iParentTop + $iParentHeight - $iChildHeight - $iParentBrdrSize))
    EndIf
    
    Return $GUI_RUNDEFMSG
EndFunc
 
Верх