Автор Тема: Как нарисовать CheckBox на заголовке ListView  (Прочитано 1980 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pvnn [?]

  • Новичок
  • *
  • Сообщений: 199
  • Репутация: 18
    • Награды
  • Версия AutoIt: 3.3.12.0
Доброго времени суток
Есть ListView с несколькими checkbox, которые берутся из ImageList.
Необходимо в заголовок ListView (колонка 0 и 2) добавить checkbox, при клике на который выделялась бы вся колонка. Смотрю в сторону функции:
Код: AutoIt [Выделить]
 _GUICtrlHeader_SetItemFormat ( $hWnd, $iIndex,BitOR($HDF_IMAGE,$HDF_STRING))

Но не пойму как выбрать из ImageList 2 рисунок


(нажмите для показа/скрытия)

Русское сообщество AutoIt

Как нарисовать CheckBox на заголовке ListView
« Отправлен: Ноябрь 02, 2016, 10:36:59 »

Помечен как лучший ответ пользователем pvnn Отправлен Ноябрь 03, 2016, 07:01:02

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3268
  • Репутация: 856
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #1, Отправлен: Ноябрь 02, 2016, 14:42:10 »
pvnn  [?]
Цитировать
как выбрать из ImageList 2 рисунок
Так же, как и для пунктов... там даже названия функций похожи
Код: AutoIt [Выделить]
...
 $hHdr = _GUICtrlListView_GetHeader($hListView)   ; Получить идентификатор залоловка ListView
;~  _GUICtrlHeader_SetItemFormat($hHdr, 0, BitOR($HDF_IMAGE,$HDF_STRING) )
;~  _GUICtrlHeader_SetItemFormat($hHdr, 2, BitOR($HDF_IMAGE,$HDF_STRING) )
 _GUICtrlHeader_SetItemImage($hHdr, 0, 0)
 _GUICtrlHeader_SetItemImage($hHdr, 2, 0)
...
...
...
                Case $LVN_COLUMNCLICK ; A column was clicked
                    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                    $ListViewColumn=DllStructGetData($tInfo, "SubItem") ; Возвращает индекс выделенной колонки
;~                     _GUICtrlHeader_SetItemFormat($hHdr, $ListViewColumn, BitOR($HDF_IMAGE,$HDF_STRING))
                    If $ListViewColumn <> 1 Then
                        $currentitemimage = _GUICtrlHeader_GetItemImage($hHdr, $ListViewColumn)
                        If $currentitemimage = 0 Then
                            _GUICtrlHeader_SetItemImage($hHdr, $ListViewColumn, 1)
                        ElseIf $currentitemimage = 1 Then
                            _GUICtrlHeader_SetItemImage($hHdr, $ListViewColumn, 0)
                        EndIf
                    EndIf
...


Оффлайн Alofa [?]

  • Скриптер
  • ****
  • Сообщений: 1025
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #2, Отправлен: Ноябрь 02, 2016, 15:36:49 »
Я сделал так:
Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>

Local $hGUI, $iListView, $hListView, $hImage, $hHdr

$hGUI = GUICreate("ListView с несколькими колонками CheckBox", 300, 200)

$iListView = GUICtrlCreateListView("Поле1|Поле2|Поле3", 10, 10, 280, 180, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
$hListView = GUICtrlGetHandle($iListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
; Создать ImageList
$hImage = _GUIImageList_Create(16, 16, 5, 3)
_GUIImageList_AddIcon($hImage, @SystemDir & "\hnetcfg.dll", 2) ; UnCheck
_GUIImageList_AddIcon($hImage, @SystemDir & "\hnetcfg.dll", 1) ; Check
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

For $i = 0 To 5
    _GUICtrlListView_AddItem($hListView, "Test", 0)
    _GUICtrlListView_AddSubItem($hListView, $i, "Test", 0)
    _GUICtrlListView_AddSubItem($hListView, $i, "Test", 2, 0)
Next

Local $hHdr = _GUICtrlListView_GetHeader($hListView) ; Получить идентификатор залоловка ListView
_GUICtrlHeader_SetItemImage($hHdr, 0, 0)
_GUICtrlHeader_SetItemImage($hHdr, 2, 0)

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

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

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $tNMHDR, $tInfo, $iSubItem, $iImage
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd($tNMHDR.hWndFrom)
    If $hWndFrom = $hListView Then
        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
        $iSubItem = $tInfo.SubItem
        If $iSubItem <> 2 And $iSubItem <> 0 Then Return
        Switch $tNMHDR.Code
            Case $LVN_COLUMNCLICK
                $iImage = (_GUICtrlHeader_GetItemImage($hHdr, $iSubItem)) ? 0 : 1
                For $i = 0 To 5
                    _GUICtrlListView_SetItemImage($hListView, $i, $iImage, $iSubItem)
                Next
                _GUICtrlHeader_SetItemImage($hHdr, $iSubItem, $iImage)
            Case $NM_CLICK
                $iIndex = $tInfo.Index
                $iImage = (_GUICtrlListView_GetItemImage($hListView, $iIndex, $iSubItem)) ? 0 : 1
                _GUICtrlListView_SetItemImage($hListView, $iIndex, $iImage, $iSubItem)
                Local $iCount
                For $i = 0 To 5
                    $iCount += _GUICtrlListView_GetItemImage($hListView, $i, $iSubItem)
                Next
                _GUICtrlHeader_SetItemImage($hHdr, $iSubItem, (($iCount = 6) ? 1 : 0))
        EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

« Последнее редактирование: Ноябрь 02, 2016, 16:54:49 от Alofa, Причина: Переписал скрипт »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2403
  • Репутация: 411
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #3, Отправлен: Ноябрь 02, 2016, 15:59:03 »
остается добавить
Код: AutoIt [Выделить]
Case $NM_CLICK
;...........................
If Not $iImage Then _GUICtrlHeader_SetItemImage($hHdr, $iSubItem, $iImage);последней строчкой

то есть, если сняли хотя бы одну отметку в колонке, то с заголовка колонки тоже была снята отметка. хотя, тут вариант был бы лучше иконка с черным квадратом внутри чекбокса. как бы неполный выбор пунктов.
ну и проследить, если на всех пунктах поставлены отметки то и в заголовке появляется отметка чекбокса.
я это к тому, что тут уже не одна задача, а несколько. это чтобы все логично смотрелось

ну и все переменные нужно объявлять. локальные или глобальные. чтобы уж все до кучи было логично
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #3 Отправлен: Ноябрь 02, 2016, 15:59:03 »

Оффлайн Alofa [?]

  • Скриптер
  • ****
  • Сообщений: 1025
  • Репутация: 131
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #4, Отправлен: Ноябрь 02, 2016, 16:23:11 »
остается добавить
Код: AutoIt [Выделить]
...;последней строчкой

Дак добавил же, только не последней строкой.

... иконка с черным квадратом внутри чекбокса.
Хочу себе в копилку все это.
Не подскажите .dll с такой иконкой?


Добавлено: Ноябрь 02, 2016, 16:55:18
Переписал скрипт, но нужна иконка квадратика.
« Последнее редактирование: Ноябрь 02, 2016, 16:55:40 от Alofa »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2403
  • Репутация: 411
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #5, Отправлен: Ноябрь 02, 2016, 21:00:19 »
OffTopicAlofa  [?]
Цитировать
Дак добавил же, только не последней строкой.
нет, не было. видимо, когда ты редактировал сообщение, я как раз копировал твой код. сейчас он не такой :)
насчет библиотеки не подскажу. просто мысль возникла.
если писать программу, то лучше свою библиотеку иконок иметь.

Оффлайн pvnn [?]

  • Новичок
  • *
  • Сообщений: 199

  • Автор темы
  • Репутация: 18
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #6, Отправлен: Ноябрь 03, 2016, 07:00:51 »
InnI, Alofa, joiner спасибо большое за помощь! Тема решена.

Сделал так:
(нажмите для показа/скрытия)

Вариант, который предложил joiner, когда в кликнутой колонке есть строки Check и UnCheck, в заголовке  ListView назначить иконку с черным квадратом внутри чекбокса, как бы неполный выбор пунктов.

(нажмите для показа/скрытия)

« Последнее редактирование: Ноябрь 03, 2016, 13:41:33 от pvnn »

Русское сообщество AutoIt

Re: Как нарисовать CheckBox на заголовке ListView
« Ответ #6 Отправлен: Ноябрь 03, 2016, 07:00:51 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
5276 Просмотров
Последний ответ Январь 03, 2010, 03:25:45
от Latoid
2 Ответов
4699 Просмотров
Последний ответ Июнь 04, 2011, 23:14:59
от CreatoR
5 Ответов
3400 Просмотров
Последний ответ Апрель 05, 2011, 07:28:36
от NoMad73rus
5 Ответов
3243 Просмотров
Последний ответ Февраль 09, 2012, 22:19:44
от D3fault_Player
2 Ответов
2402 Просмотров
Последний ответ Апрель 01, 2012, 00:43:28
от sngr
2 Ответов
2285 Просмотров
Последний ответ Май 09, 2012, 13:14:47
от CreatoR
2 Ответов
1779 Просмотров
Последний ответ Июль 20, 2012, 23:16:30
от n-deer
7 Ответов
1240 Просмотров
Последний ответ Июнь 10, 2014, 12:40:49
от madmasles
1 Ответов
1231 Просмотров
Последний ответ Ноябрь 12, 2015, 15:47:30
от Medic84
5 Ответов
627 Просмотров
Последний ответ Апрель 16, 2017, 20:12:01
от Alofa