Subversion Repositories Kolibri OS

Rev

Rev 1034 | 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
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
1113 diamond 551
        popad
552
        ret     4
1032 Lrz 553
;проверка состояния shift был ли он нажат раньше?
554
edit_box_key.sh_enable:
555
        test    word ed_flags,ed_shift
556
        jne     edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник
557
 
558
        test    word ed_flags,ed_shift_bac
559
        je      @f
560
        call    edit_box.check_offset
561
 
562
        mov     ebp,ed_color
563
        mov     ebx,dword       ed_shift_pos
564
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
565
        call    edit_box_key.draw_wigwag_cl
566
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
567
        ret
568
 
569
@@:     mov     ebp,ed_color
570
        call    edit_box.clear_cursor
571
        call    edit_box.check_offset
572
        ret
573
edit_box_key.sh_ext_en:
574
        call    edit_box.check_offset
575
        test    word ed_flags,ed_offset_fl
576
        je      @f
577
;Рисование закрашеных прямоугольников и очистка их
578
        mov     eax,dword       ed_shift_pos
579
        mov     ebx,dword       ed_pos
580
        mov     ecx,dword       ed_shift_pos_old
581
;проверка и рисование закрашеных областей
582
        cmp     eax,ecx
583
        je      edit_box_key.1_shem
584
        jb      edit_box_key.smaller
585
        cmp     ecx,ebx
586
        ja      edit_box_key.1_shem
587
        call    edit_box_key.draw_wigwag_cl ;clear
588
        jmp     edit_box_key.sh_e_end
589
edit_box_key.smaller:
590
        cmp     ecx,ebx
591
        jb      edit_box_key.1_shem
592
        call    edit_box_key.draw_wigwag_cl ;clear
593
        jmp     edit_box_key.sh_e_end
594
;alike  =
595
edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
596
edit_box_key.sh_e_end:      and     word ed_flags,ed_shift_off
597
        ret
598
@@:     mov     ebp,shift_color
599
        mov     ebx,dword       ed_shift_pos
600
        call    edit_box_key.sh_cl_
601
        jmp     edit_box_key.sh_e_end
602
;функция для обработки shift при нажатии home and end
603
edit_box_key.sh_home_end:
604
        mov     ebp,ed_color
605
        call    edit_box.clear_cursor
606
        test    word ed_flags,ed_shift_bac
607
        je      @f
608
        mov     ebp,ed_color
609
        mov     ebx,dword       ed_shift_pos_old
610
        call    edit_box_key.sh_cl_
611
 
612
@@:     test    word ed_flags,ed_shift
613
        je      edit_box_key.sh_exit_ ;выйти
614
        mov     ebp,shift_color
615
        mov     ebx,dword       ed_shift_pos
616
        call    edit_box_key.sh_cl_
617
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
618
        jmp     edit_box_key.sh_e_end
619
edit_box_key.sh_exit_:      call    edit_box.check_offset
620
        ret
621
;функция внесения 0 по адресу ed_size+1
622
edit_box_key.enable_null:
623
        pusha
624
        mov     eax,ed_size
625
        mov     ebx,ed_text
626
        test    eax,eax
627
        add     eax,ebx
628
        jne     @f
629
        inc     eax
630
@@:     xor     ebx,ebx
631
        mov     [eax],bl
632
edit_ex
633
;- удаление символа
634
;Входные данные edx=ed_size;ecx=ed_pos
635
edit_box_key.del_char:
636
        mov     esi,ed_text
637
        test    word ed_flags,ed_shift_on
638
        je      @f
639
        mov     eax,dword ed_shift_pos
640
        mov     ebx,esi
641
        cmp     eax,ecx
642
        jae     edit_box_key.dh_n
643
 
644
        mov     ed_pos,eax      ;что бы не было убегания курсора
645
        mov     ebp,ecx
646
        sub     ebp,eax
647
        add     ebx,eax  ;eax меньше
