Что нового

[Элементы GUI] Скрываем столбец в GUICtrlCreateListView

---Zak---

Скриптер
Сообщения
443
Репутация
116
Добрый день.

Решил написать программку, которая работает с "GUICtrlCreateListView", но возможно ли как-нибудь скрыть один из столбцов "таблицы".

Все получается за исключением - не очень хочется держать в памяти "таблицу" и "массив", а записывать сразу же все в таблицу. Т.е. ниже скинул пример... там три столбца - "Double_Click" по строке - получаем значение значение третьего столбца в этой строке. Не выводить этот третий столбец, но значение надо выводилось.

Заранее спасибо...

Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global $hListView, $GUI, $URL_1
Global $iDouble_Click_Event = False
Global $iOne_Click_Event = False

Example()

Func Example()
	Local $button, $item1, $item2, $item3, $input1, $msg
	
	$GUI = GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
	GUISetBkColor(0x00E0FFFF)  ; will change background color

	$hListView = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150);,$LVS_SORTDESCENDING)
	$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $hListView)
	$item2 = GUICtrlCreateListViewItem("item1|col12|col13", $hListView)
	$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $hListView)
	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	GUISetState()

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
			
	If $iOne_Click_Event Then
		$iOne_Click_Event = 0
			ToolTip("Click - ")
	EndIf
	If $iDouble_Click_Event Then
			$iDouble_Click_Event = 0
			$URL_1 = ControlListView($GUI, "", $hListView, "GetText", ControlListView($GUI, "", $hListView, "GetSelected"), 2)
			ToolTip("Double - "&$URL_1)
	EndIf
	WEnd
EndFunc   ;==>Example

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $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_CLICK
                    $iOne_Click_Event = True
                Case $NM_DBLCLK
                    $iDouble_Click_Event = True
            EndSwitch
    EndSwitch
    
    Return $GUI_RUNDEFMSG
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Код:
_GUICtrlListView_SetColumnWidth($hListView, 2, 0)
 

XpycT

Скриптер
Сообщения
380
Репутация
132
или
Код:
_GUICtrlListView_HideColumn($hListView, 2)
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
443
Репутация
116
Спасибо... просто в справке не известно как выйти на эти функции.

PS: хотя растащить колонки можно =( будем искать другой способ =)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
---Zak--- [?]
хотя растащить колонки можно
Растащите здесь. :smile:
Код:
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

$hGui = GUICreate('ListView Hide Column', 400, 300)
$hListView = GUICtrlCreateListView('', 2, 2, 394, 268)
_GUICtrlListView_AddColumn($hListView, 'Column 1', 100)
_GUICtrlListView_AddColumn($hListView, 'Column 2', 100)
_GUICtrlListView_AddColumn($hListView, 'Column 3', 100)
GUICtrlCreateListViewItem('Column 1|Column 2|Column 3', $hListView)
_GUICtrlListView_HideColumn($hListView, 1)
$hHeader = _GUICtrlListView_GetHeader($hListView)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iCode, $tNMHDR
	$tNMHDR = DllStructCreate('hwnd hWndFrom;int_ptr IDFrom;int Code;dword dwFlags', $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
	$iCode = DllStructGetData($tNMHDR, 'Code')
	Switch $hWnd
		Case $hGui
			Switch $hWndFrom
				Case $hHeader
					Switch $iCode
						Case $HDN_ITEMCHANGING, $HDN_ITEMCHANGINGW ;заменил по совету CreatoR`a
							Return 1
						;Case $HDN_ITEMCHANGED, $HDN_ITEMCHANGEDW
							;_GUICtrlListView_HideColumn($hListView, 1)
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
443
Репутация
116
:laugh: :laugh: :laugh: :rofl:
Здорово...спасибо =)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
madmasles [?]
Растащите здесь
Есть метод получше чтобы не позволить колонке раскрываться:

Код:
...
    Switch $hWnd
        Case $hGui
            Switch $hWndFrom
                Case $hHeader
                    Switch $iCode
                        Case $HDN_ITEMCHANGING, $HDN_ITEMCHANGINGW
                            Return 1
                    EndSwitch
            EndSwitch
    EndSwitch
...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
CreatoR [?]
Есть метод получше чтобы не позволить колонке раскрываться:
Проверил, у меня так колонка вручную раскрывается.
Все работает, забыл поменять $HDN_ITEMCHANGING, $HDN_ITEMCHANGINGW. :-[
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
443
Репутация
116
Последний метод (который написал madmasles) отличный, но теперь не растащить их вообще :scratch: никого-никуда... даже что надо растащить - тоже не растащить...

Приходится
Код:
_GUICtrlListView_SetColumnWidth($hListView, 0, ****)

ставить перед появлением и расширять поля через циферку =)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
---Zak--- сказал(а):
Все получается за исключением - не очень хочется держать в памяти "таблицу" и "массив", а записывать сразу же все в таблицу.

Лучше использовать массив + список.
 

Norm

Знающий
Сообщения
113
Репутация
15
Для автора уже конечно не актуально, но вот у соседей нашел более качественное решения проблемы запрета изменения ширины столбца.
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <HeaderConstants.au3>

$hGUI = GUICreate("ListView Fix Column Width", 400, 300)
$hListView = GUICtrlCreateListView("Column 0|Column 1|Column 2|Column 3", 2, 2, 394, 268)
GUISetState()

; Prevent resizing of a specific column (0-based)
Global $iFix_Col = 1

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    ; Get details of message
    Local $tNMHEADER = DllStructCreate($tagNMHEADER, $lParam)
    ; Look for header resize code
    $iCode = DllStructGetData($tNMHEADER, "Code")
    Switch $iCode
        Case $HDN_BEGINTRACKW
            ; Now get column being resized
            Local $iCol = DllStructGetData($tNMHEADER, "Item")
            If $iCol = $iFix_Col Then
                ; Prevent resizing
                Return True
            Else
                ; Allow resizing
                Return False
            EndIf
    EndSwitch
EndFunc

И еще один, альтернативный, вариант решения этой-же проблемы
Источник
Код:
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  #forceref $hWnd, $iMsg, $iwParam
  Local $tNMHDR, $hWndFrom, $iCode
  Local Const $h_lv = GUICtrlGetHandle($lv)

  $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  $iCode = DllStructGetData($tNMHDR, "Code")
  Switch $hWndFrom
    Case $h_lv ; need Handle for detecting listview  $h_lv = GUICtrlGetHandle($h_lv)
      Switch $iCode
; ####### build in this part #################################################################
        Case -12 ; User has changed column width
            If _GUICtrlListView_GetColumnWidth($h_lv, 1) <> 0 Then _
                _GUICtrlListView_SetColumnWidth($h_lv, 1, 0) ; width of column 1 reset to zero
; ############################################################################################
        Case $LVN_ITEMCHANGED ; An listview item has changed
          Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
          Local $iItem = DllStructGetData($tInfo, "Item")
          _GUICtrlListView_SetItem($lv, 1 - _GUICtrlListView_GetItemChecked($h_lv, $iItem), $iItem, 1)
          ; No return value
      EndSwitch
  EndSwitch
EndFunc   ;==>WM_NOTIFY
 
Последнее редактирование:
Верх