Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 38

Listicongadget + графика или еще как-то

16.05.2019, 12:35. Показов 3328. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Нужен совет, как можно изобразить что-то подобное на вложенной картинке. Задача такая, чтобы что-то таблицеподобное или спископодобное с наименованием устройств в одном столбце и живим графиком в другом столбце. График обновляется раз в несколько минут. Количество строк несколько сотен. Вопрос - как в icongadget или еще где в каждой строке рисовать/обновлять график? Вид графика любой. Возможность выделять нужную текстовую строку для открытия в другом окне. Спасибо.
Миниатюры
Listicongadget + графика или еще как-то  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2019, 12:35
Ответы с готовыми решениями:

Можно ли создать в Excel новый, свой Тип графика программно или както еще?
Можно ли создать в Excel новый, свой Тип графика программно или как-то еще? Не всегда все можно настроить под себя вот и хотелось бы...

Как вывести на странице сайта новостей или статей или еще чего в строго отведенный элемент (блок)
Ребят, с статическими веб технологиями я знаком достаточно прочно и общаюсь с ними уже практически на Ты. 9 месяцев назад, для меня...

Как из input сделать <div>показать еще</div> или <a>показать еще</a>?
Таким скриптом я подгружаю данные. &lt;script&gt; $(document).ready(function(){ $('#show_more').click(function(){ ...

12
Эксперт по электронике
6202 / 2896 / 311
Регистрация: 28.10.2011
Сообщений: 11,193
Записей в блоге: 6
16.05.2019, 13:00
PureBasic
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
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT 
FontDefault = GetStockObject_(#DEFAULT_GUI_FONT)
 
Procedure DrawProgressBar(*LVCDHeader.NMLVCUSTOMDRAW)
  Shared FontDefault
  Protected rc.RECT, Text.RECT, x, Right
  Protected hMemoryDC, hMemoryDC_1, hBitmap, hBitmap_1
  Protected Gadget, Progress, String.s, brush
  
  rc\left=#LVIR_BOUNDS : rc\top=*LVCDHeader\iSubItem
  SendMessage_(*LVCDHeader\nmcd\hdr\hwndfrom,#LVM_GETSUBITEMRECT,*LVCDHeader\nmcd\dwItemSpec,@rc) 
  Gadget = GetDlgCtrlID_(*LVCDHeader\nmcd\hdr\hwndfrom) 
  Progress = GetGadgetItemData(Gadget, *LVCDHeader\nmcd\dwItemSpec) 
  
  If rc\left>=0 And rc\left < rc\right 
    Right = rc\right 
    brush = CreateSolidBrush_($EE5F02) 
    If brush 
      x=Progress/(100/(rc\right-rc\left)) 
      If rc\right>rc\left+x 
        rc\right=rc\left+x
      Else
        x=rc\right-rc\left
      EndIf 
      FillRect_(*LVCDHeader\nmcd\hdc,@rc,brush) 
      
      rc\right = Right 
      hMemoryDC = CreateCompatibleDC_(*LVCDHeader\nmcd\hdc)
      If hMemoryDC 
        hMemoryDC_1 = CreateCompatibleDC_(*LVCDHeader\nmcd\hdc)
        If hMemoryDC_1
          
          hBitmap_1 = CreateCompatibleBitmap_(*LVCDHeader\nmcd\hdc, rc\right-rc\left, rc\bottom-rc\top)
          If hBitmap_1
            Text\left = 0 : Text\top = 0
            Text\right = Text\left+x : Text\bottom = rc\bottom-rc\top
            SelectObject_(hMemoryDC_1, hBitmap_1)
            FillRect_(hMemoryDC_1,@Text,brush) 
            hBitmap = CreateBitmap_(rc\right-rc\left,rc\bottom-rc\top,1,1,0)
            If hBitmap
              SelectObject_(hMemoryDC, hBitmap)
              SelectObject_(hMemoryDC, FontDefault)
              SetTextColor_(hMemoryDC, $FFFFFF)
              SetBkColor_(hMemoryDC, $0)
              String.s = Str(Progress)+" %" 
              ;Text\left = 0 : Text\top = 0
              Text\right = rc\right-rc\left ;: Text\bottom = rc\bottom-rc\top
              DrawText_(hMemoryDC, String, Len(String), @Text, #DT_CENTER)
              MaskBlt_(hMemoryDC_1, Text\left, Text\top, Text\right-Text\left, Text\bottom-Text\top, hMemoryDC,0, 0, hBitmap, 0, 0 ,#SRCINVERT)
              BitBlt_(*LVCDHeader\nmcd\hdc, rc\left, rc\top, rc\right-rc\left, rc\bottom-rc\top, hMemoryDC_1, 0,0, #SRCINVERT)
              DeleteObject_(hBitmap)
            EndIf
            DeleteObject_(hBitmap_1)  
          EndIf
          DeleteDC_(hMemoryDC_1)
        EndIf
        DeleteDC_(hMemoryDC)
      EndIf
      DeleteObject_(brush) 
    EndIf 
  EndIf 
EndProcedure
 
Procedure WinCallbackproc(hWnd, uMsg, wParam, lParam) 
  Protected result, row, col 
  Protected *pnmh.NMHDR, *LVCDHeader.NMLVCUSTOMDRAW 
  result = #PB_ProcessPureBasicEvents 
  
  Select uMsg 
    Case #WM_NOTIFY 
      *pnmh.NMHDR = lParam 
      Select *pnmh\code 
        Case #NM_CUSTOMDRAW 
          *LVCDHeader.NMLVCUSTOMDRAW = lParam
          row = *LVCDHeader\nmcd\dwItemSpec 
          col = *LVCDHeader\iSubItem 
          If col = 1 
            Select *LVCDHeader\nmcd\dwDrawStage 
              Case #CDDS_PREPAINT 
                result = #CDRF_NOTIFYITEMDRAW 
              Case #CDDS_ITEMPREPAINT 
                result = #CDRF_NOTIFYSUBITEMDRAW 
              Case #CDDS_SUBITEMPREPAINT 
                
                DrawProgressBar(lParam)
                result = #CDRF_SKIPDEFAULT 
            EndSelect
          EndIf  
      EndSelect
      
  EndSelect 
  ProcedureReturn result 
EndProcedure 
 
Procedure UpdateProgress(Gadget, Item, Column, Progress)
  Protected rc.RECT 
  SetGadgetItemData(Gadget, Item, Progress) 
  rc\left=#LVIR_BOUNDS 
  rc\top=Column 
  SendMessage_(GadgetID(Gadget),#LVM_GETSUBITEMRECT,Item,@rc) 
  InvalidateRect_(GadgetID(Gadget), @rc, #True) 
EndProcedure 
 
If OpenWindow(0, 100, 100, 300, 100, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  ListIconGadget(2, 5, 5, 290, 90, "Name", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines) 
  AddGadgetColumn(2, 1, "Progress", 50) 
  AddGadgetColumn(2, 2, "Address", 150) 
  AddGadgetItem(2, -1, "Harry Rannit"+Chr(10)+Chr(10)+"12 Parliament Way, Battle Street, By the Bay") 
  AddGadgetItem(2, -1, "Ginger Brokeit"+Chr(10)+Chr(10)+"130 PureBasic Road, BigTown, CodeCity") 
  
  SetWindowCallback(@WinCallbackproc()) 
  AddWindowTimer(0,0, 100) 
  
  pb1=0 
  pb2=0 
  Repeat 
    Event = WaitWindowEvent() 
    
    If Event = #PB_Event_Timer 
      If EventTimer() = 0 
        pb1+1 
        If pb1>100 : pb1=0 : EndIf 
        UpdateProgress(2, 0, 1, pb1) 
        If pb1&1 
          pb2+1 
          If pb2>100 : pb2=0 : EndIf 
          UpdateProgress(2, 1, 1, pb2) 
        EndIf 
      EndIf 
    EndIf 
    
  Until Event = #PB_Event_CloseWindow 
EndIf
1
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 38
16.05.2019, 19:21  [ТС]
Похоже на то, что надо. Буду разбираться. Спасибо!

Добавлено через 5 часов 52 минуты
Рано порадовался. Опять уперся в то, что не понимаю, как мне создавать график, чтобы он появился в каждой строке. Для каждой строки будет отдельный набор данных в массиве или списке из которых нужно создать график и дополнять его с определенным интервалом. Вот пример графика:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim a(500)
  For i=1 To 500
    a(i)=Random (50,10)
  Next
 
  If OpenWindow(0, 0, 0, 500, 100, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 500, 100) And StartDrawing(ImageOutput(0))
      
      For i=1 To 500
        LineXY(i, 0, i, a(i))
      Next
      StopDrawing() 
      ImageGadget(0, 0, 0, 500, 100, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
0
 Аватар для Pro_grammer
6807 / 2838 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
16.05.2019, 22:39
Цитата Сообщение от spycor Посмотреть сообщение
как мне создавать график, чтобы он появился в каждой строке.
Я бы сам нарисовал то что надо, кода минимально, и любую конфигурацию можно создать.
Например такую
PureBasic
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
Procedure CList(Gdg.i,x,y,w,h,Text1.s,Text2.s, img.l)
       ContainerGadget(#PB_Any,x,y,w,h, #PB_Container_Flat)
       GText1=TextGadget(#PB_Any, 340, 50, 395, 20, Text2, #PB_Text_Center|#SS_CENTERIMAGE)
       GText2=TextGadget(#PB_Any, 90, 5, 220, 65, Text1)
       Gdg1 =  ImageGadget(#PB_Any, 335, 5, 400, 50,0)
       SetGadgetState(Gdg1,ImageID(img ))
       CloseGadgetList()
EndProcedure
 
Dim a(400)
Text1.s = "Цель N"
Text2.s = "График" 
y= 5
 
  If OpenWindow(0, 0, 0, 800, 600, "Графики на 100 значений", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 0,0, 800, 500, 800, 400, 10, #PB_ScrollArea_BorderLess)
  For i = 1 To 100 ; сто записей
    For j=1 To 400
             a(j)=Random (50,10)
    Next
    If CreateImage(i, 400, 50) And StartDrawing(ImageOutput(i))
            For j=1 To 400
              LineXY(j, 0, j, a(j))
            Next
          StopDrawing() 
     EndIf
      CList(i, 5, y, 780, 70, Text1 + Str(i), Text2 , i )
      y+90
    Next
    SetGadgetAttribute(0, #PB_ScrollArea_InnerHeight , 100 * 90 )
 
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
Для копирования можно заменить TextGadget на StringGadget.
Миниатюры
Listicongadget + графика или еще как-то  
1
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 38
17.05.2019, 11:59  [ТС]
Идея хорошая. Смущает нехватка знаний, в том числе и в мелочах, чтобы реализация не выглядела кое-как. Например, как сделать по клику мыши инверсию/выделение строки (или хотя бы текстовой части), а по двойному вызов диалогового окна? Не пойму, почему вместо цвета линии изменяется цвет фона.
PureBasic
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
Procedure CList(Gdg.i,x,y,w,h,Text1.s, img.l)       
       ContainerGadget(#PB_Any,x,y,w,h, #PB_Container_Double)       
       GText2=TextGadget(#PB_Any, 90, 0, 220, 20, Text1)
       Gdg1 =  ImageGadget(#PB_Any, 335, 0, 1400, 20,0)
       SetGadgetState(Gdg1,ImageID(img ))
       CloseGadgetList()
EndProcedure
 
Dim a(1400)
Text1.s = "Цель N"
y= 30
 
  If OpenWindow(0, 0, 0, 800, 600, "Графики на 100 значений", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Maximize)
    ScrollAreaGadget(0, 0,0, WindowWidth(0), WindowHeight(0), 1800, 400, 10, #PB_ScrollArea_BorderLess)
  For i = 1 To 100 ; сто записей
    For j=1 To 1400
      a(j)=Random (20, 5)
    Next
    If CreateImage(i, 1400, 20) And StartDrawing(ImageOutput(i))   
            For j=1 To 1400
              LineXY(j, 0, j, a(j),#Blue)
            Next
          StopDrawing() 
     EndIf
      CList(i,5, y, 1780,20, Text1 + Str(i), i )
      y+20
    Next
    SetGadgetAttribute(0, #PB_ScrollArea_InnerHeight , 100 * 90 )
 
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
0
Эксперт по электронике
6202 / 2896 / 311
Регистрация: 28.10.2011
Сообщений: 11,193
Записей в блоге: 6
17.05.2019, 12:31
Цитата Сообщение от spycor Посмотреть сообщение
Не пойму, почему вместо цвета линии изменяется цвет фона.
Это оптический обман. Достаточно написать For j=1 To 1400 Step 10 и это станет очевидно.

Таблицу с графиками можно на канвасе нарисовать. Пример подобной таблицы, правда без графиков.
Вложения
Тип файла: zip MyGrid_22Nov17.zip (60.0 Кб, 24 просмотров)
1
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 38
17.05.2019, 13:24  [ТС]
Константа отсутствует: #PB_EventType_Resize. Мой PureBasic 5.51 x64.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
15.12.2024, 09:49
Приветствую всех, коллеги ! Вот уже больше четырёх суток не могу исправить казалось бы простую вещь - выровнять элементы ListIconGadget по левому краю. Перерыл разную документацию по структурам, используемым при работе с гаджетом, прошарил все свои архивы с самыми разными примерами обвесов этого гаджета, но так и не нашёл там вариантов решения. Пытался изменять значения полей RECT структуры - всё безрезультатно. Сдвинуто на 4 пикселя, и ни в какую не хочет выравниваться. Помогите, пожалуйста ! Так же, не получается отделить разделительными линиями, которыми разделены все пункты, разделить между собой заголовки, и нет горизонтального разделителя между заголовками и первым (нулевым) элементом.


Код:
PureBasic
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#NM_CUSTOMDRAW = #NM_FIRST - 12
 
#CDDS_ITEM = $10000
#CDDS_SUBITEM = $20000
#CDDS_PREPAINT = $1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM | #CDDS_ITEMPREPAINT
#CDRF_DODEFAULT = $0
#CDRF_NEWFONT = $2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYSUBITEMDRAW = $20
 
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#LVM_GETSUBITEMRECT = #LVM_FIRST + 56
 
Global ListGadget, OldLViewProc, OldEditProc, hEdit, rct.RECT, CellSelectOn, CurItem, CurSubItem, CurSelItem, CurSelSubItem
 
Declare EditProc(hwnd, uMsg, wParam, lParam)
Declare LViewProc(hwnd, uMsg, wParam, lParam)
Declare WndProc(hwnd, uMsg, wParam, lParam)
Declare KillFocus()
Declare DrawRectangle(hwnd, *rc.RECT)
 
#CCM_SETVERSION = #CCM_FIRST + 7
 
Global FontReg, FontBold
FontReg = LoadFont(1, "Tahoma", 9)
FontBold = LoadFont(2, "Tahoma", 9, #PB_Font_Bold)
 
OpenWindow(0, 0, 0, 620, 250, "Example", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) ; | #PB_Window_SizeGadget)
ListGadget = ListIconGadget(1, 10, 10, 600, 220, "Column 1", 100, #PB_ListIcon_GridLines | #PB_ListIcon_HeaderDragDrop | #PB_ListIcon_FullRowSelect | #LVS_NOSORTHEADER)
 
SendMessage_(ListGadget, #CCM_SETVERSION, 5, 0)
;SetGadgetColor(1, #PB_Gadget_LineColor, RGB(100, 100, 100))
 
AddGadgetColumn(1, 1, "Column 2", 100)
AddGadgetColumn(1, 2, "Column 3", 100)
AddGadgetColumn(1, 3, "Column 4", 100)
AddGadgetColumn(1, 4, "Column 5", 100)
AddGadgetColumn(1, 5, "Column 6", 100)
 
; ------------------------------------------------------
; Для центровки текста в ячейках элементов
Center.LV_COLUMN\mask = #LVCF_FMT
Center\fmt = #LVCFMT_CENTER
 
For i = 0 To 10
  ; задаём шрифт в заголовках
  SendMessage_(SendMessage_(ListGadget, #LVM_GETHEADER, 0, 0), #WM_SETFONT, FontBold, 1)
  ; центрируем текст в ячейках элементов
  SendMessage_(ListGadget, #LVM_SETCOLUMN, i, @Center)
Next
; ------------------------------------------------------
 
; цвет линий сетки
SetGadgetColor(1, #PB_Gadget_LineColor, RGB(100, 100, 100))
 
For i = 1 To 5
  AddGadgetItem(1, -1, "Line " + i)
Next
 
; задаём цвет фона гаджета без элементов и заголовков
SendMessage_(ListGadget, #LVM_SETBKCOLOR, 0, 657930)
 
OldLViewProc = SetWindowLong_(ListGadget, #GWL_WNDPROC, @LViewProc())
SetWindowCallback(@WndProc())
 
Repeat
  Event = WindowEvent()
  
Until Event = #PB_Event_CloseWindow
 
Procedure LoWord(value) 
  ProcedureReturn value & $FFFF 
EndProcedure 
 
Procedure HiWord(value) 
  ProcedureReturn value >> 16 & $FFFF 
EndProcedure 
 
Procedure KillFocus()
  If hEdit
    SetGadgetItemText(1, CurItem, GetGadgetText(2), CurSubItem)
    FreeGadget(2)
    hEdit = 0
  EndIf
EndProcedure
 
Procedure DrawRectangle(hwnd, *rc.RECT)
  hDC = GetDC_(hwnd)
  OldPen = SelectObject_(hDC, GetStockObject_(#BLACK_PEN))
  OldBrush = SelectObject_(hDC, GetStockObject_(#NULL_BRUSH))
  Rectangle_(hDC, *rc\left, *rc\top, *rc\right, *rc\bottom)
  SelectObject_(hDC, OldBrush)
  SelectObject_(hDC, OldPen)
  ReleaseDC_(hwnd, hDC)
EndProcedure
 
Procedure EditProc(hwnd, uMsg, wParam, lParam)
  result = 0
  Select uMsg
    Case #WM_KEYDOWN
      result = CallWindowProc_(OldEditProc, hwnd, uMsg, wParam, lParam)
      If wParam = #VK_RETURN
        KillFocus()
      EndIf
    Default
      result = CallWindowProc_(OldEditProc, hwnd, uMsg, wParam, lParam)
  EndSelect
  ProcedureReturn result
EndProcedure
 
Procedure LViewProc(hwnd, uMsg, wParam, lParam)
  result = 0
  Select uMsg
    Case #WM_LBUTTONDBLCLK
      If hwnd <> hEdit
        KillFocus()
        pInfo.LVHITTESTINFO
        pInfo\pt\x = LoWord(lParam)
        pInfo\pt\y = HiWord(lParam)
        SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, pInfo)
        rc.RECT
        rc\top = pInfo\iSubItem
        rc\left = #LVIR_BOUNDS
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, pInfo\iItem, rc)
        If hEdit = 0
          UseGadgetList(hwnd)
          CurItem = pInfo\iItem
          CurSubItem = pInfo\iSubItem
          ; правая граница рамки при двойном клике по ячейке
          rc\right = rc\left + SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, CurSelSubItem, CurItem) - 1
          Text$ = GetGadgetItemText(1, CurItem, CurSubItem)
          If CurSubItem = 0
            rc\right = rc\left + SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, 0, 0) - 1
          EndIf 
          hEdit = StringGadget(2, rc\left, rc\top, rc\right - rc\left, rc\bottom - rc\top - 1, Text$)
          If CurSubItem = 0
            SendMessage_(hEdit, #WM_SETFONT, FontBold, #True)
          Else
            SendMessage_(hEdit, #WM_SETFONT, FontReg, #True)
          EndIf
          OldEditProc = SetWindowLong_(hEdit, #GWL_WNDPROC, @EditProc())
          SetFocus_(hEdit)
        EndIf
      Else
        result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
      EndIf
    Case #WM_LBUTTONDOWN
      If hwnd <> hEdit
        KillFocus()
        pInfo.LVHITTESTINFO
        pInfo\pt\x = LoWord(lParam)
        pInfo\pt\y = HiWord(lParam)
        SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, pInfo)
        rc.RECT
        rc\top = pInfo\iSubItem
        rc\left = #LVIR_BOUNDS
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, pInfo\iItem, rc)
        ;rc\left + 1
        rc\bottom - 1
        If CellSelectOn
          InvalidateRect_(hwnd, rct, #True)
        EndIf
        CellSelectOn = 1
        CurSelItem = pInfo\iItem
        CurSelSubItem = pInfo\iSubItem
        ; правая граница рамки при выборе ячейки
        rc\right = rc\left + SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, CurSelSubItem, CurItem) - 1
        If CurSelSubItem = 0
          rc\right = rc\left + SendMessage_(hwnd, #LVM_GETCOLUMNWIDTH, 0, 0) - 1
        EndIf
        DrawRectangle(hwnd, rc)
        CopyMemory(rc, rct, SizeOf(RECT))
      Else
        SetFocus_(hEdit)
        result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
      EndIf
    Case #WM_CTLCOLOREDIT
      If GetFocus_() = lParam
        SetBkMode_(wParam, #TRANSPARENT)
        If CurItem & 1 = 0
          TextBkColor = #White
        Else
          TextBkColor = #White
        EndIf
        SetTextColor_(wParam, TextColor)
        result = CreateSolidBrush_(TextBkColor)
      Else
        result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
      EndIf
    Case #WM_VSCROLL
      result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
      rc.RECT
      TopVisibleItem = SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
      If CellSelectOn
        rc\top = CurSelSubItem
        rc\left = #LVIR_BOUNDS
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, CurSelItem, rc)
        rct\top = rc\top
        rct\bottom = rc\bottom - 1
        If TopVisibleItem <= CurSelItem
          DrawRectangle(hwnd, rct)
        EndIf
      EndIf
      If hEdit
        If TopVisibleItem <= CurItem
          ResizeGadget(2, #PB_Ignore, rc\top, #PB_Ignore, #PB_Ignore)
          HideGadget(2, #False)
          RedrawWindow_(hEdit, 0, 0, #RDW_INTERNALPAINT | #RDW_ERASE | #RDW_INVALIDATE)
        Else
          HideGadget(2, #True)
        EndIf
        SetFocus_(hEdit)
      EndIf
    Case #WM_HSCROLL
      result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
      rc.RECT
      TopVisibleItem = SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
      If CellSelectOn
        rc\top = CurSelSubItem
        rc\left = #LVIR_BOUNDS
        SendMessage_(hwnd, #LVM_GETSUBITEMRECT, CurSelItem, rc)
        rct\left = rc\left + 1
        rct\right = rc\right
        If TopVisibleItem <= CurSelItem
          DrawRectangle(hwnd, rct)
        EndIf
      EndIf
      If hEdit
        If TopVisibleItem <= CurItem
          ResizeGadget(2, rc\left, #PB_Ignore, #PB_Ignore, #PB_Ignore)
          HideGadget(2, #False)
          RedrawWindow_(hEdit, 0, 0, #RDW_INTERNALPAINT | #RDW_ERASE | #RDW_INVALIDATE)
        Else
          HideGadget(2, #True)
        EndIf
        SetFocus_(hEdit)
      EndIf
    Default
      result = CallWindowProc_(OldLViewProc, hwnd, uMsg, wParam, lParam)
  EndSelect
  ProcedureReturn result
EndProcedure
 
Procedure WndProc(hwnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lParam
      Select *pnmh\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam
          If *LVCDHeader\nmcd\hdr\hWndFrom = ListGadget
            Select *LVCDHeader\nmcd\dwDrawStage
              Case #CDDS_PREPAINT
                
              Case #CDDS_ITEMPREPAINT
                result = #CDRF_NOTIFYITEMDRAW
              Case #CDDS_SUBITEMPREPAINT
                Row = *LVCDHeader\nmcd\dwItemSpec ; номер строки перерисовки
                Col = *LVCDHeader\iSubItem        ; номер столбца перерисовки
                If Col = 0
                  SelectObject_(*LVCDHeader\nmcd\hDC, FontBold)
                Else
                  SelectObject_(*LVCDHeader\nmcd\hDC, FontReg)
                EndIf
                If Row & 1 = 0
                  *LVCDHeader\clrTextBk = RGB(228, 230, 204)
                  If Col = 9 And ValD(StringField(GetGadgetItemText(1, Row, 9), 1, " $")) > 0
                    *LVCDHeader\clrText = RGB(47, 145, 30)
                  ElseIf Col = 9 And ValD(StringField(GetGadgetItemText(1, Row, 9), 1, " $")) < 0
                    *LVCDHeader\clrText = RGB(210, 0, 0)
                  EndIf
                Else
                  *LVCDHeader\clrTextBk = RGB(255, 255, 223)
                  If Col = 9 And ValD(StringField(GetGadgetItemText(1, Row, 9), 1, " $")) > 0
                    *LVCDHeader\clrText = RGB(47, 145, 30)
                  ElseIf Col = 9 And ValD(StringField(GetGadgetItemText(1, Row, 9), 1, " $")) < 0
                    *LVCDHeader\clrText = RGB(210, 0, 0)
                  EndIf
                EndIf
                result = #CDRF_NEWFONT
            EndSelect
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn result
EndProcedure
Миниатюры
Listicongadget + графика или еще как-то  
0
Эксперт по электронике
6202 / 2896 / 311
Регистрация: 28.10.2011
Сообщений: 11,193
Записей в блоге: 6
15.12.2024, 13:04
Цитата Сообщение от antro735 Посмотреть сообщение
двинуто на 4 пикселя, и ни в какую не хочет выравниваться.
Нужно
PureBasic
1
Center\fmt = #LVCFMT_CENTER
Заменить на
PureBasic
1
Center\fmt = #LVCFMT_LEFT
В коде же по русски написано что производится центровка.
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
15.12.2024, 13:56
Цитата Сообщение от locm Посмотреть сообщение
В коде же по русски написано что производится центровка.
Это не то. Это центровка текста в столбцах. Тут не текст выровнять надо, а элементы (строки) отрисовать на 4 пикселя левее, чтобы не было лишнего чёрного зазора между левым краем и элементами. Я на скриншоте стрелкой указал. Вернее даже только первый (нулевой) пункт в элементах (строках) расширить на 4 пикселя влево.
0
60 / 58 / 3
Регистрация: 06.11.2010
Сообщений: 183
Записей в блоге: 1
16.12.2024, 11:17
Попробовал применить отступ, не получилось. Погугли, может есть примеры.
PureBasic
1
2
3
4
5
lvitem.LVITEM
lvitem\mask = #LVIF_INDENT
lvitem\iItem = 1
lvitem\iIndent = 0
SendMessage_(ListGadget, #LVM_SETITEM, 0, @lvitem)
Ещё есть рабочее пространство. Но тоже не влияет тем более для нарисованных пунктов.
PureBasic
1
2
3
4
5
6
Rect.RECT
Rect\left = 30
Rect\top = 55
Rect\right = 555
Rect\bottom = 255
SendMessage_(ListGadget, #LVM_SETWORKAREAS, 1, @Rect)
0
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
16.12.2024, 14:03
Цитата Сообщение от AZJIO Посмотреть сообщение
Погугли, может есть примеры.
Я перегуглил уже всё что можно. Реального решения нигде не нашёл. Придётся, наверное, углубиться в документацию SDK
0
60 / 58 / 3
Регистрация: 06.11.2010
Сообщений: 183
Записей в блоге: 1
17.12.2024, 15:44
Я попробовал пример из FindAllReferences и также ничего не работает. Единственный вариант сделать первую колонку шириной 0, тем самым скрыть её.

PureBasic
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
Global BackColor = $3f3f3f
Global ForeColor = $cccccc
Global BackColorHeader = $552222
Global ForeColorHeader = $72ADC0
Global BorderColor = $888888
Global HightLightBrush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
; Global HightLightBrush = CreateSolidBrush_($423926)
Global BackColorBrush = CreateSolidBrush_(BackColor)
Global BackColorBrushHeader = CreateSolidBrush_(BackColorHeader)
Global frmMain_References, hHeader
 
Global ListGadget
 
Declare Callback_Win(hwnd, msg, wParam, lParam)
Declare Callback_Header(hWnd, Message, wParam, lParam)
 
Procedure SetGadgetBorderless(Gadget)
    Protected hGad = GadgetID(Gadget)
    SetWindowLongPtr_(hGad, #GWL_EXSTYLE, GetWindowLongPtr_(hGad, #GWL_EXSTYLE) & (~#WS_EX_CLIENTEDGE))
    ProcedureReturn SetWindowPos_(hGad, 0, 0, 0, 0, 0, #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
EndProcedure
 
#CCM_SETVERSION = #CCM_FIRST + 7
 
#LIG = 1
;- GUI
OpenWindow(0, 0, 0, 620, 250, "Example", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) ; | #PB_Window_SizeGadget)
ListGadget = ListIconGadget(#LIG, 10, 10, 600, 220, "Column 1", 0, 
                            #PB_ListIcon_GridLines | #PB_ListIcon_HeaderDragDrop | #PB_ListIcon_FullRowSelect | #LVS_NOSORTHEADER)
frmMain_References = SetWindowLongPtr_(GadgetID(#LIG), #GWL_WNDPROC, @Callback_Header())
hHeader = SendMessage_(GadgetID(#LIG), #LVM_GETHEADER, 0, 0)
        SetGadgetColor(#LIG, #PB_Gadget_BackColor, BackColorHeader)
        SetGadgetColor(#LIG, #PB_Gadget_FrontColor, ForeColor)
        SetGadgetBorderless(#LIG)  ; by me
 
; SendMessage_(ListGadget, #CCM_SETVERSION, 5, 0)
;SetGadgetColor(1, #PB_Gadget_LineColor, RGB(100, 100, 100))
;- AddGadgetColumn
AddGadgetColumn(#LIG, 1, "Column 2", 100)
AddGadgetColumn(#LIG, 2, "Column 3", 100)
AddGadgetColumn(#LIG, 3, "Column 4", 100)
AddGadgetColumn(#LIG, 4, "Column 5", 100)
AddGadgetColumn(#LIG, 5, "Column 6", 100)
 
; ------------------------------------------------------
; Для центровки текста в ячейках элементов
; Center.LV_COLUMN\mask = #LVCF_FMT
; Center\fmt = #LVCFMT_CENTER
;  
; For i = 0 To 10
;   ; задаём шрифт в заголовках
;   SendMessage_(SendMessage_(ListGadget, #LVM_GETHEADER, 0, 0), #WM_SETFONT, FontBold, 1)
;   ; центрируем текст в ячейках элементов
;   SendMessage_(ListGadget, #LVM_SETCOLUMN, i, @Center)
; Next
; ------------------------------------------------------
 
; цвет линий сетки
; SetGadgetColor(1, #PB_Gadget_LineColor, RGB(100, 100, 100))
;- AddGadgetItem
 
 
; Procedure ListIcon_AddItem(gadget, text.s)
;   itm.LVITEM\mask = #LVIF_TEXT | #LVIF_INDENT
;   itm\pszText = @text
;   itm\iIndent = 22
;   SendMessage_ (GadgetID(gadget), #LVM_INSERTITEM, 0, @itm)
; EndProcedure
 
 
For i = 1 To 5
;   ListIcon_AddItem(#LIG, "Line " + i)
  AddGadgetItem(#LIG, -1, "Line " + i + Chr(10) + "Line " + i+ Chr(10) + "Line " + i+ Chr(10) + "Line " + i+ Chr(10) + "Line " + i+ Chr(10) + "Line " + i)
Next
 
; задаём цвет фона гаджета без элементов и заголовков
SendMessage_(ListGadget, #LVM_SETBKCOLOR, 0, 657930)
 
SetWindowCallback(@Callback_Win())
 
;- Loop
Repeat
  Event = WindowEvent()
  
Until Event = #PB_Event_CloseWindow
 
 
 
Procedure Callback_Win(hwnd, msg, wParam, lParam)
    Protected Result, *nmhdr.NMHDR, *lvCD.NMLVCUSTOMDRAW, subItemRect.RECT, *DrawItem.DRAWITEMSTRUCT, Buffer.s
    Protected *pnmcd.NMCUSTOMDRAW, hdi.hd_item
    Protected thisRow, thisCol, idx
    Protected t$, text$
    Protected nNotifyCode
    Protected *NMITEM.NMITEMACTIVATE
    Protected SelectedLine
 
    Result = #PB_ProcessPureBasicEvents
    ;;Dim LVColor(0)
 
    Select msg
;- WM_NCDESTROY
        Case #WM_NCDESTROY
            DeleteObject_(HightLightBrush)
            DeleteObject_(BackColorBrush)
            DeleteObject_(BackColorBrushHeader)
 
;- WM_NOTIFY
        Case #WM_NOTIFY
            *nmhdr.NMHDR = lParam
            *lvCD.NMLVCUSTOMDRAW = lParam
            *NMITEM.NMITEMACTIVATE = lParam
 
 
;           If *nmhdr\code = #NM_CLICK
;               If *NMITEM\iItem <> -1
;                   SelectedLine = Val(GetGadgetItemText(#LIG, *NMITEM\iItem, 0))
;                   If SelectedLine > 0
;                       Debug SelectedLine
;                   EndIf
;               EndIf
;           EndIf
            If *lvCD\nmcd\hdr\hwndFrom = GadgetID(#LIG) 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
                        If thisCol
                            ;... Define rect for text
                            subItemRect.RECT\left = #LVIR_LABEL
                            subItemRect.RECT\top = *lvCD\iSubItem
                            ;... Get the subitem rect
                            SendMessage_(GadgetID(#LIG), #LVM_GETSUBITEMRECT, thisRow, @subItemRect)
 
                            text$ = GetGadgetItemText(#LIG, thisRow, thisCol)
 
                            If GetGadgetState(#LIG) = thisRow
                                ;... If item is selected
                                FillRect_(*lvCD\nmcd\hdc, subItemRect, HightLightBrush)
                                ;               Colors(1) = GetSysColor_(#COLOR_HIGHLIGHTTEXT)  ; the default text
                            Else
                                ;... If item is not selected
                                FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrushHeader)
                                ;               Colors(1) = GetSysColor_(#COLOR_WINDOWTEXT)  ; the default text
                            EndIf
                            InflateRect_(subItemRect, -8, 0)
 
                                If Asc(text$)
                                    SetTextColor_(*lvCD\nmcd\hdc, $80FFFF)
                                    SetBkColor_(*lvCD\nmcd\hdc, $3f3f3f)
                                    DrawText_(*lvCD\nmcd\hdc, text$, -1, subItemRect, #DT_END_ELLIPSIS | #DT_VCENTER | #DT_SINGLELINE)
                                EndIf
                            Result = #CDRF_SKIPDEFAULT
                        Else
                            Result = #CDRF_DODEFAULT
                        EndIf
                EndSelect
            EndIf
 
 
;- WM_DRAWITEM
        Case #WM_DRAWITEM
            *DrawItem.DRAWITEMSTRUCT = lParam
            If *DrawItem\CtlType = #ODT_COMBOBOX
                If IsGadget(wParam)
                    If *DrawItem\itemID <> -1
                        If *DrawItem\itemstate & #ODS_SELECTED
                            FillRect_(*DrawItem\hDC, *DrawItem\rcitem, HightLightBrush)
                        Else
                            FillRect_(*DrawItem\hDC, *DrawItem\rcitem, BackColorBrush)
                        EndIf
                        SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
                        SetTextColor_(*DrawItem\hDC, ForeColor)
                        Text$ = GetGadgetItemText(*DrawItem\CtlID, *DrawItem\itemID)
                        *DrawItem\rcItem\left + DesktopScaledX(4)
                        DrawText_(*DrawItem\hDC, Text$, Len(Text$), *DrawItem\rcItem, #DT_LEFT | #DT_SINGLELINE | #DT_VCENTER)
                    EndIf
                EndIf
            EndIf
    EndSelect
    ProcedureReturn Result
EndProcedure
 
 
 
Procedure Callback_Header(hWnd, Message, wParam, lParam)
    Protected *Header.HD_NOTIFY, SelectedLine, *lvCD.NMLVCUSTOMDRAW
    Protected *nmhdr.NMHDR, text$, *pnmcd.NMCUSTOMDRAW, hdi.hd_item
    Protected rc2.RECT, hDC
    Protected Result = CallWindowProc_(frmMain_References, hWnd, Message, wParam, lParam)
 
 
    *Header = lParam
    *nmhdr = lParam
    *lvCD = lParam
    Select Message
        Case #WM_NOTIFY
            Select *Header\hdr\code
                Case #HDN_ITEMCLICK
                    If *Header\hdr\code = #HDN_ITEMCLICK
                        ;ColumnClicked=*Header\iItem
                        SelectedLine = Val(GetGadgetItemText(#LIG, -1, 0))
                        If SelectedLine > 0
                            Debug SelectedLine
                        EndIf
                    EndIf
                Case #NM_CUSTOMDRAW
                    If *nmhdr\hwndFrom = hHeader
                        *pnmcd.NMCUSTOMDRAW = lParam
                        Select *pnmcd\dwDrawStage
                            Case #CDDS_PREPAINT
                                result = #CDRF_NOTIFYITEMDRAW
                            Case #CDDS_ITEMPREPAINT
                                text$ = GetGadgetItemText(GetDlgCtrlID_(hWnd), -1, *pnmcd\dwItemSpec)
                                hdi\mask = #HDI_TEXT
                                hdi\psztext = @text$
                                hdi\cchtextmax = Len(text$)
                                SetBkMode_(*pnmcd\hdc, #TRANSPARENT)
                                FillRect_(*pnmcd\hdc, *pnmcd\rc, BackColorBrushHeader)
;                               сдвигаем текст после закрашивания прямоуголников
                                If *lvCD\nmcd\dwItemSpec
                                    InflateRect_(*pnmcd\rc, -8, 0)
                                Else
                                    InflateRect_(*pnmcd\rc, -4, 0)
                                EndIf
                                SetTextColor_(*pnmcd\hdc, ForeColorHeader)
                                DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_VCENTER | #DT_END_ELLIPSIS)
                                result = #CDRF_SKIPDEFAULT
                        EndSelect
                    EndIf
            EndSelect
    EndSelect
    ProcedureReturn Result
EndProcedure
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2024, 15:44
Помогаю со студенческими работами здесь

Как ограничить повторные действия пользователя (через сессию, IP или еще как-то)?
Разрабатываю веб-сервис, который будет предоставлять платные услуги. Т.к. детали раскрыть нет возможности, то условно будем считать что...

Как кидать картинки между приложениями с помощью winsock или ещё как-нибудь!!!
Как кидать картинки между приложениями с помощью winsock или ещё как-нибудь!!! Текст получается , а вот картинки нет. Как с файла...

MVVM приложение. Как правильно реализовать - обработка исключений, DependencyObject, или ещё как-то?
Всем привет, пишу WPF MVVM приложение. Возникла следующая проблема. Короче заполняется паспорт, где вводятся значения в TextBoxы,...

Переименование файла bat или еще как
Доброго дня, в последнее время по работе стали приходить Ехсель таблицы, почему браузеры при сохранение меняют расширение с...

Opera vs XML или как ещё понять?
Всем привет опять я. Тест XSL/XML показал, что Opera не хочет нормально работать. Почему в других бразерсах нормально ниже приведеный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »