purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 10:15 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Вс янв 28, 2018 7:23 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Его возможно убрать?
Про #PB_ListIcon_FullRowSelect знаю, но без него NMLISTVIEW не получает "iItem".

Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 28, 2018 8:35 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 669
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
тут же как у молодого встаёт вопрос, а как видеть? наверно поэтому и нельзя

можно предположить, цвет этого курсора может настраиматься в настройках винды, а значит можно изменить, но это убъёт курсор во всей винде, а значит надо ловить активное/не активное окно и менять цвет
цвет и курсора и фона у всех разный, нужно ловить оба
в теории получается


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 28, 2018 9:11 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
newJS писал(а):
а как видеть?
Подсветка планируется своя. На счет цвета уже думал, но рамка то остается.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 28, 2018 11:21 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
repeat писал(а):
newJS писал(а):
На счет цвета уже думал, но рамка то остается.

Вроде нет рамки
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
EnableExplicit
 
Define a
 
#coloredChars_Delimeter = "{***\"
 
;... Create brushes for painting item background
Structure MYBRUSHES
  brushDefault.l
  brushSelected.l
EndStructure
 
Global brush.MYBRUSHES
 
brush\brushSelected = CreateSolidBrush_(RGB(255, 255, 155))
brush\brushDefault = GetStockObject_(#WHITE_BRUSH)
 
Procedure GetCharWidth(gad, c$)
  ProcedureReturn SendMessage_(gad, #LVM_GETSTRINGWIDTH, 0, @c$)
EndProcedure
 
;Here we add some text to the underlying cell text to store the color info.
Procedure SetColor(gad, row, column, startp, endp, color)
  Protected text$
 
  text$ = GetGadgetItemText(gad, row, column)
  ;Now add the new text.
    text$+#coloredChars_Delimeter+Str(startp)+"\"+Str(endp)+"\"+Str(color)
    SetGadgetItemText(gad,row,text$,column)
EndProcedure
 
Procedure myWindowCallback(hwnd, msg, wParam, lParam)
  Protected result
  Protected *nmhdr.NMHDR
  Protected *lvCD.NMLVCUSTOMDRAW
  Protected thisRow
  Protected thisCol
  Protected subItemRect.RECT
  Protected text$
  Protected pos
  Protected subItemText$
  Protected i
  Protected j
  Protected c
  Protected color
  Protected c$
  Protected thisColor
  Protected nextColor
 
  result = #PB_ProcessPureBasicEvents
  Dim LVColor(0)
  Select msg
    Case #WM_NOTIFY
      *nmhdr.NMHDR = lParam
      *lvCD.NMLVCUSTOMDRAW = lParam
      If *lvCD\nmcd\hdr\hwndFrom=GadgetID(1) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW  
        Select *lvCD\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            result = #CDRF_NOTIFYSUBITEMDRAW;
          Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
            thisRow = *lvCD\nmcd\dwItemSpec
            thisCol = *lvCD\iSubItem
            ;... Define rect for text
            subItemRect.RECT\left = #LVIR_LABEL
            subItemRect.RECT\top = *lvCD\iSubItem
            ;... Get the subitem rect
            SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, thisRow, @subItemRect)
            text$ = GetGadgetItemText(1, thisRow, thisCol)
            pos = FindString(text$, #coloredChars_Delimeter,1)
            If pos
              subItemText$ = Left(text$, pos-1)
              text$ = Right(text$, Len(text$)-pos+1)
            Else
              subItemText$ = text$
              text$=""
            EndIf
            Dim LVColor(Len(subItemText$))
            pos=2
            For i = 1 To CountString(text$, #coloredChars_Delimeter)
              color = Val(StringField(StringField(text$,pos+2,"\"),1,"{"))
              For j = Val(StringField(text$,pos,"\")) To Val(StringField(text$,pos+1,"\"))
                LVCOlor(j) = color
              Next
              pos+3        
            Next
           ;... Paint over unused icon rect
            If *lvCD\iSubItem = 0
              subItemRect\left = 0
            EndIf
            If GetGadgetState(1) = thisRow
              ;... If item is selected
              FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushSelected)
            Else
              ;... If item is not selected
              FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushDefault)
            EndIf
            InflateRect_(subItemRect,-2,0)
           
            ;... Here we will paste together the colored characters
            ;... to form a string. This should speed up the drawing
            For c = 1 To Len(subItemText$)
              c$ = Mid(subItemText$, c, 1)
              For i = c + 1 To Len(subItemText$)
                thisColor = LVcolor(c)
                nextColor = LVcolor(i)
                If thisColor = nextColor
                  c$ + Mid(subItemText$, i, 1)
                  c + 1
                Else
                  Break
                EndIf
              Next i
              SetTextColor_(*lvCD\nmcd\hdc, thisColor)
              DrawText_(*lvCD\nmcd\hdc, c$, Len(c$), subItemRect, #DT_END_ELLIPSIS)
              subItemRect\left + GetCharWidth(*nmhdr\hwndFrom, c$)
            Next c
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
 
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(1,10,10,480,230,"Spalte 1",200,0)
  AddGadgetColumn(1,1,"Spalte 2",200)
 
  For a=1 To 10
    AddGadgetItem(1,-1,"Test "+Str(a)+Chr(10)+"Item "+Str(a+10),0,0)
  Next
 
  SetColor(1, 0, 0, 2, 3, #Cyan)
  SetColor(1, 0, 1, 1, 4, #Green)
  SetColor(1, 2, 1, 1, 6, #Red)
  SetColor(1, 3, 0, 1, 6, #Blue)
  SetColor(1, 5, 1, 1, 4, #Yellow)
  SetColor(1, 5, 1, 5, 6, #Blue)
 
  SetWindowCallback(@myWindowCallback())
 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
DeleteObject_(brush\brushSelected)


_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 28, 2018 3:18 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
kvitaliy писал(а):
repeat писал(а):
newJS писал(а):
На счет цвета уже думал, но рамка то остается.

Вроде нет рамки
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
EnableExplicit
 
Define a
 
#coloredChars_Delimeter = "{***\"
 
;... Create brushes for painting item background
Structure MYBRUSHES
  brushDefault.l
  brushSelected.l
EndStructure
 
Global brush.MYBRUSHES
 
brush\brushSelected = CreateSolidBrush_(RGB(255, 255, 155))
brush\brushDefault = GetStockObject_(#WHITE_BRUSH)
 
Procedure GetCharWidth(gad, c$)
  ProcedureReturn SendMessage_(gad, #LVM_GETSTRINGWIDTH, 0, @c$)
EndProcedure
 
;Here we add some text to the underlying cell text to store the color info.
Procedure SetColor(gad, row, column, startp, endp, color)
  Protected text$
 
  text$ = GetGadgetItemText(gad, row, column)
  ;Now add the new text.
    text$+#coloredChars_Delimeter+Str(startp)+"\"+Str(endp)+"\"+Str(color)
    SetGadgetItemText(gad,row,text$,column)
EndProcedure
 
Procedure myWindowCallback(hwnd, msg, wParam, lParam)
  Protected result
  Protected *nmhdr.NMHDR
  Protected *lvCD.NMLVCUSTOMDRAW
  Protected thisRow
  Protected thisCol
  Protected subItemRect.RECT
  Protected text$
  Protected pos
  Protected subItemText$
  Protected i
  Protected j
  Protected c
  Protected color
  Protected c$
  Protected thisColor
  Protected nextColor
 
  result = #PB_ProcessPureBasicEvents
  Dim LVColor(0)
  Select msg
    Case #WM_NOTIFY
      *nmhdr.NMHDR = lParam
      *lvCD.NMLVCUSTOMDRAW = lParam
      If *lvCD\nmcd\hdr\hwndFrom=GadgetID(1) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW  
        Select *lvCD\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            result = #CDRF_NOTIFYSUBITEMDRAW;
          Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
            thisRow = *lvCD\nmcd\dwItemSpec
            thisCol = *lvCD\iSubItem
            ;... Define rect for text
            subItemRect.RECT\left = #LVIR_LABEL
            subItemRect.RECT\top = *lvCD\iSubItem
            ;... Get the subitem rect
            SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, thisRow, @subItemRect)
            text$ = GetGadgetItemText(1, thisRow, thisCol)
            pos = FindString(text$, #coloredChars_Delimeter,1)
            If pos
              subItemText$ = Left(text$, pos-1)
              text$ = Right(text$, Len(text$)-pos+1)
            Else
              subItemText$ = text$
              text$=""
            EndIf
            Dim LVColor(Len(subItemText$))
            pos=2
            For i = 1 To CountString(text$, #coloredChars_Delimeter)
              color = Val(StringField(StringField(text$,pos+2,"\"),1,"{"))
              For j = Val(StringField(text$,pos,"\")) To Val(StringField(text$,pos+1,"\"))
                LVCOlor(j) = color
              Next
              pos+3        
            Next
           ;... Paint over unused icon rect
            If *lvCD\iSubItem = 0
              subItemRect\left = 0
            EndIf
            If GetGadgetState(1) = thisRow
              ;... If item is selected
              FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushSelected)
            Else
              ;... If item is not selected
              FillRect_(*lvCD\nmcd\hdc, subItemRect, brush\brushDefault)
            EndIf
            InflateRect_(subItemRect,-2,0)
           
            ;... Here we will paste together the colored characters
            ;... to form a string. This should speed up the drawing
            For c = 1 To Len(subItemText$)
              c$ = Mid(subItemText$, c, 1)
              For i = c + 1 To Len(subItemText$)
                thisColor = LVcolor(c)
                nextColor = LVcolor(i)
                If thisColor = nextColor
                  c$ + Mid(subItemText$, i, 1)
                  c + 1
                Else
                  Break
                EndIf
              Next i
              SetTextColor_(*lvCD\nmcd\hdc, thisColor)
              DrawText_(*lvCD\nmcd\hdc, c$, Len(c$), subItemRect, #DT_END_ELLIPSIS)
              subItemRect\left + GetCharWidth(*nmhdr\hwndFrom, c$)
            Next c
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
 
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(1,10,10,480,230,"Spalte 1",200,0)
  AddGadgetColumn(1,1,"Spalte 2",200)
 
  For a=1 To 10
    AddGadgetItem(1,-1,"Test "+Str(a)+Chr(10)+"Item "+Str(a+10),0,0)
  Next
 
  SetColor(1, 0, 0, 2, 3, #Cyan)
  SetColor(1, 0, 1, 1, 4, #Green)
  SetColor(1, 2, 1, 1, 6, #Red)
  SetColor(1, 3, 0, 1, 6, #Blue)
  SetColor(1, 5, 1, 1, 4, #Yellow)
  SetColor(1, 5, 1, 5, 6, #Blue)
 
  SetWindowCallback(@myWindowCallback())
 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
DeleteObject_(brush\brushSelected)


А почему подсветка не до конца?да и видно Spalte 3 но выбор этого столбца не работает а при его передвижении выскакивает полоса прокрутки которая прокручивает однако до конца Spalte 2 и при возврате в колонках первого столбца аброкатабра.:)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 28, 2018 3:31 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Сложно однако. Как DrawText_ использовать после #LVN_GETDISPINFO непонятно :?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс янв 28, 2018 4:16 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
А кто не будь использовал TextOut_? :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт фев 02, 2018 5:49 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Как строку то получить нарисованную DrawText_-ом?
Ни GetGadgetItemText() ни #LVM_GETITEMTEXT её не берут :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт фев 02, 2018 6:31 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
repeat писал(а):
Как строку то получить нарисованную DrawText_-ом?
Ни GetGadgetItemText() ни #LVM_GETITEMTEXT её не берут :)

С массива рисуй и из массива получай :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт фев 02, 2018 6:49 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Сергейчик писал(а):
repeat писал(а):
Как строку то получить нарисованную DrawText_-ом?
Ни GetGadgetItemText() ни #LVM_GETITEMTEXT её не берут :)

С массива рисуй и из массива получай :roll:
Не, это не то :?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб фев 03, 2018 1:29 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
repeat писал(а):
Сергейчик писал(а):
repeat писал(а):
Как строку то получить нарисованную DrawText_-ом?
Ни GetGadgetItemText() ни #LVM_GETITEMTEXT её не берут :)

С массива рисуй и из массива получай :roll:
Не, это не то :?

Почему не то,рисуешь же эти строки из каких то данных,из них и получаешь после отрисованную строку :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб фев 03, 2018 2:21 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Сергейчик писал(а):
из них и получаешь после отрисованную строку
Видимо, придётся так.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб фев 03, 2018 2:32 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
А как иначе если отрисовываешь в канвасе тысячи строк с прокруткой,неужели они хранятся при этом в видео памяти или просто памяти? :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб фев 03, 2018 2:48 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Да придется переписать малость. Как-то я,изначально, прошляпил NM_CUSTOMDRAW. :)
Спасибо kvitaliy за пример. Возможности у NM_CUSTOMDRAW порядочные.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс фев 04, 2018 8:23 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 669
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Сергейчик писал(а):
Видимо, придётся так.

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB