Что нового

Как поместить GUICtrlCreateListView в дочернее окно?

agikon

Знающий
Сообщения
789
Репутация
17
Подскажите пожалуйста что делаю не так.
Вот решил совместить дочернее окно с CtrlCreateListView
Хочу чтобы в дочернем окне был элемент GUICtrlCreateListView.
Дочернее окно открывается, но вот Combo не работает.

Код:
#include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#include <GUIEdit.au3>
#include <EditConstants.au3>
#include <GuiListView.au3>

Global $hSettings_GUI,$iInput,$aElement,$hListView,$hActive,$NM_DBLCLK,$WM_COMMAND
$GUI = GUICreate("", 200, 100)
GUISetState(@SW_SHOW, $GUI)

$button = GUICtrlCreateButton('Дочернее окно', 20, 20, 100, 20)

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




Func _Settings_Dlg($hParent = 0)
        Local $hSettings, $iGOEM_Opt
        ;Предотвращение проблем в случае если главный GUI использует режим событий
        $iGOEM_Opt = Opt("GUIOnEventMode", 0)

		$LngTitle = 'Double click the'
		$LngCol = 'Col'


		Opt("GUIOnEventMode", 1)
		Global $aElement[2], $hActive, $iInput
		Global $iListView, $hListView, $iExit, $iSaveChange

		$hSettings_GUI = GUICreate($LngTitle, 230, 365, -1, -1, -1, -1, $hParent)
		GUISetOnEvent(-3, '_Exit')

		$iInput = GUICtrlCreateCombo("", 0, 0, 0, 0)
		GUICtrlSetOnEvent($iInput, "_SaveChange")

		For $i=0 To 50
			GUICtrlSetData($iInput, $i)
		Next
		GUICtrlSetState(-1, $GUI_HIDE)

		$iListView = GUICtrlCreateListView($LngCol & ' 1|' & $LngCol & ' 2', 5, 5, 220, 330, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS))
		BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS)
		$hListView = GUICtrlGetHandle(-1)

		_GUICtrlListView_SetExtendedListViewStyle ($hListView, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
		_ListView_Random_Fill($iListView)

		$iExit = GUICtrlCreateDummy()
		GUICtrlSetOnEvent(-1, "_Exit")

		$iSaveChange = GUICtrlCreateDummy()
		GUICtrlSetOnEvent($iSaveChange, "_SaveChange")

		Global $AccelKeys[2][2] = [["{ESC}", $iExit],["{ENTER}", $iSaveChange]]
		GUISetAccelerators($AccelKeys)
		GUISetState()
		GUIRegisterMsg(0x4E, "_WM_NOTIFY")
		GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.



		;...
        GUISetState(@SW_DISABLE, $hParent)
        GUISetState(@SW_SHOW, $hSettings_GUI)

        While 1
            $nMsg2 = GUIGetMsg()
            Switch $nMsg2
                Case $GUI_EVENT_CLOSE
                    ExitLoop
            EndSwitch

        WEnd

        Opt("GUIOnEventMode", $iGOEM_Opt)
        GUISetState(@SW_ENABLE, $hParent)
        GUIDelete($hSettings_GUI)
EndFunc






Func _ListView_Random_Fill($iListView)
            Local $item1, $item2
            For $i = 1 To 20
                    $item1 = Random(10, 99, 1)
                    $item2 = ''
                    For $j = 1 To 9
                            $item2 &= Chr(Random(65, 90, 1)) ; 192, 255 - Ru
                    Next
                    GUICtrlCreateListViewItem($item1 & '|' & $item2, $iListView) ; создаём пункты
            Next
EndFunc


	; Выводит элемент Input на передний план
Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
            ;funkey 19.02.2010
            If $iIndex < 0 Then Return
            Local $aPos, $aRect, $iSum = 0
            Local $x, $y, $w, $h
            For $i = 0 To $iSubItem - 1
                    $iSum += _GUICtrlListView_GetColumnWidth($hWnd, $i)
            Next
            $aRect = _GUICtrlListView_GetItemRect($hWnd, $iIndex)
            $aPos = ControlGetPos($hSettings_GUI, "", $hWnd)
            $x = $iSum + $aPos[0] + $aRect[0]
            $y = $aPos[1] + $aRect[1]
            $w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
            $h = $aRect[3] - $aRect[1]
            GUICtrlSetPos($iInput, $x - 1, $y + 1, $w + 1, $h + 1)
            GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
            GUICtrlSetState($iInput, $GUI_SHOW)
            GUICtrlSetState($iInput, $GUI_FOCUS)
            $aElement[0] = $iIndex
            $aElement[1] = $iSubItem
EndFunc





    ; Сохранить изменения редактирования пункта
Func _SaveChange()
            Local $sText = GUICtrlRead($iInput)
            If StringInStr($sText, @CR) Or StringInStr($sText, @LF) Then
                    If StringLeft($sText, 1) <> '"' And StringInStr(StringMid($sText, 2, StringLen($sText) - 2), '"') Then $sText = StringReplace($sText, '"', "'")
                    $sText = '"' & StringReplace($sText, '"', '') & '"'
            EndIf
            _GUICtrlListView_BeginUpdate($hActive)
            _GUICtrlListView_SetItemText($hActive, $aElement[0], $sText, $aElement[1])
            GUICtrlSetState($iInput, $GUI_HIDE)
            _GUICtrlListView_SetColumnWidth($hActive, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
            _GUICtrlListView_EndUpdate($hActive)
            Return $sText ; возвращаем текст, если требуется его использовать после применения
    EndFunc


 Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
            Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
            $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
            $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
            $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
            $iCode = DllStructGetData($tNMHDR, "Code")
            Switch $hWndFrom
;                    Case $hListView, $hListView2
					Case $hListView
                            Switch $iCode
                                    Case $LVN_BEGINSCROLL ; прокрутка ListView
                                            If $hActive Then
                                                    $hActive = 0
                                                    GUICtrlSetState($iInput, $GUI_HIDE)
                                                    GUICtrlSetData($iInput, '') ; Очищаем поле ввода
                                            EndIf
                                    ;#cs
									Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
                                            Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                                            $hActive = $hWndFrom
                                            _GUICtrlListView_EditItem($hActive, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
                                            ; _GUICtrlListView_EnsureVisible($hActive, DllStructGetData($tInfo, "Index"), True)
									;#ce
                            EndSwitch
            EndSwitch
            Return $GUI_RUNDEFMSG
EndFunc


Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
            #forceref $hWnd, $iMsg
            Local $iIDFrom, $iCode
            $iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
            $iCode = BitShift($iwParam, 16) ; старшее слово
            Switch $iIDFrom
                    Case $iInput
                            Switch $iCode
                                    Case $EN_KILLFOCUS
                                            GUICtrlSetState($iInput, $GUI_HIDE)
                                            GUICtrlSetData($iInput, '') ; Очищаем поле ввода
                            EndSwitch
            EndSwitch
            Return $GUI_RUNDEFMSG
EndFunc


Func _Exit()
		Exit
EndFunc
 
Верх