purebasic.info

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

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Работа DrawFrameControl_() по ПКМ
СообщениеДобавлено: Пн май 22, 2017 12:27 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
В программе не учитывается что размер колонок можно изменить.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа DrawFrameControl_() по ПКМ
СообщениеДобавлено: Вт май 23, 2017 12:16 pm 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Пн май 15, 2017 11:06 am
Сообщений: 19
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Код:
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
Procedure SubclassedListIcon(hWnd, uMsg, wParam, lParam)
  Static Column, PosX
  result = CallWindowProc_(oldListIconCallback, hWnd, uMsg, wParam, lParam)
 
  Select uMsg
    Case #WM_NOTIFY                   ;Нажатие/Отжатие ЛКМ
      *pnmh.NMHDR = lparam
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(Gadget, -1, *pnmcd\dwItemSpec)
            If H\Height<10
              With H\Column(i)
                H\Height=*pnmcd\rc\bottom; исправление высоты заголовка
                For i=0 To H\ColumnCount-1
                  HideGadget(\Container,0):HideGadget(\Canvas,0)
                  ResizeGadget(\Container,#PB_Ignore,#PB_Ignore,#PB_Ignore,H\Height+1)
                  ResizeGadget(\Canvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,H\Height)
                  HideGadget(\Container,1):HideGadget(\Canvas,1)
                Next
              EndWith
            EndIf
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+2
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
              With H\Column(*pnmcd\lItemlParam)
                \X=*pnmcd\rc\left
                \WidthColumn=*pnmcd\rc\right-\X
              EndWith
            EndIf
           
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
            SetTextColor_(*pnmcd\hdc, H\Column(*pnmcd\dwItemSpec)\ColumnHeadColor)
           
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
     
    Case #WM_PARENTNOTIFY           ; Нажатие ПКМ
      If wParam=#WM_RBUTTONDOWN
        With hitinfo.LVHITTESTINFO
          \pt\x = lparam &$FFFF
          \pt\y = lparam>>16
        EndWith
        SendMessage_(hwnd,#LVM_SUBITEMHITTEST, 0, @hitInfo)
        Column=hitinfo\iSubItem
        With H\Column(Column)
          HideGadget(\Container,0):HideGadget(\Canvas,0)
          \X-PosX
          ResizeGadget(\Container,\X+GadgetX(Gadget),#PB_Ignore,\WidthColumn,#PB_Ignore)
          ResizeGadget(\Canvas,#PB_Ignore,#PB_Ignore,\WidthColumn,#PB_Ignore)
          If StartDrawing(CanvasOutput(\Canvas))
            OffsetX1=GadgetX(Gadget)-GadgetX(\Container)
            Box(0,0,\WidthColumn,H\Height,ColorBackDefault)
           
            If OffsetX1>0 And \WidthColumn-OffsetX1>0
              LineXY (OffsetX1, 0, \WidthColumn, 0, #Gray)
              LineXY (OffsetX1, 0, OffsetX1, H\Height, #Gray)
              ClipOutput(OffsetX1+2,0,\WidthColumn,H\Height)
              DrawText ((\WidthColumn-TextWidth(\ColumnName))/2+2, (H\Height-TextHeight(\ColumnName))/2+1, \ColumnName, \ColumnHeadColor, ColorBackDefault); смещение текста
            Else
              DrawText ((\WidthColumn-TextWidth(\ColumnName))/2+2, (H\Height-TextHeight(\ColumnName))/2+1, \ColumnName, \ColumnHeadColor, ColorBackDefault)
              LineXY (0, 0, \WidthColumn, 0, #Gray)
              LineXY (1, 0, 1, H\Height, #Gray):LineXY (2, 0, 2, H\Height, #Gray):LineXY (3, 0, 3, H\Height, #Gray)
            EndIf
           
            OffsetX2=GadgetX(Gadget)+GadgetWidth(Gadget)-20
            If GadgetX(\Container)+\WidthColumn>OffsetX2
              ResizeGadget(\Container,#PB_Ignore,#PB_Ignore,OffsetX2-GadgetX(\Container),#PB_Ignore)
            EndIf
           
          EndIf
          StopDrawing()
        EndWith
      EndIf
     
    Case #WM_CONTEXTMENU            ; Отжатие ПКМ
      HideGadget(H\Column(Column)\Container,1)
      HideGadget(H\Column(Column)\Canvas,1)
     
    Case #WM_HSCROLL                                                                                                                                                                                                    ; Событие горизонтальной прокрутки
     
      PosX=GetScrollPos_(GadgetID(Gadget),#SB_HORZ)
     
  EndSelect
  ProcedureReturn result
EndProcedure


Есть глюк. Если быстро сужать столбец > №8 то линейка быстро убегает вправо и столбец исчезает (это извесно давно). Сбой. Подвинеш её влево и всё норм.
GetScrollPos_() не при чём. Я грешил на обработчик по #WM_NOTIFY (неуспевает) и сделал так:
Код:
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
Procedure SubclassedListIcon(hWnd, uMsg, wParam, lParam)
  Static Column, PosX
  result = CallWindowProc_(oldListIconCallback, hWnd, uMsg, wParam, lParam)
 
  Select uMsg
    Case #WM_NOTIFY                   ;Нажатие/Отжатие ЛКМ
      *pnmh.NMHDR = lparam
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(Gadget, -1, *pnmcd\dwItemSpec)
            If H\Height<10
              With H\Column(i)
                H\Height=*pnmcd\rc\bottom; исправление высоты заголовка
                For i=0 To H\ColumnCount-1
                  HideGadget(\Container,0):HideGadget(\Canvas,0)
                  ResizeGadget(\Container,#PB_Ignore,#PB_Ignore,#PB_Ignore,H\Height+1)
                  ResizeGadget(\Canvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,H\Height)
                  HideGadget(\Container,1):HideGadget(\Canvas,1)
                Next
              EndWith
            EndIf
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+2
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
           
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
            SetTextColor_(*pnmcd\hdc, H\Column(*pnmcd\dwItemSpec)\ColumnHeadColor)
           
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
     
    Case #WM_PARENTNOTIFY           ; Нажатие ПКМ
      If wParam=#WM_RBUTTONDOWN
        With hitinfo.LVHITTESTINFO
          \pt\x = lparam &$FFFF
          \pt\y = lparam>>16
        EndWith
        SendMessage_(hwnd,#LVM_SUBITEMHITTEST, 0, @hitInfo)
        Column=hitinfo\iSubItem
       
          For i=0 To H\ColumnCount-1
            H\Column(i)\WidthColumn=GetGadgetItemAttribute(Gadget,0,#PB_ListIcon_ColumnWidth,i)
            If i=0
              H\Column(i)\X=GadgetX(Gadget)
            Else
              H\Column(i)\X=H\Column(i-1)\X+GetGadgetItemAttribute(Gadget,0,#PB_ListIcon_ColumnWidth,i-1)
            EndIf
          Next
       
        With H\Column(Column)
          \X-PosX
          HideGadget(\Container,0):HideGadget(\Canvas,0)
          ResizeGadget(\Container,\X,#PB_Ignore,\WidthColumn,#PB_Ignore)
          ResizeGadget(\Canvas,#PB_Ignore,#PB_Ignore,\WidthColumn,#PB_Ignore)
          If StartDrawing(CanvasOutput(\Canvas))
            OffsetX1=GadgetX(Gadget)-GadgetX(\Container)
            Box(0,0,\WidthColumn,H\Height,ColorBackDefault)
           
            If OffsetX1>0 And \WidthColumn-OffsetX1>0
              LineXY (OffsetX1, 0, \WidthColumn, 0, #Gray)
              LineXY (OffsetX1, 0, OffsetX1, H\Height, #Gray)
              ClipOutput(OffsetX1+2,0,\WidthColumn,H\Height)
              DrawText ((\WidthColumn-TextWidth(\ColumnName))/2+2, (H\Height-TextHeight(\ColumnName))/2+1, \ColumnName, \ColumnHeadColor, ColorBackDefault); смещение текста
            Else
              DrawText ((\WidthColumn-TextWidth(\ColumnName))/2+2, (H\Height-TextHeight(\ColumnName))/2+1, \ColumnName, \ColumnHeadColor, ColorBackDefault)
              LineXY (0, 0, \WidthColumn, 0, #Gray)
              LineXY (1, 0, 1, H\Height, #Gray):LineXY (2, 0, 2, H\Height, #Gray):LineXY (3, 0, 3, H\Height, #Gray)
            EndIf
           
            OffsetX2=GadgetX(Gadget)+GadgetWidth(Gadget)-20
            If GadgetX(\Container)+\WidthColumn>OffsetX2
              ResizeGadget(\Container,#PB_Ignore,#PB_Ignore,OffsetX2-GadgetX(\Container),#PB_Ignore)
            EndIf
          EndIf
          StopDrawing()
        EndWith
      EndIf
     
    Case #WM_CONTEXTMENU            ; Отжатие ПКМ
      HideGadget(H\Column(Column)\Container,1)
      HideGadget(H\Column(Column)\Canvas,1)
     
    Case #WM_HSCROLL                                                                                                                                                                                                    ; Событие горизонтальной прокрутки
      PosX=GetScrollPos_(GadgetID(Gadget),#SB_HORZ)
 
  EndSelect
 
  ProcedureReturn result
EndProcedure


Всё равно глючит.
Ещё вопрос как узнать ширину вертикальной линейки програмно. И также цвет клиентской зоны окна (между гаджетом и рамкой). Я нашол GetSysColor_(#COLOR_WINDOW)
но это не то:
Код:
1
Box(0,0,\WidthColumn,H\Height,GetSysColor_(#COLOR_WINDOW))



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа DrawFrameControl_() по ПКМ
СообщениеДобавлено: Ср май 24, 2017 11:01 am 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Пн май 15, 2017 11:06 am
Сообщений: 19
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
И никто ни спрашивает зачем столько гаджетов.
Потому что хотел навороты типа ращепления заголовка разный шрифт текст иконки и т.д.
Кому не надо вот облегчёный вариант:
Код:
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#LVM_GETHEADER = #LVM_FIRST + 31
 
Structure SII
  Column.l
  ColumnName.s
  ColumnHeadColor.l
  X.l
  WidthColumn.l
EndStructure
 
Structure SI
  Array Column.SII(0)
  Canvas.l
  ColumnCount.l
  Height.l
EndStructure
 
Global oldListIconCallback, Gadget, hHeader, brush, H.SI, ColorBackDefault=$D8E9EC
brush=CreateSolidBrush_(ColorBackDefault)
 
Procedure SubclassedListIcon(hWnd, uMsg, wParam, lParam)
  Static Column, PosX
  result = CallWindowProc_(oldListIconCallback, hWnd, uMsg, wParam, lParam)
 
  Select uMsg
    Case #WM_NOTIFY                   ;Нажатие/Отжатие ЛКМ
      *pnmh.NMHDR = lparam
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(Gadget, -1, *pnmcd\dwItemSpec)
            If H\Height<10
              H\Height=*pnmcd\rc\bottom; исправление высоты заголовка
              HideGadget(H\Canvas,0)
              ResizeGadget(H\Canvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,H\Height+1)
              HideGadget(H\Canvas,1)
            EndIf
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+2
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
           
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
            SetTextColor_(*pnmcd\hdc, H\Column(*pnmcd\dwItemSpec)\ColumnHeadColor)
           
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
     
    Case #WM_PARENTNOTIFY           ; Нажатие ПКМ
      If wParam=#WM_RBUTTONDOWN
        With hitinfo.LVHITTESTINFO
          \pt\x = lparam &$FFFF
          \pt\y = lparam>>16
        EndWith
        SendMessage_(hwnd,#LVM_SUBITEMHITTEST, 0, @hitInfo)
        Column=hitinfo\iSubItem
       
          For i=0 To H\ColumnCount-1
            H\Column(i)\WidthColumn=GetGadgetItemAttribute(Gadget,0,#PB_ListIcon_ColumnWidth,i)
            If i=0
              H\Column(i)\X=GadgetX(Gadget)
            Else
              H\Column(i)\X=H\Column(i-1)\X+GetGadgetItemAttribute(Gadget,0,#PB_ListIcon_ColumnWidth,i-1)
            EndIf
          Next
       
          With H\Column(Column)
            \X-PosX
            HideGadget(H\Canvas,0)
            If \X+\WidthColumn>GadgetX(Gadget)+GadgetWidth(Gadget)-20
              ResizeGadget(H\Canvas,\X,GadgetY(Gadget),GadgetX(Gadget)+GadgetWidth(Gadget)-20-\X,H\Height+2)
            Else
              ResizeGadget(H\Canvas,\X,GadgetY(Gadget),\WidthColumn+2,H\Height+2)
            EndIf
           
            If StartDrawing(CanvasOutput(H\Canvas))
              Box(0,0,GadgetWidth(H\Canvas),GadgetHeight(H\Canvas),ColorBackDefault)
              If \X<GadgetX(Gadget) And \X+GadgetWidth(H\Canvas)>0
                ClipOutput(GadgetX(Gadget)-\X,0,GadgetWidth(H\Canvas),GadgetHeight(H\Canvas))
                DrawText ((GadgetWidth(H\Canvas)-TextWidth(\ColumnName))/2+2, (GadgetHeight(H\Canvas)-TextHeight(\ColumnName))/2+1, \ColumnName, \ColumnHeadColor, ColorBackDefault); смещение текста
                LineXY (0, 0, GadgetWidth(H\Canvas), 0, #Gray):LineXY (0, 1, GadgetWidth(H\Canvas), 1, #Gray)
                LineXY (GadgetX(Gadget)-\X, 0, GadgetX(Gadget)-\X, GadgetHeight(H\Canvas), #Gray)
              Else
                If Column<>5
                  DrawText ((\WidthColumn-TextWidth(\ColumnName))/2+3, (H\Height-TextHeight(\ColumnName))/2+2, \ColumnName, \ColumnHeadColor, ColorBackDefault)
                  LineXY (0, 0, GadgetWidth(H\Canvas), 0, #Gray):LineXY (0, 1, GadgetWidth(H\Canvas), 1, #Gray)
                  LineXY (1, 0, 1, GadgetHeight(H\Canvas), #Gray):LineXY (2, 0, 2, GadgetHeight(H\Canvas), #Gray):LineXY (3, 0, 3, GadgetHeight(H\Canvas), #Gray)
                Else; Ради смеха
                  DrawingMode(#PB_2DDrawing_Gradient)
                  BackColor($0000FF)
                  GradientColor(0.4, $00FFFF)
                  GradientColor(0.6, $FFFF00)
                  FrontColor($FF0000)
                  LinearGradient (0, 0, GadgetWidth(H\Canvas), GadgetHeight(H\Canvas))
                  FillArea (0, 0, -1)
                  DrawingMode(#PB_2DDrawing_Transparent)
                 
                  DrawText ((\WidthColumn-TextWidth(\ColumnName))/2+3, (H\Height-TextHeight(\ColumnName))/2+2, \ColumnName, #Blue, ColorBackDefault)
                  LineXY (0, 0, GadgetWidth(H\Canvas), 0, #Gray):LineXY (0, 1, GadgetWidth(H\Canvas), 1, #Gray)
                  LineXY (1, 0, 1, GadgetHeight(H\Canvas), #Gray):LineXY (2, 0, 2, GadgetHeight(H\Canvas), #Gray):LineXY (3, 0, 3, GadgetHeight(H\Canvas), #Gray)
                 
                EndIf
              EndIf
 
            EndIf
          EndIf
          StopDrawing()
        EndWith
       
      Case #WM_CONTEXTMENU            ; Отжатие ПКМ
      HideGadget(H\Canvas,1)
     
    Case #WM_HSCROLL                                                                                                                                                                                                    ; Событие горизонтальной прокрутки
      PosX=GetScrollPos_(GadgetID(Gadget),#SB_HORZ)
 
  EndSelect
 
  ProcedureReturn result
EndProcedure
 
Window=OpenWindow(#PB_Any, 100, 100, 415, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Gadget=ListIconGadget(#PB_Any, 5, 5, 405, 200, "col 0", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
H\Height=2                                                                                ; Высота заголовка заведомо мало. Потом исправится
H\ColumnCount=10                                                                          ; Число столбцов
FontDefault = GetGadgetFont(Gadget)                                                       ; Узнать шрифт по умолчанию (без создания хотя бы формального ListIconGadget невозможно)
SendMessage_(SendMessage_(GadgetID(Gadget),#LVM_GETHEADER,0,0),#WM_SETFONT,@FontDefault,1); Шрифт заголовка
 
ReDim H\Column(H\ColumnCount)
 
oldListIconCallback = SetWindowLong_(GadgetID(Gadget), #GWL_WNDPROC, @SubclassedListIcon())
 
X=GadgetX(Gadget)+1:i=0
For i=0 To H\ColumnCount-1
  If i
    AddGadgetColumn(Gadget, i, "col "+Str(i), 50)
  EndIf
 
  With H\Column(i)
    \X=X
    \Column=i
    \ColumnName=GetGadgetItemText(Gadget,-1,i)
    \WidthColumn=GetGadgetItemAttribute(Gadget,0,#PB_ListIcon_ColumnWidth,i)
   
    If \Column & 1
      \ColumnHeadColor=#Blue
    Else
      \ColumnHeadColor=#Red
    EndIf
   
    X+\WidthColumn
  EndWith
Next
 
SetGadgetItemText(Gadget,-1,"ТЫЦ",5); Ради смеха
H\Column(5)\ColumnHeadColor=#Black
 
H\Canvas=CanvasGadget(#PB_Any, 0, 0, 0, 0, #PB_Canvas_ClipMouse):HideGadget(H\Canvas,1)
 
For b=0 To 99
  AddGadgetItem(Gadget,-1,"")
Next
For i = 0 To 99
  For j = 0 To 50
    SetGadgetItemText(Gadget,i,Str(i+j),j)
  Next j
Next i          
 
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
DeleteObject_(brush)


В принципе всё можно и на 1 гаджете.
Всё мне больше нечего добавить. Пётр, спасибо. Если неинтиресно тему можно закрывать.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа DrawFrameControl_() по ПКМ
СообщениеДобавлено: Чт июн 15, 2017 11:48 am 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Пн май 15, 2017 11:06 am
Сообщений: 19
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Есть ещё кое что.
Делаю подсветку заголовка при навидении курсора:
Код:
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
146
147
148
149
#LVM_GETHEADER = #LVM_FIRST + 31
 
Structure SII
  Column.l
  ColumnName.s
  ColumnHeadColor.l
EndStructure
 
Structure SI
  Array Column.SII(0)
  ColumnCount.l
EndStructure
 
LoadFont(0, "impact", 10, #PB_Font_Italic)                       ; Шрифт заголовков
Global FontHead=FontID(0)
Global oldListIconCallback,Window, Gadget, H.SI, ColorBackDefault=$D8E9EC, FontHead=FontID(0)
 
Procedure SubclassedListIcon(hWnd, Msg, wParam, lParam)
  Static Column,text$,Context,*Var,X,Y,LEFT,TOP,brush,brushlight
  result = CallWindowProc_(oldListIconCallback, hWnd, Msg, wParam, lParam)
  Delta=20                                                 ; Опережение события перехода границы заголовка
 
  Select Msg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lparam
     
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
       
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
           
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(Gadget, -1, *pnmcd\dwItemSpec)
            SetTextColor_(*pnmcd\hdc, H\Column(*pnmcd\dwItemSpec)\ColumnHeadColor)
           
            If Context And *Var
              ReleaseDC_(*Var, Context)
              DeleteObject_(brush):DeleteObject_(brushlight)
            EndIf
            brush=CreateSolidBrush_(ColorBackDefault)     ; Кисть для заголовков
            brushlight=CreateSolidBrush_(GetSysColor_(#COLOR_WINDOW)); Кисть подсветки заголовков
           
            *Var=*pnmcd\hdr\hwndFrom:Context=GetDC_(*Var) ; GetDC_() назначает атрибуты по умолчанию (шрифт и т.п.)
            SelectObject_(Context, FontHead)              ; восстанавить шрифт
           
            GetCursorPos_(@pt.POINT)
            ScreenToClient_(WindowID(Window),@pt)         ; Поместить координаты курсора в структуру POINT для PtInRect_()
           
            If pt\x<X
              LEFT=1
            ElseIf pt\x>X
              LEFT=0
            EndIf
            X=pt\x
           
            If pt\y<Y
              TOP=1
            ElseIf pt\y>Y
              TOP=0
            EndIf
            Y=pt\y
           
            If *pnmcd\uItemState & 1                       ; Нажато
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+2
            Else                                           ; не нажато
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
           
            FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
           
            ; Курсор пересекает границу заголовка
           
            If pt\y>1 And pt\y<*pnmcd\rc\bottom
              If LEFT                                         ; Идёт влево
                *pnmcd\rc\left+Delta:*pnmcd\rc\right+Delta    ; Сдвинуть зону проверки курсора вправо
                If PtInRect_(*pnmcd\rc, pt\x | (pt\y<<32))    ; Если курсор внутри то нужен левый столбец
                  *pnmcd\rc\left-Delta:*pnmcd\rc\right-Delta  ; Вернуть зону обратно дабы не было ошибок
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, brushlight); Подсветить левый столбец
                Else
                  *pnmcd\rc\left-Delta:*pnmcd\rc\right-Delta
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)     ; Сброс подсветки
                EndIf
              Else                                            ; Идёт вправо. Наоборот
                *pnmcd\rc\left-Delta:*pnmcd\rc\right-Delta
                If PtInRect_(*pnmcd\rc, pt\x | (pt\y<<32))
                  *pnmcd\rc\left+Delta:*pnmcd\rc\right+Delta
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, brushlight)
                Else
                  *pnmcd\rc\left+Delta:*pnmcd\rc\right+Delta
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
                EndIf
              EndIf
            Else
              If TOP                                          ; Курсор идёт вверх
                *pnmcd\rc\top+Delta:*pnmcd\rc\bottom+Delta
                If PtInRect_(*pnmcd\rc, pt\x | (pt\y<<32))    ; Входит в заголовок снизу
                  *pnmcd\rc\top-Delta:*pnmcd\rc\bottom-Delta
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, brushlight)
                Else                                          ; Выходит из заголовка снизу
                  *pnmcd\rc\top-Delta:*pnmcd\rc\bottom-Delta
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)     ; Сброс подсветки
                EndIf
              EndIf
            EndIf
           
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
 
  EndSelect
  ProcedureReturn result
EndProcedure
 
Window=OpenWindow(#PB_Any, 100, 100, 415, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Gadget=ListIconGadget(#PB_Any, 5, 5, 405, 200, "col 0", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_HeaderDragDrop)
H\ColumnCount=10
  ReDim H\Column(H\ColumnCount)
  SendMessage_(SendMessage_(GadgetID(Gadget),#LVM_GETHEADER,0,0),#WM_SETFONT,FontHead,1)
 
  oldListIconCallback = SetWindowLong_(GadgetID(Gadget), #GWL_WNDPROC, @SubclassedListIcon())
 
  For i = 1 To 10
    AddGadgetColumn(Gadget, i, "col "+Str(i), 50)
    If i & 1
      H\Column(i)\ColumnHeadColor=#Blue
    Else
      H\Column(i)\ColumnHeadColor=#Red
    EndIf
  Next
  For b=0 To 99
    AddGadgetItem(Gadget,-1,"")
  Next
  For i = 0 To 99
    For j = 0 To 50
      SetGadgetItemText(Gadget,i,Str(i+j),j)
    Next j
  Next i
  SetGadgetItemAttribute(Gadget,0,#PB_ListIcon_ColumnWidth,0,0)
;  
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow


Работает через ж. Ну потому что не надо так извращаться.
Ведь есть же нативная подсветка. Её видно если закоментировать:
Код:
1
2
3
  ;SendMessage_(SendMessage_(GadgetID(Gadget),#LVM_GETHEADER,0,0),#WM_SETFONT,FontHead,1)
 
  ;oldListIconCallback = SetWindowLong_(GadgetID(Gadget), #GWL_WNDPROC, @SubclassedListIcon())


Уверен в атрибутах столбцов есть какой то флаг что заголовок подсвечен. Надо его засеч и включить свою кисть brushlight. Делов то.
Кто знает как?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа DrawFrameControl_() по ПКМ
СообщениеДобавлено: Пт фев 02, 2018 12:05 pm 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Пн май 15, 2017 11:06 am
Сообщений: 19
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Всем привет. Спрошу в этой теме.
Код отлично работает в ХР. Посвечивает загаловок по наведению курсора. Но оказывается GetTextColor_() в Win8x64 так не работает (а может и в Win7 ?).
Код:
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
LoadFont(0, "impact", 10, #PB_Font_Italic)
Global FontHead=FontID(0)
Procedure LVProc(hwnd, msg, wparam, lparam)
  Protected result, *nmh.NMHDR, *pnmcd.NMCUSTOMDRAW, text$, rc.RECT
  Static Context,*Var,Brush,BrushLight,BrushPressLight
  oldproc = GetProp_(hwnd, "oldproc")
  Select msg
    Case #WM_NCDESTROY
      RemoveProp_(hwnd, "oldproc")
      result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
    Case #WM_NOTIFY
      *nmh = lParam
      Select *nmh\code
        Case #NM_CUSTOMDRAW
          *pnmcd = lParam
          Select *pnmcd\dwDrawStage
            Case #CDDS_PREPAINT
              If Context And *Var
                ReleaseDC_(*Var, Context)
                DeleteObject_(Brush):DeleteObject_(BrushLight):DeleteObject_(BrushPressLight)
              EndIf
              Brush=CreateSolidBrush_($EEE5D8)
              BrushLight=CreateSolidBrush_(GetSysColor_(#COLOR_WINDOW))
              BrushPressLight=CreateSolidBrush_(#Red)
              *Var=*pnmcd\hdr\hwndFrom:Context=GetDC_(*Var)
              SelectObject_(Context, FontHead)
              SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
              result = #CDRF_NOTIFYITEMDRAW
             
            Case #CDDS_ITEMPREPAINT
              text$=GetGadgetItemText(*pnmcd\hdr\idFrom,-1,*pnmcd\dwItemSpec)
              CopyMemory(*pnmcd\rc, rc, SizeOf(RECT))
              DrawText_(*pnmcd\hdc, @text$, Len(text$), rc, #DT_WORDBREAK|#DT_END_ELLIPSIS|#DT_CALCRECT|#DT_NOPREFIX|#DT_END_ELLIPSIS|#DT_CENTER)              
             
              If *pnmcd\uItemState & #CDIS_SELECTED
                DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
                OffsetRect_(*pnmcd\rc,1,1)
                InflateRect_(*pnmcd\rc,-1,-1)
                FillRect_(*pnmcd\hdc, *pnmcd\rc, BrushPressLight)
              Else
                DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
                OffsetRect_(*pnmcd\rc,-1,-1)
                InflateRect_(*pnmcd\rc,-1,-1)
                If GetTextColor_(*pnmcd\hdc)                      ; в Windows 8x64 не работает
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, BrushLight)
                Else
                  FillRect_(*pnmcd\hdc, *pnmcd\rc, Brush)
                EndIf                
              EndIf
 
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_WORDBREAK|#DT_END_ELLIPSIS|#DT_NOPREFIX|#DT_END_ELLIPSIS|#DT_CENTER)
              result = #CDRF_SKIPDEFAULT
          EndSelect
        Default
          result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
      EndSelect
    Default
      result = CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
  EndSelect
 
  ProcedureReturn result
EndProcedure
 
OpenWindow(0,0,0,500,400,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ListIconGadget(0,30,30,300,300,"Стобец 1",100,#PB_ListIcon_GridLines)
SendMessage_(SendMessage_(GadgetID(0),#LVM_GETHEADER,0,0),#WM_SETFONT,FontHead,1)
SetProp_(GadgetID(0),"oldproc",SetWindowLongPtr_(GadgetID(0),#GWL_WNDPROC,@LVProc()))
AddGadgetColumn(0,1,"Столбец 2",98)
AddGadgetColumn(0,2,"Столбец 3",98)
 
header = SendMessage_(GadgetID(0),#LVM_GETHEADER,0,0)
 
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow


Пытался найти замену. Никак. Как всётаки извлеч из контеста инфу о подсветке?
С пасибо.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23


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

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