648
        sub     edx,ecx
649
        add     esi,ecx
650
 
651
        mov     dword ed_shift_pos,ebp
652
        jmp     edit_box_key.del_ch_sh
653
                     ;если иначе
654
edit_box_key.dh_n:
655
        mov     ebp,eax
656
        sub     ebp,ecx
657
        add     ebx,ecx
658
        sub     edx,eax
659
        add     esi,eax
660
        mov     dword ed_shift_pos,ebp
661
        jmp     edit_box_key.del_ch_sh
662
 
663
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
664
        mov     ebx,esi
665
        inc     esi
666
        cld
667
 
668
        sub     edx,ecx
669
edit_box_key.del_ch_sh:
670
 
671
        push    edi
672
        mov     edi,ebx
673
@@:
674
        lodsb
675
        stosb
676
        dec edx
677
        jns @b
678
 
679
        pop edi
680
        ret
681
;вычислить закрашиваемую область
682
;соглашение в ebp - передается ed_size
683
edit_box_key.clear_bg:
684
        call    edit_box.get_n  ;получить размер в символах ширины компонента
685
        push    eax
686
        mov     ebx,ed_offset
687
        add     eax,ebx ;eax = w_off= ed_offset+width
688
        mov     ebx,ebp ;ed_size
689
 
690
        cmp     eax,ebx
691
        jb      @f
692
        mov     eax,ed_pos
693
        sub     ebx,eax
694
        mov     ecx,ed_offset
695
        sub     eax,ecx
696
        jmp     edit_box_key.nxt
697
@@:     mov     ebx,ed_pos
698
        push    ebx
699
        sub     eax,ebx
700
        mov     ebx,eax ;It is don't optimal
701
 
702
        pop     eax     ;ed_pos
703
        mov     ecx,ed_offset
704
        sub     eax,ecx
705
edit_box_key.nxt:
706
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
707
        add     ebp,ebx
708
        pop     edx
709
        cmp     ebp,edx
710
        je      @f
711
        inc     ebx
712
 
713
@@:     mov     edx,ebx
714
        lea     ebx,[eax*2+eax]
715
        shl     ebx,1
716
        add     ebx,ed_left
717
        inc     ebx
718
        shl     ebx,16
719
        lea     ecx,[edx*2+edx]
720
        shl     ecx,1
721
        mov     bx,cx
722
        mov     edx,ed_color
723
        call    edit_box.draw_bg_eax
724
        ret
725
;;;;;;;;;;;;;;;;;;;
726
;;; Обработка примитивов
727
;;;;;;;;;;;;;;;;;;;;
728
;Нарисовать прямоугольник, цвет передается в ebp
729
;входные параметры:
730
;eax=dword ed_pos
731
;ebp=-цвет ed_color or shift_color
732
edit_box_key.draw_rectangle:
733
        mov     ecx,dword ed_offset
734
        sub     eax,ecx
735
        lea     ebx,[eax*2+eax]
736
        shl     ebx,1
737
        inc     ebx
738
        add     ebx,ed_left
739
        shl     ebx,16
740
        add     ebx,6
741
        mov     edx,ebp
742
        call    edit_box.draw_bg_eax
743
        ret
744
;;;;;;;;;;;;;;;;;;
745
;;Проверка нажат ли shift
746
;;;;;;;;;;;;;;;;;;
747
edit_box_key.check_shift:
748
pusha   ;сохраним все регистры
1034 Lrz 749
        mcall   66,3
1032 Lrz 750
        test    al,0x03
751
        je      @f
752
        or      word ed_flags,ed_shift   ;установим флаг
