Subversion Repositories Kolibri OS

Rev

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