Подскажите пожалуйста что делаю не так.
Вот решил совместить дочернее окно с CtrlCreateListView
Хочу чтобы в дочернем окне был элемент GUICtrlCreateListView.
Дочернее окно открывается, но вот Combo не работает.
Вот решил совместить дочернее окно с 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