753
@@:edit_ex
754
}
755
;макрос клавиш на которые происходит реакция
756
macro use_key_process backspase,delete,left,right,home,end,insert
757
{
758
if backspase eq
759
else
760
        cmp     ah,8
761
        jz      edit_box_key.backspace
762
end if
763
if delete eq
764
else
765
        cmp     ah,0xb6
766
        jz      edit_box_key.delete
767
end if
768
if left eq
769
else
770
        cmp     ah,176
771
        jz      edit_box_key.left
772
end if
773
if right eq
774
else
775
        cmp     ah,179
776
        jz      edit_box_key.right
777
end if
778
if home eq
779
else
780
        cmp     ah,180
781
        jz      edit_box_key.home
782
end if
783
if home eq
784
else
785
        cmp     ah,181
786
        jz      edit_box_key.end
787
end if
788
if insert eq
789
else
790
        cmp     ah,185  ;insert
791
        jz      edit_box_key.insert
792
end if
793
}
794
 
795
macro use_key_no_process  up,down,esc,enter,tab,numl,capsl,scrolll
796
{
797
if up eq
798
else
799
        cmp     ah,177
800
        jz      edit_box.editbox_exit
801
end if
802
if down eq
803
else
804
        cmp     ah,178
805
        jz      edit_box.editbox_exit
806
end if
807
if esc eq
808
else
809
        cmp     ah,27   ;ESC - клавиша ))
810
        jz      edit_box.editbox_exit
811
end if
812
if enter eq
813
else
814
        cmp     ah,13   ;ENTER - клавиша ))
815
        jz      edit_box.editbox_exit
816
end if
817
if tab eq
818
else
819
        cmp     ah,9   ;TAB - клавиша ))
820
        jz      edit_box.editbox_exit
821
end if
822
 
823
if numl eq
824
else
825
        cmp     ah,4   ;Num Lock - клавиша ))
826
        jz      edit_box.editbox_exit
827
end if
828
 
829
if capsl eq
830
else
831
        cmp     ah,2   ;Caps Lock - клавиша ))
832
        jz      edit_box.editbox_exit
833
end if
834
 
835
if scrolll eq
836
else
837
        cmp     ah,1   ;Scroll Lock - клавиша ))
838
        jz      edit_box.editbox_exit
839
end if
840
 
841
}
842
 
