Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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