Что нового

Визуальное отделение Header и ListView

Andrey_A

Знающий
Сообщения
127
Репутация
12
Всем добрый...
Столкнулся с GUICtrlCreateListView, на Win10 полоса колонок (Header) сливается с пунктами
Хочется отделить полосой, но что-то никак - не хочется напрягать систему постоянной перерисовкой, может есть простой метод, без WM_NOTIFY, ну если без него никак то хотя бы с ним.
Окно с ListView размероизменяемое.

Код почти стандартный:
Код:
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Local $hGUI, $ListView, $button, $item1, $item2, $item3, $msg, $clear, $width

$hGUI = GUICreate("ListView", 240, 260, 100, 200,$WS_OVERLAPPEDWINDOW)
GUISetBkColor(0xd5d2af) ; устанавливает цвет фона Gui

$ListView = GUICtrlCreateListView("Колонка1|кол2|кол3  ", 10, 10, 220, 150,$LVS_REPORT,$LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES+$LVS_EX_HEADERDRAGDROP);,$LVS_SORTDESCENDING)
GUICtrlSetBkColor(-1, 0xFFFEEE) ; устанавливает цвет фона ListView
$item1 = GUICtrlCreateListViewItem("пункт2|кол22|кол23", $ListView)
$item2 = GUICtrlCreateListViewItem("пункт1|кол12|кол13", $ListView)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 6, 0) ; устанавливает иконку пункту
$item3 = GUICtrlCreateListViewItem("пункт3|кол32|кол33", $ListView)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0)

$button = GUICtrlCreateButton("Текст выбранной строки", 45, 170, 150, 25)
$width = GUICtrlCreateButton("Установить ширину колонок", 35, 200, 170, 25)
$clear = GUICtrlCreateButton("Очистить", 85, 230, 70, 25)

GUISetState()

GUICtrlSetData($item2, "ПУНКТ1")
GUICtrlSetData($item3, "||КОЛ33")
GUICtrlDelete($item1)

While 1
    Switch GUIGetMsg()
        Case $button
            MsgBox(0, "Текст выбранной строки", GUICtrlRead(GUICtrlRead($ListView)), 2, $hGUI)
        Case $clear
            GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0)
        Case $width
            GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 80)
            GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 1, 55)
            GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, 60)
        Case $ListView
            MsgBox(4096, "ListView", "колонка=" & GUICtrlGetState($ListView), 2, $hGUI)
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Вот исходное окно:
Listv1.png


Хотелось бы отделить либо так:
Listv2.png


либо так:
Listv3.png


либо так:
Listv4.png

можно и так:
Listv5.png
 
Последнее редактирование:

Tempo

Скриптер
Сообщения
603
Репутация
197
Код:
;~ AutoIt Version: 3.3.14.5
;~ Author:         Tempo
#include <GUIConstants.au3>
#include <GuiListView.au3>

Global $g_hHeader
example()

Func example()
    GUICreate(@ScriptName, 400, 400, -1, -1, $WS_OVERLAPPEDWINDOW)
    Local $idListView = GUICtrlCreateListView('1|2|3', 5, 5, 390, 390, BitOR($WS_BORDER, $GUI_SS_DEFAULT_LISTVIEW), 0)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    _GUICtrlListView_SetExtendedListViewStyle(-1, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    $g_hHeader = _GUICtrlListView_GetHeader(-1)

    For $i = 1 To 100
        GUICtrlCreateListViewItem($i & '|...|...', $idListView)
    Next
    GUIRegisterMsg($WM_NOTIFY, WM_NOTIFY)
    GUISetState()

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>example

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    Local $tNmHdr = DllStructCreate($tagNMHDR, $lParam)
    Switch $tNmHdr.hWndFrom
        Case $g_hHeader
            Switch $tNmHdr.Code
                Case $NM_CUSTOMDRAW
                    Local $tNmLvCustomDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Switch $tNmLvCustomDraw.dwDrawStage
                        Case $CDDS_PREPAINT
                            Return $CDRF_NOTIFYPOSTPAINT
                        Case $CDDS_POSTPAINT
                            Local $tRect = _WinAPI_GetClientRect($g_hHeader)
                            $tRect.Top = $tRect.Bottom - 2
                            _WinAPI_FillRect($tNmLvCustomDraw.hdc, $tRect, _WinAPI_GetStockObject($BLACK_BRUSH))
                    EndSwitch
                    Return $CDRF_DODEFAULT
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Верх