Что нового

[Элементы GUI] Управление свойствами ListView

DemkaDV

Новичок
Сообщения
16
Репутация
3
К сожалению стандартные функции управления для ListView не позволяют динамически организовать свойство multiline (перенос текста в при фиксированном значении столбца).
Код:
#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>

; ========================================================================
; Global variables
; ========================================================================

Global Enum $idOpen = 1000, $idSave, $idInfo

; ========================================================================
; Main
; ========================================================================

$hGUI = GUICreate('Context Menu Demo (Right Click)', 400, 300)
$hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3(далее текст для переноса", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

GUISetState()

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func ListView_RClick()
    Local $aHit

    $aHit = _GUICtrlListView_SubItemHitTest($hListView)
    If ($aHit[0] <> -1) Then
        ; Create a standard popup menu
        ; -------------------- To Do --------------------
        $hMenu = _GUICtrlMenu_CreatePopup()
        _GUICtrlMenu_AddMenuItem($hMenu, "Open", $idOpen)
        _GUICtrlMenu_AddMenuItem($hMenu, "Save", $idSave)
        _GUICtrlMenu_AddMenuItem($hMenu, "Info", $idInfo)
        ; ========================================================================
        ; Shows how to capture the context menu selections
        ; ========================================================================
        Switch _GUICtrlMenu_TrackPopupMenu($hMenu, $hListView, -1, -1, 1, 1, 2)
            Case $idOpen
                _DebugPrint("Open: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idSave
                _DebugPrint("Save: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idInfo
                _DebugPrint("Info: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
        EndSwitch
        _GUICtrlMenu_DestroyMenu($hMenu)
    EndIf
EndFunc   ;==>ListView_RClick


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
                    ListView_RClick()
                    Return 0
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @LF & _
            "+======================================================" & @LF & _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
EndFunc   ;==>_DebugPrint

Подскажите как реализовать данную функцию?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
DemkaDV [?]
как реализовать данную функцию?
Я бы сделал через отображение в Edit:
Код:
#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>

; ========================================================================
; Global variables
; ========================================================================

Global Enum $idOpen = 1000, $idSave, $idInfo

; ========================================================================
; Main
; ========================================================================

$hGUI = GUICreate('Context Menu Demo (Right Click)', 400, 350)
$hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3" & "\nТекст на новой строке", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 3" & "\nТекст на новой строке", 2)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

$nEdit = GUICtrlCreateEdit("", 2, 280, 394, 60)

GUISetState()

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func ListView_LClick()
	Local $iItem = _GUICtrlListView_GetSelectedIndices($hListView)
	
	If $iItem <> "" Then
		$sText = _GUICtrlListView_GetItemText($hListView, Number($iItem ), 2)
		$sText = StringReplace($sText, "\n", @CRLF)
		GUICtrlSetData($nEdit, $sText)
	EndIf
EndFunc   ;==>ListView_LClick

Func ListView_RClick()
    Local $aHit
	
    $aHit = _GUICtrlListView_SubItemHitTest($hListView)
	
    If ($aHit[0] <> -1) Then
        ; Create a standard popup menu
        ; -------------------- To Do --------------------
        $hMenu = _GUICtrlMenu_CreatePopup()
        _GUICtrlMenu_AddMenuItem($hMenu, "Open", $idOpen)
        _GUICtrlMenu_AddMenuItem($hMenu, "Save", $idSave)
        _GUICtrlMenu_AddMenuItem($hMenu, "Info", $idInfo)
        ; ========================================================================
        ; Shows how to capture the context menu selections
        ; ========================================================================
        Switch _GUICtrlMenu_TrackPopupMenu($hMenu, $hListView, -1, -1, 1, 1, 2)
            Case $idOpen
                _DebugPrint("Open: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idSave
                _DebugPrint("Save: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
            Case $idInfo
                _DebugPrint("Info: " & StringFormat("Item, SubItem [%d, %d]", $aHit[0], $aHit[1]))
        EndSwitch
        _GUICtrlMenu_DestroyMenu($hMenu)
    EndIf
EndFunc   ;==>ListView_RClick

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
	
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
				Case $LVN_ITEMCHANGED ; Sent by a list-view control when the user clicks an item with the left mouse button
					ListView_LClick()
					Return 0
				Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button
                    ListView_RClick()
                    Return 0
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @LF & _
            "+======================================================" & @LF & _
            "-->Line(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
            "+======================================================" & @LF)
EndFunc   ;==>_DebugPrint
 
Автор
D

DemkaDV

Новичок
Сообщения
16
Репутация
3
Re: [Элементы GUI] [Элементы GUI] Управление свойствами ListView

Как вариант, спасибо, но пропадает общее восприятие, у меня в программе таких строк несколько,
и было бы удобно просто увеличить высоту строки + перенос текста в пределах ячейки.

Жду Ваших ответов - эксперты...
 
Автор
D

DemkaDV

Новичок
Сообщения
16
Репутация
3
Re: [Элементы GUI] [Элементы GUI] Управление свойствами ListView

как вариант нашел пример всплывающего окна в том месте где текст не вмещается

Код:
; example of tooltip for multiline text items
;   by GreenCan

#include <GUIConstants.au3>
#Include <GuiListView.au3>
#include <WindowsConstants.au3>
MsgBox(0,"Demo","Click on any cell, the cells containing multiple lines" & @CRLF & "will show a tooltip with the formatted text" & @CRLF & @CRLF & "Change '$NM_CLICK' to '$LVN_HOTTRACK'" & @CRLF & "for a fly-over effect", 10)

Global $iLastItem = -1, $iLastsubitemNR = -1

$GUI = GUICreate("Listview ToolTip for multiline cells")

$hListView = GuiCtrlCreateListView("Column 1", 10, 10, 380, 380,-1, BitOR($LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT ))

; fill with example data
    ; Add columns
    _GUICtrlListView_AddColumn ($hListView,  "Column 2", 100)
    _GUICtrlListView_AddColumn ($hListView,  "Column 3", 150)
    
    ; Add some rows
    _GUICtrlListView_AddItem($hListView, "A1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "A2" & @CRLF & "Example of multiline text", 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "A3" & @CRLF & "Example of multiline text" & @CRLF & "3rd line", 2)

    _GUICtrlListView_AddItem($hListView, "B1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "B2" & @CRLF & "Line 2" & @CRLF & "Line 3" & @CRLF & "Line 4", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "B3", 2)
    
    _GUICtrlListView_AddItem($hListView, "C1")
    _GUICtrlListView_AddSubItem($hListView, 2, "C2" & @CRLF & "Another multiline text", 1)
    _GUICtrlListView_AddSubItem($hListView, 2, "C3" & @CRLF & "Another Example of multiline text", 2)
; done

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While 1
    Switch GuiGetMsg()
    Case $GUI_EVENT_CLOSE
        ToolTip("") ; clean remaining ToolTip from WM_NOTIFY if necessary
        GUIDelete($GUI)
        Exit
    EndSwitch
WEnd
#FUNCTION# ==============================================================
Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
            Case $NM_CLICK ; when clicking on a cell that is multiline, a tooltip will display the content
            ;Case $LVN_HOTTRACK; Sent by a list-view control when the user moves the mouse over an item
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
                    Local $iItem = DllStructGetData($tInfo, "Item")
                    Local $subitemNR = DllStructGetData($tInfo, "SubItem")
                    
                    ; if no cell change return without doing anything
                    If $iLastItem = $iItem And $iLastsubitemNR = $subitemNR Then Return 0
                    $iLastItem = $iItem
                    $iLastsubitemNR = $subitemNR
                    
                    Local $sToolTipData = _GUICtrlListView_GetItemText($hListView, $iItem,$subitemNR)
                    $Mypos = StringInStr ( $sToolTipData, @CRLF )
                    If $Mypos > 0 Then 
                        ToolTip($sToolTipData, MouseGetPos(0) + 20, MouseGetPos(1) + 20) 
                    Else
                        ToolTip("")
                        ConsoleWrite("R" & $iItem & "C" & $iLastsubitemNR & " No tip" & @CR)
                    EndIf
            EndSwitch
    EndSwitch
        
    Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
#FUNCTION# ==============================================================
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] [Элементы GUI] Управление свойствами ListView

DemkaDV сказал(а):
как вариант нашел пример всплывающего окна в том месте где текст не вмещается

Для этого есть стиль $LVS_EX_INFOTIP.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
DemkaDV
Попробуйте, как вариант, в Вашем коде заменить в функции WM_NOTIFY()
Код:
;...
Case $NM_CLICK
;на
Case $LVN_HOTTRACK
 ;...
Подсказка будет появляться при наведении курсора на ячейку с многострочным текстом.

Еще можно заменить в тексте @CRLF на Chr(160), ИМХО, в ListView текст будет симпатичней смотреться.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
можно заменить в тексте @CRLF на Chr(160)
Тогда и при проверке это нужно заменить.
Но я бы лично использовал \n, чтобы было видно разделение на новую строку:
Код:
; example of tooltip for multiline text items
;   by GreenCan

#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Global $iLastItem = -1, $iLastsubitemNR = -1

$GUI = GUICreate("Listview ToolTip for multiline cells")

$hListView = GUICtrlCreateListView("Column 1", 10, 10, 380, 380, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

; fill with example data
; Add columns
_GUICtrlListView_AddColumn($hListView, "Column 2", 100)
_GUICtrlListView_AddColumn($hListView, "Column 3", 150)

; Add some rows
_GUICtrlListView_AddItem($hListView, "A1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "A2" & "\n" & "Example of multiline text", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "A3" & "\n" & "Example of multiline text" & "\n" & "3rd line", 2)

_GUICtrlListView_AddItem($hListView, "B1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "B2" & "\n" & "Line 2" & "\n" & "Line 3" & "\n" & "Line 4", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "B3", 2)

_GUICtrlListView_AddItem($hListView, "C1")
_GUICtrlListView_AddSubItem($hListView, 2, "C2" & "\n" & "Another multiline text", 1)
_GUICtrlListView_AddSubItem($hListView, 2, "C3" & "\n" & "Another Example of multiline text", 2)
; done

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

Func WM_NOTIFY($hWnd, $MsgID, $wParam, $lParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
	$hWndListView = $hListView
	If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")

	Switch $hWndFrom
		Case $hWndListView
			Switch $iCode
				;Case $NM_CLICK ; when clicking on a cell that is multiline, a tooltip will display the content
				Case $LVN_HOTTRACK; Sent by a list-view control when the user moves the mouse over an item
					Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
					Local $iItem = DllStructGetData($tInfo, "Item")
					Local $subitemNR = DllStructGetData($tInfo, "SubItem")

					; if no cell change return without doing anything
					If $iLastItem = $iItem And $iLastsubitemNR = $subitemNR Then Return 0
					$iLastItem = $iItem
					$iLastsubitemNR = $subitemNR

					Local $sToolTipData = StringReplace(_GUICtrlListView_GetItemText($hListView, $iItem, $subitemNR), "\n", @CRLF)

					If @extended Then
						ToolTip($sToolTipData, MouseGetPos(0) + 20, MouseGetPos(1) + 20)
					Else
						ToolTip("")
						ConsoleWrite("R" & $iItem & "C" & $iLastsubitemNR & " No tip" & @CR)
					EndIf
			EndSwitch
	EndSwitch

	Return $GUI_RUNDEFMSG
EndFunc
 
Автор
D

DemkaDV

Новичок
Сообщения
16
Репутация
3
Всем огромное спасибо !!!!
Считаю полезным закрыть тему.
 
Верх