843
macro use_key_figures_only
844
{
845
        test    word ed_flags,ed_figure_only  ; только цифры ?
846
        jz      @f
847
        cmp     ah,'0'
848
        jb      edit_box.editbox_exit
849
        cmp     ah,'9'
850
        ja      edit_box.editbox_exit
851
@@:
852
}
853
macro are_key_shift_press
854
{
855
        test    word ed_flags,ed_shift_on
856
        je      @f
857
        ;Входные данные edx=ed_size;ecx=ed_pos
858
        push    eax
859
        mov     edx,ed_size
860
        mov     ecx, ed_pos
861
        pusha
862
;;;;;;;;;;;;;;;;;;;;;
863
;clear input arrea
864
        mov     ebp,ed_color
865
        mov     ebx,dword       ed_shift_pos
866
        call    edit_box_key.sh_cl_
867
        mov     ebp,ed_size
868
        call    edit_box_key.clear_bg
869
;;;;;;;;;;;;;;;;;;;;;
870
        popa
871
        call    edit_box_key.del_char
872
;;;;
873
        mov     eax,dword ed_shift_pos
874
        mov     ebx,ed_size
875
        sub     ebx,eax
876
        mov     ed_size,ebx
877
        pop     eax
878
@@:
879
}
880
macro are_key_cur_end
881
{
882
        mov     ecx,ed_size
883
        mov     edx, ed_max
884
        test    word ed_flags,ed_insert
885
        jne     @f
886
        cmp     ecx,edx
887
        jae     edit_box.editbox_exit
888
@@:     mov     ebx, ed_pos
889
        cmp     ebx,edx
890
        jl      @f ; если меньше или равно
891
        jmp     edit_box.editbox_exit
892
 
893
@@:     ; сдвигаем символы после курсора вправо
894
        mov     ecx,ed_size
895
        push    edi eax
896
        mov     ebp,edi
897
        mov     esi,ed_text     ; Указатель на буфер
898
                                ;Будем работать со строкой
899
        add     esi,ecx         ;add ed_size добавим max size
900
        mov     edi,esi
901
 
902
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
903
        je      edit_box_key.In_k
904
 
905
        test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
906
        jne     edit_box_key.ins_v
907
;clear
908
pusha
909
        mov     edi,ebp
910
        mov     ebp,ed_size
911
        call    edit_box_key.clear_bg
912
popa
913
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
914
        inc     edi             ;Сместим наши символы в право
915
        std
916
        inc     ecx
917
   @@:
918
        ;--------
919
        lodsb
920
        stosb
921
        ;--------
922
        loop    @b
923
edit_box_key.In_k:  cld
924
        pop eax
925
        mov al,ah
926
        stosb
927
        pop edi
928
; вставляем код клавиши туда, где курсор
929
        ; увеличиваем значение размера и позиции
930
        inc      dword ed_size
931
        inc      dword ed_pos
932
        call    edit_box_key.draw_all2
933
        jmp     edit_box_key.shift
934
}
935
macro use_work_key
936
{
937
edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
938
         je     @f
939
         and    word ed_flags,ed_insert_cl
940
 
941
        jmp     edit_box.editbox_exit
942
@@:
943
        or      word ed_flags,ed_insert
944
        jmp     edit_box.editbox_exit
945
edit_box_key.ins_v:
946
        dec     dword [ebp+42];ed_size    ;processing is insert
947
        sub     esi,ecx
948
        add     esi,ebx
949
        mov     edi,esi
950
;clear
951
pusha
952
        mov     edi,ebp
953
        mov     ebp,ed_pos
954
        call    edit_box_key.clear_bg
955
popa
956
        jmp     edit_box_key.In_k
957
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
958
edit_box_key.delete:
959
        mov     edx,ed_size
960
        mov     ecx,ed_pos
961
        cmp     edx,ecx
962
        jg      edit_box_key.bac_del
963
        test    word ed_flags,ed_shift_on
964
        jne     edit_box_key.del_bac
1113 diamond 965
        popad
966
        ret     4
1032 Lrz 967
edit_box_key.bac_del:
968
        call    edit_box_key.del_char
969
        jmp     edit_box_key.draw_all
970
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
971
;--- нажата клавиша backspace ---
972
edit_box_key.backspace:
973
        ; проверяем, курсор у левого края ?
974
        mov     ecx,ed_pos
975
        test    ecx,ecx
976
        jnz     edit_box_key.del_bac
977
        test    word ed_flags,ed_shift_on
978
        jne     edit_box_key.bac_del
1113 diamond 979
        popad
980
        ret     4
1032 Lrz 981
 
982
edit_box_key.del_bac:
983
        mov     edx,ed_size
984
        cmp     edx,ecx ;if ed_pos=ed_size
985
        je      @f
986
        dec     ecx
987
        call    edit_box_key.del_char
988
@@:     test    word ed_flags,ed_shift_on
989
        jne     edit_box_key.bac_del
990
        dec      dword ed_pos
991
edit_box_key.draw_all:
992
        push    edit_box_key.shift;.draw_cursor_text;eax
993
 
994
        test    word ed_flags,ed_shift_on
995
        je      @f
996
        mov     eax,dword ed_shift_pos
997
        mov     ebx,ed_size
998
        sub     ebx,eax
999
        mov     ed_size,ebx
1000
 
1001
        mov     ebp,ed_color
1002
        call    edit_box.clear_cursor
1003
        call    edit_box.check_offset
1004
        call    edit_box.draw_bg
1005
        ret
1006
@@:     dec      dword ed_size
1007
 
1008
edit_box_key.draw_all2:
1009
        and    word ed_flags,ed_shift_cl
1010
        mov     ebp,ed_color
1011
        call    edit_box.clear_cursor
1012
        call    edit_box.check_offset
1013
        mov     ebp,ed_size
1014
        call    edit_box_key.clear_bg
1015
        ret
1016
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1017
;--- нажата клавиша left ---
1018
edit_box_key.left:  mov     ebx,ed_pos
1019
        test    ebx,ebx
1020
        jz      edit_box_key.sh_st_of
1021
        or      word ed_flags,ed_left_fl
1022
        call    edit_box_key.sh_first_sh
1023
        dec      dword ed_pos
1024
        call    edit_box_key.sh_enable
1025
        jmp     edit_box.draw_cursor_text
1026
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1027
;--- нажата клавиша right ---
1028
edit_box_key.right: mov     ebx,ed_pos
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
1221
        mov     dword [mouse_flag],edi          ;установим идентификатор
1222
        bts     word ed_flags,1                 ;установка фокуса
1223
        jmp     edit_box_mouse.m_sh
1224
@@:
1225
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
1226
        je      edit_box.editbox_exit
1227
        mov     ed_pos,eax
1228
        mov     ebp,dword shift_color
1229
        mov     ebx,dword ed_shift_pos
1230
        call    edit_box_key.sh_cl_
1231
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
1232
edit_box_mouse.m_sh:  call    edit_box.draw_text
1233
        call    edit_box.draw_cursor
1234
;----------------------------------------------------------
1235
;--- процедура установки фокуса ---------------------------
1236
;----------------------------------------------------------
1237
        jmp     edit_box_mouse.drc
1238
edit_box_mouse._blur:
1239
        test    word ed_flags,ed_always_focus
1240
        jne     edit_box.editbox_exit
1241
        btr     word ed_flags,1 ; если не в фокусе, выходим
1242
        jnc     edit_box.editbox_exit
1243
 
1244
        mov     ebp,ed_color
1245
        call    edit_box.clear_cursor
1246
edit_box_mouse.drc:   call    edit_box.draw_border
1247
        jmp     edit_box.editbox_exit
1248
}
1249
 
