Subversion Repositories Kolibri OS

Rev

Rev 1432 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1032 Lrz 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;Basic macros for use editbox                             ;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
 
1228 Lrz 5
macro init_editbox
6
{
7
pushad
8
	mcall
9
 
10
popad
11
}
12
 
13
 
14
macro use_editbox_draw
15
{
16
edit_box:
1032 Lrz 17
.draw:
18
        pushad
19
;--- рисуем рамку ---
20
        mov     edi,dword [esp+36]
21
        call    .draw_border            ; Функция стабильна
22
.draw_bg_cursor_text:
23
;--- изменяем смещение, если надо ---
24
        call    .check_offset           ;вычисление позиции курсора стабильна
25
;--- рисуем внутреннюю область ---
26
        call    .draw_bg                ;нарисовать прямоугольник рабочей области
27
;---- рисуем выделение, по shift если есть
28
        call    .draw_shift
29
.draw_cursor_text:
30
;--- рисуем курсор ---
31
        ;--- может его не надо рисовать ----
32
        test    word ed_flags,ed_focus
1214 Lrz 33
        jz     	@f
1032 Lrz 34
        call    .draw_cursor
35
@@:
36
        call    .draw_text
37
;        ret
38
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39
;Общий выход из editbox для всех функций и пост обработчиков;;
40
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41
.editbox_exit:
42
        popad
43
        ret 4
44
}
45
 
46
 
47
macro use_editbox_key
48
{
49
;==========================================================
50
;=== обработка клавиатуры =================================
51
;==========================================================
52
edit_box_key:
53
pushad
54
        mov     edi,dword [esp+36]
55
        test    word ed_flags,ed_focus ; если не в фокусе, выходим
56
        je      edit_box.editbox_exit
57
        test    word ed_flags,ed_mouse_on
58
        jne     edit_box.editbox_exit
59
 
60
;Проверка нажат shift ?
61
        call    edit_box_key.check_shift
62
;----------------------------------------------------------
63
;--- проверяем, что нажато --------------------------------
64
;----------------------------------------------------------
65
use_key_process  backspase,delete,left,right,home,end,insert
66
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
67
;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
68
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
69
use_key_no_process   up,down,esc,enter,tab,numl,capsl,scrolll
70
;--- нажата другая клавиша ---
71
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72
;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос
73
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74
use_key_figures_only
75
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76
;проверка на shift был ли нажат
77
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78
are_key_shift_press
79
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80
; проверяем, находится ли курсор в конце + дальнейшая обработка
81
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82
are_key_cur_end
83
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
84
;Обработка клавиш insert,delete.backspase,home,end,left,right
85
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
86
use_work_key
87
}
88
 
89
macro use_editbox_mouse
90
{
91
;==========================================================
92
;=== обработка мыши =======================================
93
;==========================================================
94
;save for stdcall ebx,esi,edi,ebp
95
edit_box_mouse:
96
pushad
97
        mov     edi,dword [esp+36]
98
;debug
99
;----------------------------------------------------------
100
;--- получаем состояние кнопок мыши -----------------------
101
;----------------------------------------------------------
102
        mcall   37,2
103
;----------------------------------------------------------
104
;--- проверяем состояние ----------------------------------
105
;----------------------------------------------------------
106
        test    eax,1
107
        jnz     edit_box_mouse.mouse_left_button
108
        and     word ed_flags,ed_mouse_on_off
1214 Lrz 109
	mov	ebx,dword ed_mouse_variable
110
	push	0
111
	pop	dword [ebx]
112
;        mov     dword [ebx],ebx
1032 Lrz 113
        jmp     edit_box.editbox_exit
114
.mouse_left_button:
115
;----------------------------------------------------------
116
;--- блокировка от фокусировки в других боксах при попадании на них курсора
117
;----------------------------------------------------------
1214 Lrz 118
        mov     eax,dword ed_mouse_variable
119
	push	dword [eax]
120
	pop	eax
1032 Lrz 121
        test    eax,eax
122
        jz      @f
123
        cmp     eax,edi
124
        je      @f
125
        jmp     edit_box_mouse._blur
126
;----------------------------------------------------------
127
;--- получаем координаты мыши относительно 0 т.е всей области экрана
128
;----------------------------------------------------------
129
@@:     mcall   37,1
130
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
131
;Функция обработки  мышки получение координат и проверка их + выделения
132
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133
use_work_mouse
134
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135
;Общие функции обработки
136
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137
use_general_func
138
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139
;Функции для работы с key
140
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141
use_key_func
142
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
143
;Функции для работы с mouse
144
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
145
use_mouse_func
146
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147
;Bit mask from editbox
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
macro use_general_func
178
{
179
;debug_func
180
;----------------------------------------------------------
181
;--- процедура прорисовки выделеной части -----------------
182
;----------------------------------------------------------
183
edit_box.draw_shift:
184
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
185
        jz      @f
186
        mov     ebp,shift_color
187
        mov     ebx,dword       ed_shift_pos
188
        call    edit_box_key.sh_cl_
189
@@:     ret
190
;----------------------------------------------------------
191
;--- процедура прорисовки текста --------------------------
192
;----------------------------------------------------------
193
edit_box.draw_text:
194
;--- вычисляем, сколько помещается символов ---
195
;--- чтобы мусор не рисовать ---
196
        call    edit_box.get_n
197
        mov     esi,ed_size
198
        mov     ebx,ed_offset
199
        sub     esi,ebx
200
        cmp     eax,esi
201
        jae     @F
202
        mov     esi,eax         ;чтобы не выходить за пределы экрана
203
;--- рисуем текст ---
204
@@:     mov     eax,4
205
        mov     ebx,ed_left
206
        mov     edx,ed_offset
207
        add     ebx,2
208
        shl     ebx,16
209
        add     ebx,ed_top
210
        mov     ecx,ed_text_color
211
        add     ebx,4
212
        add     edx,ed_text
213
        mcall
214
ret
215
;----------------------------------------------------------
216
;--- процедура прорисовки фона ----------------------------
217
;входные данные
218
;eax
219
;edx - color
220
;----------------------------------------------------------
221
;вход только цвет edx
222
edit_box.draw_bg:
223
        mov     ebx,ed_left
224
        add     ebx,1
225
        mov     edx,ed_color
226
        shl     ebx,16
227
        add     ebx,ed_width
228
        sub     ebx,1
229
edit_box.draw_bg_eax:
230
        mov     ecx,ed_top
231
        mov     eax,13
232
        add     ecx,1
233
        shl     ecx,16
234
        add     ecx,ed_height
235
        dec     ecx
236
        mcall
237
ret
238
;----------------------------------------------------------
239
;--- процедура получения количества символов в текущей щирине компонента
240
;----------------------------------------------------------
241
edit_box.get_n:
242
        mov     eax,ed_width    ;получем ширину компонента
243
        xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
244
        sub     eax,4           ;вычтим 4
245
        mov     ebx,6           ;загрузми делитель
246
        div     ebx             ;размделим на 6
247
ret
248
;----------------------------------------------------------
249
;--- процедура рисования курсора --------------------------
250
;----------------------------------------------------------
251
;входные ebp- цвет
252
edit_box.clear_cursor:
253
        mov     edx,ebp
254
        mov     ebx,cl_curs_x
255
        mov     ecx,cl_curs_y
256
        jmp     edit_box.draw_curs
257
edit_box.draw_cursor:
258
        mov     edx,ed_text_color
259
        mov     ebx,ed_pos
260
        mov     ecx,ed_offset
261
        sub     ebx,ecx
262
 
263
        lea     ebx,[ebx*2+ebx]
264
        shl     ebx,1
265
        ;imul   ebx,6
266
        add     ebx,ed_left
267
        mov     ecx,ed_top
268
        inc     ebx
269
        add     ecx,2
270
        mov     ebp,ebx
271
        shl     ebx,16
272
        mov     bx,bp
273
        mov     ebp,ecx
274
 
275
        shl     ecx,16
276
        mov     cx,bp
277
        add     ecx,ed_height-4
278
 
279
        mov     cl_curs_x,ebx
280
        mov     cl_curs_y,ecx
281
edit_box.draw_curs:
282
        mcall   38
283
ret
284
;----------------------------------------------------------
285
;--- процедура рисования рамки ----------------------------
286
;----------------------------------------------------------
287
edit_box.draw_border:
288
;--- цвет рамки ---
289
        test    word ed_flags,ed_focus
290
        mov     edx,ed_focus_border_color
291
        jne     @f
292
        mov     edx,ed_blur_border_color
293
@@:
294
;--- сверху ---
295
        mov     eax,38
296
        mov     ebx,ed_left
297
        mov     ecx,ebx
298
        shl     ebx,16
299
        mov     bx,cx
300
        add     ebx,ed_width
301
        mov     ecx,ed_top
302
        mov     esi,ecx
303
        shl     ecx,16
304
        mov     cx,si
305
        mcall
306
;--- снизу ---
307
        mov     esi,ecx
308
        add     ecx,ed_height
309
        mov     ebp,ecx
310
        shl     ecx,16
311
        mov     cx,bp
312
        mcall
313
;--- слева ---
314
        mov     cx,si
315
        mov     ebp,ebx
316
        sub     ebx,ed_width
317
        mcall
318
;--- справа ---
319
        mov     ebx,ebp
320
        shl     ebx,16
321
        mov     bx,bp
322
        mcall
323
ret
324
;----------------------------------------------------------
325
;--- проверка, зашел ли курсор за границы и, если надо, ---
326
;--- изменяем смещение ------------------------------------
327
;--- если смещение было установка флага ed_offset_cl иначе
328
; если ничего не изменилось то выставление ed_offset_fl
329
; в общей битовой маррице состояния компонентов word ed_flags
330
;----------------------------------------------------------
331
edit_box.check_offset:
332
pushad
333
        mov     ecx,ed_pos
334
        mov     ebx,ed_offset
335
        cmp     ebx,ecx
336
        ja      edit_box.sub_8
337
 
338
        push    ebx
339
        call    edit_box.get_n                  ;получим кол-во символов в паре регистров edx:eax
340
        pop     ebx
341
        mov     edx,ebx
342
        add     edx,eax         ;ed_offset+width editbox
343
        inc     edx             ;необходимо для номального положения курсора в крайней левой позиции
344
        cmp     edx,ecx
345
        ja      @f
346
 
347
        mov     edx,ed_size
348
        cmp     edx,ecx
349
        je      edit_box.add_end
350
 
351
        sub     edx,ecx
352
        cmp     edx,8
353
        jbe     edit_box.add_8
354
        add     ebx,8
355
        jmp     edit_box.chk_d
356
 
1216 Lrz 357
edit_box.sub_8:
358
	cmp     ecx,0
1032 Lrz 359
        je      edit_box.sub_min
360
        cmp     ebx,8
361
        jbe     edit_box.sub_min
362
        sub     ebx,8   ;ebx=ed_offset
363
        jmp     edit_box.chk_d
364
edit_box.sub_min:
365
        xor     ebx,ebx
366
        jmp     edit_box.chk_d
367
 
368
edit_box.add_end:sub    edx,eax
369
        mov     ebx,edx
370
        jmp     edit_box.chk_d
371
edit_box.add_8: add     ebx,edx
372
edit_box.chk_d: mov     ed_offset,ebx
373
        call    edit_box.draw_bg
374
        and     word ed_flags,ed_offset_cl
375
edit_ex
376
@@:
377
        or      word ed_flags,ed_offset_fl
378
edit_ex
379
}
380
 
381
macro use_key_func
382
{
383
;Обработка Shift для снятия выделения неизвестной области
384
edit_box_key.shift: ;;;;;;;SHIFT
385
        test    word ed_flags,ed_shift
386
        je      edit_box_key.f_exit
387
 
388
@@:     mov     ebp,shift_color
389
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
390
        mov     ebx,dword       ed_shift_pos
391
        call    edit_box_key.sh_cl_
392
        jmp     edit_box.draw_cursor_text
393
;;;;;;;;;;;;;;;;;;;;;
394
edit_box_key.f_exit:    call   edit_box.check_offset
395
        and     word ed_flags,ed_shift_cl
396
        call    edit_box_key.enable_null
397
        jmp     edit_box.draw_cursor_text
398
edit_box_key.sh_cl_:
399
;;;;;;SHIFT end
400
;обработка очистки, при левом - правом движении выделения
401
;для обработки снятия выделения
402
;входные параметры ebp=color ebx=ed_shift_pos
403
        mov     eax,dword       ed_pos
404
        cmp     eax,ebx
405
 
406
        jae     edit_box_key.sh_n
407
        push    eax  ;меньшее в eax
408
        push    ebx  ;большее
409
        jmp     edit_box_key.sh_n1
410
                     ;если иначе
1214 Lrz 411
edit_box_key.sh_n:
412
	push    ebx
1032 Lrz 413
        push    eax
414
edit_box_key.sh_n1:
415
        call    edit_box.check_offset
416
        call    edit_box.get_n
417
        mov     edx,eax ;size of ed_box
418
        mov     ecx,ed_offset
419
        add     eax,ecx ;eax = w_off= ed_offset+width
420
        mov     edx,eax ;save
421
        pop     ebx     ;большее
422
        pop     eax     ;меньшее
423
 
424
        cmp     eax,ecx         ;сравнение с меньшего с offset.
425
        jae     edit_box_key.f_f            ;если больше
426
        xor     eax,eax
427
        cmp     edx,ebx         ;cравним размер w_off с большим
428
        jb      @f
429
        sub     ebx,ecx
430
        jmp     edit_box_key.nxt_f
431
@@:     mov     ebx,edx
432
        sub     ebx,ecx
433
        jmp     edit_box_key.nxt_f
434
edit_box_key.f_f:
435
        sub     eax,ecx
436
        cmp     edx,ebx         ;cравним размер w_off с большим
437
        jle     @f
438
        sub     ebx,ecx
439
        sub     ebx,eax
440
        jmp     edit_box_key.nxt_f
441
@@:
442
        mov     ebx,edx
443
        sub     ebx,ecx
444
        sub     ebx,eax
445
edit_box_key.nxt_f:
446
        mov     edx,ebx
447
        lea     ebx,[eax*2+eax]
448
        shl     ebx,1
449
        add     ebx,ed_left
450
        inc     ebx
451
        shl     ebx,16
452
        lea     ecx,[edx*2+edx]
453
        shl     ecx,1
454
        mov     bx,cx
455
        inc     ebx
456
        mov     edx,ebp;shift_color
457
 
458
        call    edit_box.draw_bg_eax
459
@@:     call    edit_box_key.enable_null
460
        ret
461
;;;;;;;;;;;;;;;;;;;;;
462
;Установка- снятие выделения в один символ
463
;;;;;;;;;;;;;;;;;;;;;
464
edit_box_key.drw_sim:
465
        mov     eax,dword       ed_pos
466
        call    edit_box_key.draw_rectangle   ;нарисовать прямоугольник с заданным цветом
467
        jmp     @b
468
;;;;;;;;;;;;;;;;;;;;;
469
;Фукция установки выделения при движения влево и вправо и нажатии shift
470
;Логика:
471
;;;;;;;;;;
472
edit_box_key.draw_wigwag:
473
;функция установки переменных
474
        mov     ebp,shift_color
475
        call    edit_box.clear_cursor
476
 
477
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
478
        mov     ebp,shift_color
479
        mov     eax,dword       ed_pos
480
        test    word ed_flags,ed_left_fl
481
        jz      edit_box_key.low
482
        jmp     @f
483
;;;;;;;;;;
484
;Фукция удаления выделения при движения влево и вправо и нажатии shift
485
;Логика:
486
;;;;;;;;;;
487
edit_box_key.draw_wigwag_cl:
488
;функция установки переменных
489
        mov     ebp,ed_color
490
        call    edit_box.clear_cursor
491
 
492
        mov     ebp,ed_color
493
        mov     eax,dword       ed_pos
494
        test    word ed_flags,ed_left_fl
495
        jz      edit_box_key.low
496
@@:     call    edit_box_key.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
497
        ret
498
edit_box_key.low:   dec     eax
499
        jmp     @b
500
;входной параметр ebx - ed_pos
501
edit_box_key.sh_first_sh:
502
        test    word ed_flags,ed_shift
503
        je      @f
504
        mov     dword ed_shift_pos_old,ebx
505
        test    word ed_flags,ed_shift_on
506
        jne     @f
507
        mov     dword ed_shift_pos,ebx
508
        or      word ed_flags,ed_shift_on
509
@@:     ret
510
;Обработка крайних положений в editbox при нажатом shift
511
;производит снятие выделение, если нет shift
512
;иначе вообще выходит
513
edit_box_key.sh_st_of:
514
        test    word ed_flags,ed_shift
515
        jne     @f
516
        test    word ed_flags,ed_shift_bac
517
        je      @f
518
        mov     ebp,ed_color
519
        mov     ebx,dword       ed_shift_pos
520
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
521
        and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
522
        jmp     edit_box.draw_cursor_text
523
@@:
524
        and     word ed_flags,ed_shift_off
1113 diamond 525
        popad
526
        ret     4
1032 Lrz 527
;проверка состояния shift был ли он нажат раньше?
528
edit_box_key.sh_enable:
529
        test    word ed_flags,ed_shift
530
        jne     edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник
531
 
532
        test    word ed_flags,ed_shift_bac
533
        je      @f
534
        call    edit_box.check_offset
535
 
536
        mov     ebp,ed_color
537
        mov     ebx,dword       ed_shift_pos
538
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
539
        call    edit_box_key.draw_wigwag_cl
540
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
541
        ret
542
 
543
@@:     mov     ebp,ed_color
544
        call    edit_box.clear_cursor
545
        call    edit_box.check_offset
546
        ret
547
edit_box_key.sh_ext_en:
548
        call    edit_box.check_offset
549
        test    word ed_flags,ed_offset_fl
550
        je      @f
551
;Рисование закрашеных прямоугольников и очистка их
552
        mov     eax,dword       ed_shift_pos
553
        mov     ebx,dword       ed_pos
554
        mov     ecx,dword       ed_shift_pos_old
555
;проверка и рисование закрашеных областей
556
        cmp     eax,ecx
557
        je      edit_box_key.1_shem
558
        jb      edit_box_key.smaller
559
        cmp     ecx,ebx
560
        ja      edit_box_key.1_shem
561
        call    edit_box_key.draw_wigwag_cl ;clear
562
        jmp     edit_box_key.sh_e_end
563
edit_box_key.smaller:
564
        cmp     ecx,ebx
565
        jb      edit_box_key.1_shem
566
        call    edit_box_key.draw_wigwag_cl ;clear
567
        jmp     edit_box_key.sh_e_end
568
;alike  =
569
edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
570
edit_box_key.sh_e_end:      and     word ed_flags,ed_shift_off
571
        ret
572
@@:     mov     ebp,shift_color
573
        mov     ebx,dword       ed_shift_pos
574
        call    edit_box_key.sh_cl_
575
        jmp     edit_box_key.sh_e_end
576
;функция для обработки shift при нажатии home and end
577
edit_box_key.sh_home_end:
578
        mov     ebp,ed_color
579
        call    edit_box.clear_cursor
580
        test    word ed_flags,ed_shift_bac
581
        je      @f
582
        mov     ebp,ed_color
583
        mov     ebx,dword       ed_shift_pos_old
584
        call    edit_box_key.sh_cl_
585
 
586
@@:     test    word ed_flags,ed_shift
587
        je      edit_box_key.sh_exit_ ;выйти
588
        mov     ebp,shift_color
589
        mov     ebx,dword       ed_shift_pos
590
        call    edit_box_key.sh_cl_
591
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
592
        jmp     edit_box_key.sh_e_end
1216 Lrz 593
edit_box_key.sh_exit_:
594
	call    edit_box.check_offset
1032 Lrz 595
        ret
596
;функция внесения 0 по адресу ed_size+1
597
edit_box_key.enable_null:
598
        pusha
599
        mov     eax,ed_size
600
        mov     ebx,ed_text
601
        test    eax,eax
602
        add     eax,ebx
603
        jne     @f
604
        inc     eax
605
@@:     xor     ebx,ebx
606
        mov     [eax],bl
607
edit_ex
608
;- удаление символа
609
;Входные данные edx=ed_size;ecx=ed_pos
610
edit_box_key.del_char:
611
        mov     esi,ed_text
612
        test    word ed_flags,ed_shift_on
613
        je      @f
614
        mov     eax,dword ed_shift_pos
615
        mov     ebx,esi
616
        cmp     eax,ecx
617
        jae     edit_box_key.dh_n
618
 
619
        mov     ed_pos,eax      ;что бы не было убегания курсора
620
        mov     ebp,ecx
621
        sub     ebp,eax
622
        add     ebx,eax  ;eax меньше
623
        sub     edx,ecx
624
        add     esi,ecx
625
 
626
        mov     dword ed_shift_pos,ebp
627
        jmp     edit_box_key.del_ch_sh
628
                     ;если иначе
629
edit_box_key.dh_n:
630
        mov     ebp,eax
631
        sub     ebp,ecx
632
        add     ebx,ecx
633
        sub     edx,eax
634
        add     esi,eax
635
        mov     dword ed_shift_pos,ebp
636
        jmp     edit_box_key.del_ch_sh
637
 
638
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
639
        mov     ebx,esi
640
        inc     esi
641
        cld
642
 
643
        sub     edx,ecx
644
edit_box_key.del_ch_sh:
645
 
646
        push    edi
647
        mov     edi,ebx
648
@@:
649
        lodsb
650
        stosb
651
        dec edx
652
        jns @b
653
 
654
        pop edi
655
        ret
656
;вычислить закрашиваемую область
657
;соглашение в ebp - передается ed_size
658
edit_box_key.clear_bg:
659
        call    edit_box.get_n  ;получить размер в символах ширины компонента
660
        push    eax
661
        mov     ebx,ed_offset
662
        add     eax,ebx ;eax = w_off= ed_offset+width
663
        mov     ebx,ebp ;ed_size
664
 
665
        cmp     eax,ebx
666
        jb      @f
667
        mov     eax,ed_pos
668
        sub     ebx,eax
669
        mov     ecx,ed_offset
670
        sub     eax,ecx
671
        jmp     edit_box_key.nxt
672
@@:     mov     ebx,ed_pos
673
        push    ebx
674
        sub     eax,ebx
675
        mov     ebx,eax ;It is don't optimal
676
 
677
        pop     eax     ;ed_pos
678
        mov     ecx,ed_offset
679
        sub     eax,ecx
680
edit_box_key.nxt:
681
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
682
        add     ebp,ebx
683
        pop     edx
684
        cmp     ebp,edx
685
        je      @f
686
        inc     ebx
687
 
688
@@:     mov     edx,ebx
689
        lea     ebx,[eax*2+eax]
690
        shl     ebx,1
691
        add     ebx,ed_left
692
        inc     ebx
693
        shl     ebx,16
694
        lea     ecx,[edx*2+edx]
695
        shl     ecx,1
696
        mov     bx,cx
697
        mov     edx,ed_color
698
        call    edit_box.draw_bg_eax
699
        ret
700
;;;;;;;;;;;;;;;;;;;
701
;;; Обработка примитивов
702
;;;;;;;;;;;;;;;;;;;;
703
;Нарисовать прямоугольник, цвет передается в ebp
704
;входные параметры:
705
;eax=dword ed_pos
706
;ebp=-цвет ed_color or shift_color
707
edit_box_key.draw_rectangle:
708
        mov     ecx,dword ed_offset
709
        sub     eax,ecx
710
        lea     ebx,[eax*2+eax]
711
        shl     ebx,1
712
        inc     ebx
713
        add     ebx,ed_left
714
        shl     ebx,16
715
        add     ebx,6
716
        mov     edx,ebp
717
        call    edit_box.draw_bg_eax
718
        ret
719
;;;;;;;;;;;;;;;;;;
720
;;Проверка нажат ли shift
721
;;;;;;;;;;;;;;;;;;
722
edit_box_key.check_shift:
723
pusha   ;сохраним все регистры
1034 Lrz 724
        mcall   66,3
1032 Lrz 725
        test    al,0x03
726
        je      @f
727
        or      word ed_flags,ed_shift   ;установим флаг
728
@@:edit_ex
729
}
730
;макрос клавиш на которые происходит реакция
731
macro use_key_process backspase,delete,left,right,home,end,insert
732
{
733
if backspase eq
734
else
735
        cmp     ah,8
736
        jz      edit_box_key.backspace
737
end if
738
if delete eq
739
else
740
        cmp     ah,0xb6
741
        jz      edit_box_key.delete
742
end if
743
if left eq
744
else
745
        cmp     ah,176
746
        jz      edit_box_key.left
747
end if
748
if right eq
749
else
750
        cmp     ah,179
751
        jz      edit_box_key.right
752
end if
753
if home eq
754
else
755
        cmp     ah,180
756
        jz      edit_box_key.home
757
end if
758
if home eq
759
else
760
        cmp     ah,181
761
        jz      edit_box_key.end
762
end if
763
if insert eq
764
else
765
        cmp     ah,185  ;insert
766
        jz      edit_box_key.insert
767
end if
768
}
769
 
770
macro use_key_no_process  up,down,esc,enter,tab,numl,capsl,scrolll
771
{
772
if up eq
773
else
774
        cmp     ah,177
775
        jz      edit_box.editbox_exit
776
end if
777
if down eq
778
else
779
        cmp     ah,178
780
        jz      edit_box.editbox_exit
781
end if
782
if esc eq
783
else
784
        cmp     ah,27   ;ESC - клавиша ))