1250
 
1251
; Макрос выхода
1252
macro edit_ex
1253
{
1254
popad
1255
ret
1256
}
1257
macro debug
1258
{
1259
        ;-----------  отладка
1260
        pushad
1261
;        mov     dword [ed_buffer.2],0
1262
;        mov     eax,edi
1263
        mov eax,dword [ed_buffer.2]
1264
        mov edi,ed_buffer.3
1265
        call .str
1266
        ;рисование фона
1267
        mov eax,13
1268
        mov ebx,178*65536+70
1269
        mov ecx,28*65536+10
1270
        xor edx,edx
1271
        int 0x40
1272
        ;вывод значения на экран
1273
        mov eax,4
1274
        mov ebx,180*65536+30
1275
        mov ecx,0x10DDBBCC
1276
        mov edx,ed_buffer.3
1277
        mov esi,8
1278
        int 0x40
1279
        popad
1280
        ;----------- отладка
1281
}
1282
macro   debug_func
1283
{
1284
.str:
1285
        mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1286
         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1287
        cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1288
        jb @f
1289
        xor edx,edx  ;очистить edx
1290
        div ecx      ;разделить - остаток в edx
1291
        push edx     ;положить в стек
1292
        ;dec edi             ;смещение необходимое для записи с конца строки
1293
        call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1294
        pop eax
1295
        @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1296
        ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1297
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1298
        or al,0x30  ;данная команда короче  чем две выше
1299
        stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1300
 
1301
        ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1302
}
1303
 