785
        jz      edit_box.editbox_exit
786
end if
787
if enter eq
788
else
789
        cmp     ah,13   ;ENTER - клавиша ))
790
        jz      edit_box.editbox_exit
791
end if
792
if tab eq
793
else
794
        cmp     ah,9   ;TAB - клавиша ))
795
        jz      edit_box.editbox_exit
796
end if
797
 
798
if numl eq
799
else
800
        cmp     ah,4   ;Num Lock - клавиша ))
801
        jz      edit_box.editbox_exit
802
end if
803
 
804
if capsl eq
805
else
806
        cmp     ah,2   ;Caps Lock - клавиша ))
807
        jz      edit_box.editbox_exit
808
end if
809
 
810
if scrolll eq
811
else
812
        cmp     ah,1   ;Scroll Lock - клавиша ))
813
        jz      edit_box.editbox_exit
814
end if
815
 
816
}
817
 
818
macro use_key_figures_only
819
{
820
        test    word ed_flags,ed_figure_only  ; только цифры ?
821
        jz      @f
822
        cmp     ah,'0'
823
        jb      edit_box.editbox_exit
824
        cmp     ah,'9'
825
        ja      edit_box.editbox_exit
826
@@:
827
}
828
macro are_key_shift_press
829
{
830
        test    word ed_flags,ed_shift_on
831
        je      @f
832
        ;Входные данные edx=ed_size;ecx=ed_pos
833
        push    eax
834
        mov     edx,ed_size
835
        mov     ecx, ed_pos
836
        pusha
837
;;;;;;;;;;;;;;;;;;;;;
838
;clear input arrea
839
        mov     ebp,ed_color
840
        mov     ebx,dword       ed_shift_pos
841
        call    edit_box_key.sh_cl_
842
        mov     ebp,ed_size
843
        call    edit_box_key.clear_bg
844
;;;;;;;;;;;;;;;;;;;;;
845
        popa
846
        call    edit_box_key.del_char
847
;;;;
848
        mov     eax,dword ed_shift_pos
849
        mov     ebx,ed_size
850
        sub     ebx,eax
851
        mov     ed_size,ebx
852
        pop     eax
853
@@:
854
}
855
macro are_key_cur_end
856
{
857
        mov     ecx,ed_size
858
        mov     edx, ed_max
859
        test    word ed_flags,ed_insert
860
        jne     @f
861
        cmp     ecx,edx
862
        jae     edit_box.editbox_exit
863
@@:     mov     ebx, ed_pos
864
        cmp     ebx,edx
865
        jl      @f ; если меньше или равно
866
        jmp     edit_box.editbox_exit
867
 
868
@@:     ; сдвигаем символы после курсора вправо
869
        mov     ecx,ed_size
870
        push    edi eax
871
        mov     ebp,edi
872
        mov     esi,ed_text     ; Указатель на буфер
873
                                ;Будем работать со строкой
874
        add     esi,ecx         ;add ed_size добавим max size
875
        mov     edi,esi
876
 
877
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
878
        je      edit_box_key.In_k
879
 
1216 Lrz 880
        test    dword bp_flags,ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
1032 Lrz 881
        jne     edit_box_key.ins_v
882
;clear
883
pusha
884
        mov     edi,ebp
885
        mov     ebp,ed_size
886
        call    edit_box_key.clear_bg
887
popa
888
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
889
        inc     edi             ;Сместим наши символы в право
890
        std
891
        inc     ecx
892
   @@:
893
        ;--------
894
        lodsb
895
        stosb
896
        ;--------
897
        loop    @b
1214 Lrz 898
edit_box_key.In_k:
899
	cld
1032 Lrz 900
        pop eax
901
        mov al,ah
902
        stosb
903
        pop edi
904
; вставляем код клавиши туда, где курсор
905
        ; увеличиваем значение размера и позиции
906
        inc      dword ed_size
907
        inc      dword ed_pos
908
        call    edit_box_key.draw_all2
909
        jmp     edit_box_key.shift
910
}
911
macro use_work_key
912
{
913
edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
914
         je     @f
915
         and    word ed_flags,ed_insert_cl
916
 
917
        jmp     edit_box.editbox_exit
918
@@:
919
        or      word ed_flags,ed_insert
920
        jmp     edit_box.editbox_exit
921
edit_box_key.ins_v:
1216 Lrz 922
;        dec     dword [ebp+48];ed_size    ;processing is insert
923
	dec	dword bp_size
1032 Lrz 924
        sub     esi,ecx
925
        add     esi,ebx
926
        mov     edi,esi
927
;clear
928
pusha
929
        mov     edi,ebp
930
        mov     ebp,ed_pos
931
        call    edit_box_key.clear_bg
932
popa
933
        jmp     edit_box_key.In_k
934
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
935
edit_box_key.delete:
936
        mov     edx,ed_size
937
        mov     ecx,ed_pos
938
        cmp     edx,ecx
939
        jg      edit_box_key.bac_del
940
        test    word ed_flags,ed_shift_on
941
        jne     edit_box_key.del_bac
1113 diamond 942
        popad
943
        ret     4
1032 Lrz 944
edit_box_key.bac_del:
945
        call    edit_box_key.del_char
946
        jmp     edit_box_key.draw_all
947
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
948
;--- нажата клавиша backspace ---
949
edit_box_key.backspace:
950
        ; проверяем, курсор у левого края ?
951
        mov     ecx,ed_pos
952
        test    ecx,ecx
953
        jnz     edit_box_key.del_bac
954
        test    word ed_flags,ed_shift_on
955
        jne     edit_box_key.bac_del
1113 diamond 956
        popad
957
        ret     4
1032 Lrz 958
 
959
edit_box_key.del_bac:
960
        mov     edx,ed_size
961
        cmp     edx,ecx ;if ed_pos=ed_size
962
        je      @f
963
        dec     ecx
964
        call    edit_box_key.del_char
965
@@:     test    word ed_flags,ed_shift_on
966
        jne     edit_box_key.bac_del
967
        dec      dword ed_pos
968
edit_box_key.draw_all:
969
        push    edit_box_key.shift;.draw_cursor_text;eax
970
 
971
        test    word ed_flags,ed_shift_on
972
        je      @f
973
        mov     eax,dword ed_shift_pos
974
        mov     ebx,ed_size
975
        sub     ebx,eax
976
        mov     ed_size,ebx
977
 
978
        mov     ebp,ed_color
979
        call    edit_box.clear_cursor
980
        call    edit_box.check_offset
981
        call    edit_box.draw_bg
982
        ret
983
@@:     dec      dword ed_size
984
 
985
edit_box_key.draw_all2:
986
        and    word ed_flags,ed_shift_cl
987
        mov     ebp,ed_color
988
        call    edit_box.clear_cursor
989
        call    edit_box.check_offset
990
        mov     ebp,ed_size
991
        call    edit_box_key.clear_bg
992
        ret
993
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
994
;--- нажата клавиша left ---
1214 Lrz 995
edit_box_key.left:
996
	mov     ebx,ed_pos
1032 Lrz 997
        test    ebx,ebx
998
        jz      edit_box_key.sh_st_of
999
        or      word ed_flags,ed_left_fl
1000
        call    edit_box_key.sh_first_sh
1001
        dec      dword ed_pos
1002
        call    edit_box_key.sh_enable
1003
        jmp     edit_box.draw_cursor_text
1004
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1005
;--- нажата клавиша right ---
1214 Lrz 1006
edit_box_key.right:
1007
	mov     ebx,ed_pos
1032 Lrz 1008
        cmp     ebx,ed_size
1009
        je      edit_box_key.sh_st_of
1010
        and     word ed_flags,ed_right_fl
1011
        call    edit_box_key.sh_first_sh
1012
        inc     dword  ed_pos
1013
        call    edit_box_key.sh_enable
1014
        jmp     edit_box.draw_cursor_text
1015
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1016
edit_box_key.home:
1017
        mov     ebx,ed_pos
1018
        test    ebx,ebx
1019
        jz      edit_box_key.sh_st_of
1020
        call    edit_box_key.sh_first_sh
1021
        xor     eax,eax
1022
        mov     ed_pos,eax
1023
        call    edit_box_key.sh_home_end
1024
        jmp     edit_box.draw_cursor_text
1025
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1026
edit_box_key.end:
1027
        mov     ebx,ed_pos
1028
        cmp     ebx,dword ed_size
1029
        je      edit_box_key.sh_st_of
1030
        call    edit_box_key.sh_first_sh
1031
        mov     eax,ed_size
1032
        mov     ed_pos,eax
1033
        call    edit_box_key.sh_home_end
1034
        jmp     edit_box.draw_cursor_text
1035
}
1036
 
1037
macro use_mouse_func
1038
{
1039
;----------------------------------------------------------
1040
;--- Обработка .mouse_wigwag
1041
;----------------------------------------------------------
1042
edit_box_mouse.mouse_wigwag:
1043
        shr     eax,16
1044
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
1045
;;;;;;;;;;;;;;;;;;
1046
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
1047
;;;;;;;;;;;;;;;;;;
1048
        test    ax,0x8000
1049
        jnz     edit_box_mouse.mleft
1050
 
1051
        mov     ebx,ed_left
1052
        cmp     eax,ebx
1053
        jb      edit_box_mouse.mleft
1054
 
1055
        add     ebx,ed_width
1056
        cmp     eax,ebx
1057
        ja      edit_box_mouse.mright
1058
 
1059
        sub     ebx,ed_width
1060
 
1061
        xor     edx,edx
1062
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
1063
        mov     ebx,6
1064
        div     ebx
1065
;;;;;;;;;;;;;;;;;;
1066
;;процедура обработки положения выделенного текста, в пределах области editbox
1067
;;;;;;;;;;;;;;;;;;
1068
;Получили координаты в eax мышки, т.е. куда она переместилась
1069
;Рисование закрашеных прямоугольников и очистка их
1070
        add     eax,ed_offset   ;добавим смещение
1071
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
1072
        ja      edit_box_mouse.mwigvag
1073
edit_box_mouse.mdraw:
1074
        mov     dword   ed_pos,eax ;сохраним новое значение
1075
;Рисование закрашеных прямоугольников и очистка их
1076
        mov     ecx,dword       ed_shift_pos
1077
        mov     ebx,dword       ed_shift_pos_old
1078
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
1079
;проверка и рисование закрашеных областей
1080
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
1081
        je      edit_box_mouse.m1_shem        ;движения не было ранее
1082
        jb      edit_box_mouse.msmaller       ;движение было ->
1083
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
1084
        ja      edit_box_mouse.m1_shem        ;если было движение <- то нужно закрасить область
1085
        je      edit_box_mouse.mwigvag        ;если изменения не было, то ничего не делать
1086
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
1087
;входные параметры ebp=color ebx=ed_shift_pos
1088
        call    edit_box_key.sh_cl_
1089
        jmp     edit_box_mouse.mwigvag
1090
edit_box_mouse.msmaller:
1091
        cmp     ebx,eax
1092
        jb      edit_box_mouse.m1_shem
1093
        mov     ebp,ed_color
1094
;входные параметры ebp=color ebx=ed_shift_pos
1095
        call    edit_box_key.sh_cl_
1096
        jmp     edit_box_mouse.mwigvag
1097
;alike  =
1098
edit_box_mouse.m1_shem:
1099
        mov     ebp,shift_color
1100
;входные параметры ebp=color ebx=ed_shift_pos
1101
        mov     ebx,ecx
1102
        call    edit_box_key.sh_cl_
1103
        jmp     edit_box_mouse.mwigvag
1104
edit_box_mouse.mwigvag:
1105
        and     word ed_flags,ed_shift_mcl
1106
        jmp     edit_box.draw_cursor_text
1107
;       popa
1108
;       ret
1109
edit_box_mouse.mleft:
1110
        mov     eax,ed_pos
1111
        cmp     eax,0
1112
        jbe      edit_box_mouse.mwigvag
1113
        dec     eax
1114
        call    edit_box.check_offset
1115
        push    eax
1116
        mov     ebx,ed_shift_pos
1117
        mov     ebp,shift_color
1118
        call    edit_box_key.sh_cl_
1119
        pop     eax
1120
        jmp     edit_box_mouse.mdraw
1121
edit_box_mouse.mright:
1122
        mov     eax,ed_pos
1123
        mov     ebx,ed_size
1124
        cmp     eax,ebx
1125
        jae     edit_box_mouse.mwigvag
1126
        inc     eax
1127
        call    edit_box.check_offset
1128
        mov     ebx,ed_shift_pos
1129
        mov     ebp,shift_color
1130
        push    eax
1131
        call    edit_box_key.sh_cl_
1132
        pop     eax
1133
        jmp     edit_box_mouse.mdraw
1134
}
1135
 