1304
;;;;;;;;;;;;;;;
1305
;For LibGui
1306
;;;;;;;;;;;;;;;
1307
macro srt_ed_libgui
1308
{
1309
ed_width        equ [EditBox.ed_width]            ;ширина компонента
1310
ed_left         equ [EditBox.ed_left]             ;положение по оси х
1311
ed_top          equ [EditBox.ed_top]              ;положение по оси у
1312
ed_color        equ [EditBox.ed_color]            ;цвет фона компонента
1313
shift_color     equ [EditBox.shift_color]         ;=0x6a9480
1314
ed_focus_border_color   equ [EditBox.ed_focus_border_color]   ;цвет рамки компонента
1315
ed_blur_border_color    equ [EditBox.ed_blur_border_color]    ;цвет не активного компонента
1316
ed_text_color   equ [EditBox.ed_text_color]       ;цвет текста
1317
ed_max          equ [EditBox.ed_max]              ;кол-во символов которые можно максимально ввести
1318
ed_text         equ [EditBox.ed_text]             ;указатель на буфер
1319
ed_flags        equ [EditBox.ed_flags]            ;флаги
1320
ed_size equ [EditBox.ed_size]                     ;кол-во символов
1321
ed_pos  equ [EditBox.ed_poz]                      ;позиция курсора
1322
ed_offset       equ [EditBox.ed_offset]           ;смещение
1323
cl_curs_x       equ [EditBox.cl_curs_x]           ;предыдущее координата курсора по х
1324
cl_curs_y       equ [EditBox.cl_curs_y]           ;предыдущее координата курсора по у
1325
ed_shift_pos    equ [EditBox.ed_shift_pos]        ;положение курсора
1326
ed_shift_pos_old equ [EditBox.ed_shift_pos_old]   ;старое положение курсора
1327
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1328
;Bit mask from editbox
1329
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1330
ed_figure_only= 1000000000000000b   ;одни символы
1331
ed_always_focus= 100000000000000b
1332
ed_focus=                     10b   ;фокус приложения
1333
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
1334
ed_shift_on_off=1111111111110111b
1335
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1336
ed_shift_off=   1111111111111011b
1337
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
1338
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
1339
ed_shift_cl=    1111111111100011b
1340
ed_shift_mcl=   1111111111111011b
1341
ed_left_fl=               100000b
1342
ed_right_fl=    1111111111011111b
1343
ed_offset_fl=            1000000b
1344
ed_offset_cl=   1111111110111111b
1345
ed_insert=              10000000b
1346
ed_insert_cl=   1111111101111111b
1347
ed_mouse_on =          100000000b
1348
ed_mous_adn_b=         100011000b
1349
ed_mouse_on_off=1111111011111111b
1350
ed_height=24 ; высота
1351
}
1352
 
1353
ed_struc_size=72
1354
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1355
       blur_border_color,text_color,max,text,flags,size,pos
1356
{
1357
.width dd width
1358
.left dd left
1359
.top dd top
1360
.color dd color
1361
.shift_color dd shift_color
1362
.focus_border_color dd focus_border_color
1363
.blur_border_color dd blur_border_color
1364
.text_color dd text_color
1365
.max dd max
1366
.text dd text
1367
.flags dd flags+0
1368
.size dd size+0
1369
.pos dd pos+0
1370
.offset dd 0
1371
.cl_curs_x dd 0
1372
.cl_curs_y dd 0
1373
.shift   dd 0
1374
.shift_old   dd 0
1375
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1376
;Bit mask from editbox
1377
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1378
ed_figure_only= 1000000000000000b   ;одни символы
1379
ed_always_focus= 100000000000000b
1380
ed_focus=                     10b   ;фокус приложения
1381
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
1382
ed_shift_on_off=1111111111110111b
1383
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1384
ed_shift_off=   1111111111111011b
1385
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
1386
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
1387
ed_shift_cl=    1111111111100011b
1388
ed_shift_mcl=   1111111111111011b
1389
ed_left_fl=               100000b
1390
ed_right_fl=    1111111111011111b
1391
ed_offset_fl=            1000000b
1392
ed_offset_cl=   1111111110111111b
1393
ed_insert=              10000000b
1394
ed_insert_cl=   1111111101111111b
1395
ed_mouse_on =          100000000b
1396
ed_mous_adn_b=         100011000b
1397
ed_mouse_on_off=1111111011111111b
1398
ed_height=14 ; высота
1399
 
1400
}