1136
macro use_work_mouse
1137
;----------------------------------------------------------
1138
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
1139
;----------------------------------------------------------
1140
{
1141
        test    word ed_flags,ed_mouse_on
1142
        jne     edit_box_mouse.mouse_wigwag
1143
;----------------------------------------------------------
1144
;--- проверяем, попадает ли курсор в edit box -------------
1145
;----------------------------------------------------------
1146
        mov     ebx,ed_top
1147
        cmp     ax,bx
1148
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1149
 
1150
        add     ebx,ed_height
1151
        cmp     ax,bx
1152
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1153
 
1154
        shr     eax,16
1155
 
1156
        mov     ebx,ed_left
1157
        cmp     ax,bx
1158
        jl      edit_box_mouse._blur;.mouse_end_no_focus
1159
 
1160
        add     ebx,ed_width
1161
 
1162
        cmp     ax,bx
1163
        jg      edit_box_mouse._blur;.mouse_end_no_focus
1164
 
1165
;--- изменяем позицию курсора ---
1166
        push    eax
1167
        mov     ebp,ed_color
1168
        call    edit_box.clear_cursor
1169
        pop     eax
1170
edit_box_mouse._mvpos:
1171
        xor     edx,edx
1172
        sub     eax,ed_left
1173
 
1174
        mov     ebx,6
1175
        div     bx
1176
        add     eax,ed_offset
1177
        cmp     eax,ed_size
1178
        jna     edit_box_mouse._mshift
1179
        mov     eax,ed_size
1180
 
1181
edit_box_mouse._mshift:
1182
;;;;;;;
1183
;;Секция обработки shift и выделения по shift
1184
;;;;;;;
1185
        test    word ed_flags,ed_shift_bac
1186
        je      @f
1187
        mov     ebp,dword       ed_color
1188
        mov     ebx,dword ed_shift_pos
1189
        push    eax
1190
        call    edit_box_key.sh_cl_
1191
        and     word ed_flags,ed_shift_bac_cl
1192
        pop     eax
1193
@@:
1194
        test    word ed_flags,ed_mouse_on
1195
        jne     @f
1196
 
1197
        mov     dword ed_shift_pos,eax
1198
        or      word  ed_flags,ed_mouse_on
1199
        mov     dword ed_pos,eax
1214 Lrz 1200
 
1201
;        mov     dword [mouse_flag],edi          ;установим идентификатор
1202
 
1203
       	mov	ebx,dword ed_mouse_variable
1204
	push	edi
1205
	pop	dword [ebx]
1206
 
1207
 
1208
 
1209
 
1032 Lrz 1210
        bts     word ed_flags,1                 ;установка фокуса
1211
        jmp     edit_box_mouse.m_sh
1212
@@:
1213
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
1214
        je      edit_box.editbox_exit
1215
        mov     ed_pos,eax
1216
        mov     ebp,dword shift_color
1217
        mov     ebx,dword ed_shift_pos
1218
        call    edit_box_key.sh_cl_
1219
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
1214 Lrz 1220
edit_box_mouse.m_sh:
1221
	call    edit_box.draw_text
1032 Lrz 1222
        call    edit_box.draw_cursor
1223
;----------------------------------------------------------
1224
;--- процедура установки фокуса ---------------------------
1225
;----------------------------------------------------------
1226
        jmp     edit_box_mouse.drc
1227
edit_box_mouse._blur:
1228
        test    word ed_flags,ed_always_focus
1229
        jne     edit_box.editbox_exit
1230
        btr     word ed_flags,1 ; если не в фокусе, выходим
1231
        jnc     edit_box.editbox_exit
1232
 
1233
        mov     ebp,ed_color
1234
        call    edit_box.clear_cursor
1235
edit_box_mouse.drc:   call    edit_box.draw_border
1236
        jmp     edit_box.editbox_exit
1237
}
1238
 
1239
 
1240
; Макрос выхода
1241
macro edit_ex
1242
{
1243
popad
1244
ret
1245
}
1246
macro debug
1247
{
1248
        ;-----------  отладка
1249
        pushad
1250
;        mov     dword [ed_buffer.2],0
1251
;        mov     eax,edi
1252
        mov eax,dword [ed_buffer.2]
1253
        mov edi,ed_buffer.3
1254
        call .str
1255
        ;рисование фона
1256
        mov eax,13
1257
        mov ebx,178*65536+70
1258
        mov ecx,28*65536+10
1259
        xor edx,edx
1260
        int 0x40
1261
        ;вывод значения на экран
1262
        mov eax,4
1263
        mov ebx,180*65536+30
1264
        mov ecx,0x10DDBBCC
1265
        mov edx,ed_buffer.3
1266
        mov esi,8
1267
        int 0x40
1268
        popad
1269
        ;----------- отладка
1270
}
1271
macro   debug_func
1272
{
1273
.str:
1274
        mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1275
         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1276
        cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1277
        jb @f
1278
        xor edx,edx  ;очистить edx
1279
        div ecx      ;разделить - остаток в edx
1280
        push edx     ;положить в стек
1281
        ;dec edi             ;смещение необходимое для записи с конца строки
1282
        call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1283
        pop eax
1284
        @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1285
        ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1286
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1287
        or al,0x30  ;данная команда короче  чем две выше
1288
        stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1289
 
1290
        ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1291
}
1292
 
1214 Lrz 1293
ed_struc_size=76
1032 Lrz 1294
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1214 Lrz 1295
       blur_border_color,text_color,max,text,mouse_variable,flags,size,pos
1032 Lrz 1296
{
1297
.width dd width
1298
.left dd left
1299
.top dd top
1300
.color dd color
1301
.shift_color dd shift_color
1302
.focus_border_color dd focus_border_color
1303
.blur_border_color dd blur_border_color
1304
.text_color dd text_color
1305
.max dd max
1306
.text dd text
1214 Lrz 1307
.mouse_variable dd mouse_variable
1032 Lrz 1308
.flags dd flags+0
1309
.size dd size+0
1310
.pos dd pos+0
1311
.offset dd 0
1312
.cl_curs_x dd 0
1313
.cl_curs_y dd 0
1314
.shift   dd 0
1315
.shift_old   dd 0
1316
}