Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7389 theonlymir 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
; Compile with FASM
7412 theonlymir 5
; Version 0.3.2: Sep 24, 2018
7389 theonlymir 6
 
7
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
8
; All rights reserved.
9
; Redistribution and use in source and binary forms, with or without modification,
10
; are permitted provided that the following conditions are met:
11
;    * Redistributions of source code must retain the above copyright notice, this
12
;    list of conditions and the following disclaimer.
13
;    * Redistributions in binary form must reproduce the above copyright  notice,
14
;    this list of conditions and the following disclaimer in the documentation and/or
15
;    other materials provided with the distribution.
16
;    * Neither the name of the  nor the names of its contributors may
17
;    be used to endorse or promote products derived from this software without
18
;    specific prior written permission.
19
 
20
; THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
21
; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
22
; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25
; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
; --------------------------------------------------------------------------------------
27
 
7408 theonlymir 28
;P.S. Коду требуется оптимизация и доработка (см. тему форума)
7389 theonlymir 29
format binary as ""     ; Binary file format without extension
30
use32                   ; Tell compiler to use 32 bit instructions
31
org 0                   ; the base address of code, always 0x0
32
 
33
; Заголовок исполняемого файла Колибри ОС
34
db 'MENUET01'
35
dd 1
36
dd START
37
dd I_END
38
dd MEM
39
dd STACKTOP
40
dd 0, 0
41
 
42
; Начало области кода
7395 theonlymir 43
include 'lang.inc'       ;поддержка языков при компиляции
7389 theonlymir 44
include '../../macros.inc'
7402 theonlymir 45
include '../../proc32.inc'
46
include '../../dll.inc'
7408 theonlymir 47
include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;компоненты checkBox и editBox
7389 theonlymir 48
 
49
Otstup = 30
50
 
51
START:
52
    call copyKill        ;простейшая защита от запуска второй копии приложения
53
    mcall  68, 11        ;инициализация кучи
54
 
55
    mov  eax,48          ;получить системные цвета
56
    mov  ebx,3
57
    mov  ecx, sc
58
    mov  edx, sizeof.system_colors
59
    mcall
60
 
7402 theonlymir 61
 
62
    stdcall dll.Load, @IMPORT
63
    or      eax, eax
64
    jnz     exit
65
 
66
    invoke  init_checkbox, ch1
67
 
7389 theonlymir 68
    mov  eax,40          ;установить маску для ожидаемых событий
69
    mov  ebx,0x27        ;система будет реагировать только на сообщение о перерисовке, нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
70
    mcall
71
 
72
    call  loadConfig     ;загружаем конфигурацию из файла, если нет - то выставляем параметры по умолчанию
73
    call  draw_window    ;отрисовать окно приложения
74
 
75
; Обработка цикла событий
76
event_wait:
77
    mov     eax, 10      ; function 10 : wait until event
78
    mcall                ; event type is returned in eax
79
 
80
    cmp     eax, 1       ; Event redraw request ?
81
    je      red          ; Expl.: there has been activity on screen and
82
                         ; parts of the applications has to be redrawn.
83
 
84
    cmp     eax, 2       ; Event key in buffer ?
85
    je      key          ; Expl.: User has pressed a key while the
86
                         ; app is at the top of the window stack.
87
 
88
    cmp     eax, 3       ; Event button in buffer ?
89
    je      button       ; Expl.: User has pressed one of the
90
                         ; applications buttons.
91
 
7408 theonlymir 92
    invoke  edit_box_mouse, editLU   ;проверка событий мыши для editBox'ов
7402 theonlymir 93
    invoke  edit_box_mouse, editLD
94
    invoke  edit_box_mouse, editRU
95
    invoke  edit_box_mouse, editRD
7408 theonlymir 96
    invoke  check_box_mouse, ch1     ;проверка чек бокса
7402 theonlymir 97
 
7389 theonlymir 98
    jmp     event_wait
99
 
100
 
101
red:                     ;обработка события перерисовки окна
102
   call    draw_window
103
   jmp     event_wait
104
 
105
key:                                    ; Keypress event handler
106
        mov     eax, 2                  ; The key is returned in ah. The key must be
107
        mcall                           ; read and cleared from the system queue.
7408 theonlymir 108
 
7402 theonlymir 109
        invoke  edit_box_key, editLU
110
        invoke  edit_box_key, editLD
111
        invoke  edit_box_key, editRU
112
        invoke  edit_box_key, editRD
7389 theonlymir 113
        jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
114
 
115
button:                                 ; Buttonpress event handler
116
    mov     eax,17                  ; The button number defined in window_draw
117
    mcall                           ; is returned to ah.
118
 
119
    cmp     ah,1                    ; button id=1 ?
120
    jne     noclose
7402 theonlymir 121
exit:
7389 theonlymir 122
    mov     eax,-1                  ; Function -1 : close this program
123
    mcall
124
noclose:
125
    cmp  ah, 2         ;кнопка "Применить"
126
    jne  butend
127
    call applyButton   ;вызов нашего обработчика нажатия кнопки
128
butend:
129
    jmp  event_wait    ;this is for ignored events, useful at development
130
 
131
 
132
 
133
;имя конфигурационного файла
134
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
135
 
136
;структура для создания/перезаписи файла
137
createFile:
138
  .func     dd 2    ;номер подфункции
139
  .re       dd 0, 0 ;зарезервировано
140
  .size     dd 0    ;сколько байт писать
141
  .data_adr dd 0    ;указатель на данные
142
  .path     db 0
143
  .path_adr dd fileName    ;путь
144
 
145
;строка параметров по умолчанию и её размер
146
defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10
147
defaultDataSize = 48+19
148
 
149
 
150
copyParam:  ;копирует параметр(команду запуска) в буфер (см. дальше)
151
   push esi ebx ecx
152
   mov ecx, dword[ebx] ;читаем размер строки
7412 theonlymir 153
 
154
   cmp ecx, 0          ;пуста ли строка?
155
   jne copyParam.copy  ;если нет, то переходим к копированию содержимого строки (к  циклу)
156
 
157
   mov byte[eax], '-'  ;если же пусто, то заменяем символом минус '-'
158
   inc eax
159
   ;jmp copyParam.copyEnd ;и выходим
160
   ;далее в начале цикла произойдёт сравнение и выход
161
 
7389 theonlymir 162
.copy:  ;копируем символы
163
   cmp ecx, 0
164
   je copyParam.copyEnd
165
   mov bl, byte[esi]
166
   mov byte[eax], bl
167
   dec ecx
168
   inc eax
169
   inc esi
170
   jmp copyParam.copy
171
.copyEnd:
172
   pop ecx ebx esi
173
   ret
174
 
175
 
176
addPerenos:  ;добавляет перенос строки в буфер
177
   mov byte[eax], 13
178
   inc eax
179
   mov byte[eax], 10
180
   inc eax
181
   ret
182
 
183
;обработчик кнопки "Применить"
184
applyButton:
185
    push eax ebx ecx
186
        ;mov dword[createFile.data_adr], defaultDataForConfig
187
        ;mov dword[createFile.size], defaultDataSize
188
 
189
        ;вычислим размер файла конфигурации в байтах
190
        mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10)
7408 theonlymir 191
        add ecx, dword[editLU.size] ;плюс размер каждой строки в байтах
192
        add ecx, dword[editLD.size]
193
        add ecx, dword[editRU.size]
7389 theonlymir 194
        add ecx, dword[editRD.size] ;dataBuffer.size4]
7412 theonlymir 195
 
196
        ;если заданы пустые строки, то мы автоматически добавляем знак минус, значит размер +1 байт
197
        cmp dword[editLU.size], 0
198
        jne @f
199
        inc ecx
200
@@:
201
        cmp dword[editLD.size], 0
202
        jne @f
203
        inc ecx
204
@@:
205
        cmp dword[editRU.size], 0
206
        jne @f
207
        inc ecx
208
@@:
209
        cmp dword[editRD.size], 0
210
        jne @f
211
        inc ecx
212
@@:
213
 
7389 theonlymir 214
        ;теперь размер файла конфигурации в ecx
215
        mov dword[createFile.size], ecx ;положим размер байт в структуру создания/перезаписи файла
216
        mcall 68, 12, ecx ;выделяем блок памяти под буфер содержимого
217
        mov dword[createFile.data_adr], eax ;сохраняем адрес буфера в структуру
218
 
219
        ;заполним буфер содержимого:
220
        mov byte[eax], 110; 'n' ;по умолчанию флаг снят
7408 theonlymir 221
        cmp word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;выставлен checkBox или нет?
7389 theonlymir 222
        jne applyButton.no
223
        mov byte[eax], 121 ;иначе кладём 'y'
224
.no:
225
        inc eax
226
        call addPerenos
227
 
228
        push esi ebx
229
        call UpdateEditsSizes ;обновить размеры текста в edit'ах
230
 
7408 theonlymir 231
        mov esi, dataBuffer.1     ;editLU.text
7389 theonlymir 232
        mov ebx, dataBuffer.size1 ;editLU.size
233
        call copyParam
234
        call addPerenos     ;добавляем перенос строки
235
 
7408 theonlymir 236
        mov esi, dataBuffer.2
237
        mov ebx, dataBuffer.size2
7389 theonlymir 238
        call copyParam
239
        call addPerenos     ;добавляем перенос строки
240
 
241
        mov esi, dataBuffer.3
242
        mov ebx, dataBuffer.size3
243
        call copyParam
244
        call addPerenos     ;добавляем перенос строки
245
 
246
        mov esi, dataBuffer.4
247
        mov ebx, dataBuffer.size4
248
        call copyParam
249
        call addPerenos     ;добавляем перенос строки
250
 
251
        pop ebx esi
252
 
253
 
254
    mov ebx, createFile
255
    mcall 70
256
        cmp eax, 0
257
        je .end
258
        ;иначе здесь нужно вывести окно с ошибкой !!!
259
.end:
260
        mcall 68, 13, dword[createFile.data_adr]  ;освобождаем память под буфер
7412 theonlymir 261
        call finishHotAnglesApp ;завершаем работу всех копий сервиса @HOTANGLES
262
        call loadConfig         ;перезагружаем файл конфига
263
        call draw_window        ;перерисовываем окно
264
        call startHotAnglesApp  ;перезапускаем @HOTANGLES
7389 theonlymir 265
        pop ecx ebx eax
266
    ret
267
 
268
 
269
 
270
 
271
 
272
 
273
compareBytes2:
274
   push edi esi ecx ebx
275
   xor eax, eax
276
   mov ecx, 10  ;max размер строк 11
277
@@:
278
   mov bl, byte[edi]
279
   cmp bl, byte[esi]
280
   jne compareBytes.no
281
   inc edi
282
   inc esi
283
   cmp ecx, 0
284
   je @f
285
   dec ecx
286
   jmp @b
287
.no:
288
   mov eax, 1
289
@@:
290
   pop ebx ecx esi edi
291
   ret
292
 
293
 
7412 theonlymir 294
finishHotAnglesApp:
7389 theonlymir 295
   ;находим все копии приложения по имени и завершаем их
296
   push eax ebx ecx esi edi
297
   ;указатели, которые никогда не меняются:
298
   mov esi, startAppData.file_name       ;первая строка - искомое имя приложения
299
   mov edi, buf            ;вторая строка - имя текущего слота
300
   add edi, 10
301
 
302
   mov ecx, 1
303
@@:
304
   mcall 9, buf, ecx              ;получаем данные очередного слота
305
   mov dword[slotMax], eax
306
 
307
   call compareBytes2 ;сравниваем имя
308
   cmp eax, 0
7412 theonlymir 309
   jne finishHotAnglesApp.next   ;если не совпало, то переходим на следующий слот
7389 theonlymir 310
 
311
   ;push eax ebx ecx
312
   mcall 18, 2, ecx               ;иначе завершаем слот
313
   ;pop ecx ebx eax
314
 
315
.next:
316
   inc  ecx
317
   cmp ecx, dword[slotMax]
318
   ja @f
319
   jmp @b
320
@@:
321
   pop edi esi ecx ebx eax
7412 theonlymir 322
   ret
7389 theonlymir 323
 
7412 theonlymir 324
startHotAnglesApp:
7389 theonlymir 325
   ;запускаем приложение заново
326
   push eax ebx
327
   mcall 70, startAppData
328
   cmp eax, 0
329
   ja @f       ;если eax>0, то успешно запущено
330
   ;!!! иначе тут печатаем ошибку
331
@@:
332
   pop ebx eax
333
   ret
334
 
335
startAppData:
336
    .subfunction dd   7
337
    .flags       dd   0
338
    .param       dd   0
339
    .rezerv      dd   0, 0
340
    .full_name   db   '/rd/1/'
341
    .file_name   db   '@HOTANGLES', 0
342
    ;db 0
343
    ;.name: dd HotAnglesAppName
344
;HotAnglesAppName db '@HOTANGLES', 0
345
 
346
 
347
UpdateEditsSizes:
348
   push eax
349
   mov eax, dword[editLU.size]
350
   mov dword[dataBuffer.size1], eax
351
 
352
   mov eax, dword[editLD.size]
353
   mov dword[dataBuffer.size2], eax
354
 
355
   mov eax, dword[editRU.size]
356
   mov dword[dataBuffer.size3], eax
357
 
358
   mov eax, dword[editRD.size]
359
   mov dword[dataBuffer.size4], eax
360
 
361
   pop eax
362
   ret
363
 
364
fileAdr dd 0
365
 
366
loadConfig:
367
   push eax ebx ecx edx
368
   mcall 68, 27, fileName   ;загружаем конфигурационный файл в ОЗУ
369
   mov dword[fileAdr], eax  ;сохраняем адрес блока памяти файла
370
   cmp eax, 0
371
   je loadConfig.default       ;если файла конфигурации нет, то ставим настройки по умолчанию
372
   ;иначе данные загружены в ОЗУ, размер в edx
373
   cmp edx, 0               ;если файл пуст, в нём нет данных, то ставим настройки по умолчанию
374
   je loadConfig.default
375
.start:
376
   add edx, eax             ;кладём в edx - адрес конца конфиг.данных
377
 
378
.chStart:
379
   cmp byte[eax], 121 ;'y'  ;выставляем checkBox - параметр активности приложения
380
   jne loadConfig.no
381
.yes:
7408 theonlymir 382
   mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle
7389 theonlymir 383
   jmp loadConfig.chEnd
384
.no:
7408 theonlymir 385
   mov word[ch1.flags], 100b ;ch_flag_middle
7389 theonlymir 386
.chEnd:
387
   ;jmp loadConfig.end   ;команда для удобства отладки и поиска ошибок
388
 
389
   ;копируем содержимое строк в буфер
390
   push edi esi ecx ebx eax
391
   ;инициализируем указатели на адреса буфера строки и её размера
7408 theonlymir 392
   mov edi, dataBuffer.1
393
   mov esi, dataBuffer.size1
7389 theonlymir 394
   ;ecx - счётчик байт в строке
395
.block:
396
   xor ecx, ecx ;обнуляем счётчик
397
   inc eax
398
   cmp byte[eax], 10         ;если очередной код символа 10 или 13, то пропускаем символы
7408 theonlymir 399
   je loadConfig.block       ;до первого отличного от них
7389 theonlymir 400
   cmp byte[eax], 13
7408 theonlymir 401
   je loadConfig.block
7389 theonlymir 402
 
403
   ; символ отличен от переноса строки и возврата каретки - начинаем копировать отсюда в буфер
404
   mov bl, byte[eax]
405
   mov byte[edi], bl
406
   inc edi
407
   inc eax
408
   inc ecx ;увеличиваем счётчик символов в строке
409
 
410
   ;идём до конца этой строки: пока не встретим очередной 10, 13, 0 или file end
411
.while:     ;и копируем всё в буфер
412
   cmp eax, edx           ;проверяем закончился ли файл, а конца строки не было !!!
413
   ja loadConfig.ura
414
   cmp byte[eax], 10
415
   je loadConfig.ura
416
   cmp byte[eax], 0
417
   je loadConfig.ura
418
   cmp byte[eax], 13
419
   je loadConfig.ura
420
 
421
   mov bl, byte[eax]
422
   mov byte[edi], bl
423
   inc edi
424
   inc eax
425
   inc ecx
426
   cmp ecx, 511
427
   jae loadConfig.ura
428
   jmp loadConfig.while
429
.ura:
430
   mov byte[edi], 0      ;кладём завершающий 0 в строку
431
   mov dword[esi], ecx   ;сохраняем размер строки
432
   add esi, 4            ;переходим на размер следующего буфера
433
   sub edi, ecx          ;переходим на следующий буфер
434
   add edi, 512
7408 theonlymir 435
   ;xor ecx, ecx          ;обнуляем размер строки
7389 theonlymir 436
 
437
   cmp edi, dataBuffer.size1 ;если это был последний буфер (и мы вышли за адреса размеров буферов), то выходим
438
   jb loadConfig.block
439
 
440
   pop eax ebx ecx esi edi
441
 
442
   jmp loadConfig.end
443
.default:
444
   mov eax, defaultDataForConfig
445
   mov edx, defaultDataSize
446
   jmp loadConfig.start
447
.end:
448
   mov ecx, dword[fileAdr]    ;если файл был загружен, то
449
   cmp ecx, 0
450
   je @f
451
   mcall 68, 13, ecx  ;выгружаем файл из памяти
452
@@:
453
   call updateParams ;применяем настройки каждого буфера
454
   pop edx ecx ebx eax
455
   ret
456
 
457
 
458
updateParams: ;max, size, pos
459
   push eax
460
   mov eax, dword[dataBuffer.size1]
461
   mov dword[editLU.size], eax
462
   mov dword[editLU.pos], eax
463
 
464
   mov eax, dword[dataBuffer.size2]
465
   mov dword[editLD.size], eax
466
   mov dword[editLD.pos], eax
467
 
468
   mov eax, dword[dataBuffer.size3]
469
   mov dword[editRU.size], eax
470
   mov dword[editRU.pos], eax
471
 
472
   mov eax, dword[dataBuffer.size4]
473
   mov dword[editRD.size], eax
474
   mov dword[editRD.pos], eax
475
   pop eax
476
   ret
477
 
478
 
479
 
7408 theonlymir 480
selfName db 'HACONFIG', 0
481
selfNameSize = 8 ;до 11 byte
7389 theonlymir 482
;
483
compareBytes:
484
   push edi esi ecx ebx
485
   mov eax, 0 ;xor eax, eax
7408 theonlymir 486
   mov ecx, selfNameSize    ;max размер строк 11
7389 theonlymir 487
@@:
488
   mov bl, byte[edi]
489
   cmp bl, byte[esi]
490
   jne compareBytes.no
491
   inc edi
492
   inc esi
493
   cmp ecx, 0
494
   je @f
495
   dec ecx
496
   jmp @b
497
.no:
498
   mov eax, 1
499
@@:
500
   pop ebx ecx esi edi
501
   ret
502
;
503
slotMax dd 0
504
selfPID dd 0
505
buf db 1024 dup(0)
506
copyKill:
507
   push eax ebx ecx esi edi
508
 
509
   ;сперва прочтём свою информацию
510
   mcall 9, buf, -1
511
   mov eax, dword[buf+30]
512
   mov dword[selfPID], eax
513
 
514
   ;указатели, которые никогда не меняются:
515
   mov esi, selfName       ;первая строка - имя текущего приложения
516
   mov edi, buf            ;вторая строка - имя текущего слота
517
   add edi, 10
518
 
519
   mov ecx, 1
520
@@:
521
   mcall 9, buf, ecx
522
   mov dword[slotMax], eax
523
 
524
   ;если это мы сами, то пропускаем проверку
525
   mov eax, dword[buf+30]
526
   cmp eax, dword[selfPID]
527
   je copyKill.propusk
528
 
529
   call compareBytes   ;сравниваем 11 байт строк, результат в eax
530
 
531
   cmp eax, 0
532
   je copyKill.selfKill
533
 
534
.propusk:
535
   inc ecx
536
   cmp ecx, dword[slotMax]
537
   ja @f
538
   jmp @b
539
 
540
.selfKill:
541
   pop edi esi ecx ebx eax
542
   mcall -1
543
   ret
544
@@:
545
   pop edi esi ecx ebx eax
546
   ret
547
 
548
 WindowsWidth  = 450
549
 WindowsHeight = 195
550
coord:      ;координаты окна приложения
551
 .y dw 0
552
 .x dw 0
553
 
554
draw_window:
555
        ;удаляем кнопку, если есть
556
        mov edx, 0x80000002
557
        mcall 8
558
 
559
        mov     eax, 12                 ; function 12: tell os about windowdraw
560
        mov     ebx, 1                  ; 1, start of draw
561
        mcall
562
 
563
        ;отобразим окно по центру экрана для этого:
564
        mcall 14 ;получим размеры экрана
565
        mov dword[coord], eax       ;положим размеры экрана в координаты
566
        shr word[coord.x], 1        ;вернее положим их половину
567
        shr word[coord.y], 1
568
 
569
        ;вычисляем координаты окна, чтобы окно было по середине экрана
570
        sub word[coord.x], WindowsWidth/2
571
        sub word[coord.y], WindowsHeight/2
572
 
573
        mov     eax, 0                  ; function 0 : define and draw window
7408 theonlymir 574
        mov     ebx, 0                  ; [x start] *65536 + [x size]
7389 theonlymir 575
        mov bx, word[coord.x]
576
        shl  ebx, 16
577
        mov bx, WindowsWidth
578
 
579
        mov ecx, 0
7408 theonlymir 580
        mov     cx, word[coord.y]       ; [y start] *65536 + [y size]
7389 theonlymir 581
        shl ecx, 16
582
        mov cx, WindowsHeight
583
 
584
        mov     edx, 0x14ffffff         ; color of work area RRGGBB
585
                                        ; 0x02000000 = window type 4 (fixed size, skinned window)
586
        mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
587
                                        ; 0x80000000 = color glide
588
        mov     edi, title
589
        mcall
590
 
7402 theonlymir 591
        invoke  edit_box_draw, editLU  ;рисование edit box'ов
592
        invoke  edit_box_draw, editLD
593
        invoke  edit_box_draw, editRU
594
        invoke  edit_box_draw, editRD
595
 
596
        invoke  check_box_draw, ch1    ;рисование чекбоксов
7389 theonlymir 597
 
598
        ;рисуем кнопку
599
        mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;координата X, ширина кнопки
600
        mov ecx, 160*65536 + 20   ;координата Y, высота кнопки
601
        mov edx, 0x00000002 ;2    ;номер кнопки
602
        mov esi, 0x00AABBCC       ;цвет кнопки
603
        mcall 8
604
        ;рисуем текст кнопки
7395 theonlymir 605
        mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166    ;координаты текста (x, y)
7389 theonlymir 606
        mov     ecx, 0xFFFFFF     ;белый цвет текста
607
        mov     edx, buttonText
7395 theonlymir 608
        mov     esi, buttonTextSize ;5            ;размер текста в символах
609
        mcall 4
7389 theonlymir 610
 
611
        call draw_super_text
612
 
7408 theonlymir 613
        LineLength = 62
7389 theonlymir 614
        mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
615
        mov     ecx, 0x224466
616
        mov     edx, text
617
        mov     esi, LineLength
618
        mov     eax, 4
619
 
620
  .newline:                             ; text from the DATA AREA
621
        mcall
622
        add     ebx, 12
623
        add     edx, LineLength
624
        cmp     byte[edx], 0
625
        jne     .newline
626
 
627
        mov     eax, 12                 ; function 12:tell os about windowdraw
628
        mov     ebx, 2                  ; 2, end of draw
629
        mcall
630
 
631
        ret
632
 
633
 
634
 
7395 theonlymir 635
 
7402 theonlymir 636
align 16
637
@IMPORT:
638
 
639
library box_lib, 'box_lib.obj'
640
 
641
import  box_lib,\
642
        edit_box_draw,          'edit_box',\
643
        edit_box_key,           'edit_box_key',\
644
        edit_box_mouse,         'edit_box_mouse',\
645
        init_checkbox,          'init_checkbox2',\
646
        check_box_draw,         'check_box_draw2',\
647
        check_box_mouse,        'check_box_mouse2',\
648
        option_box_draw,        'option_box_draw',\
649
        option_box_mouse,       'option_box_mouse'
650
 
651
 
7408 theonlymir 652
;DATA данные check_box использует системные цвета
7402 theonlymir 653
 
654
;координаты (x,y) = (30, 160) размер чекбокса 12, цвет текста 0x224466
655
ch1     check_box2 30 shl 16 + 12, 160 shl 16 + 12, 6, 0xFFFFFFFF, 0xAABBCC, 0x224466, ch_text, 110b ; ch_flag_en and ch_flag_middle
7395 theonlymir 656
 
7402 theonlymir 657
 
7395 theonlymir 658
if lang eq ru  ;если язык сборки русский
659
 
660
text    db  "Љ®­дЁЈга в®а Hot Angles ®вўҐз Ґв §  ­ бва®©Єг  ЄвЁў­ле гЈ«®ў. "
661
        db  "Ќ бвன⥠Ї а ¬Ґвал Ї®¤ бҐЎп Ё«Ё ®вЄ«озЁвҐ нвг ®ЇжЁо.         "
662
        db  "                                                              ", 0
663
 hed:
664
title   db  "Љ®­дЁЈга в®а гвЁ«Ёвл Hot Angles", 0
665
buttonText db "ЏаЁ¬Ґ­Ёвм", 0
666
buttonTextSize = 9
667
buttonTextXoffset = 12
668
 
7402 theonlymir 669
ch_text db '‚Є«озЁвм/ ЄвЁўЁа®ў вм "Hot Angles"', 0
7395 theonlymir 670
 
671
superText:
672
  .lu db 'Љ®¬ ­¤  «Ґў®Ј® ўҐае­ҐЈ® гЈ« : ', 0
673
  .ld db 'Љ®¬ ­¤  «Ґў®Ј® ­Ё¦­ҐЈ® гЈ« :  ', 0
674
  .ru db 'Љ®¬ ­¤  Їа ў®Ј® ўҐае­ҐЈ® гЈ« :', 0
675
  .rd db 'Љ®¬ ­¤  Їа ў®Ј® ­Ё¦­ҐЈ® гЈ« : ', 0
676
superTextSize = 30
677
 
678
else  ;иначе английский текст
679
 
680
text    db  "This is a Hot Angles Configurator.                            "
681
        db  "Set the parameters bellow for yourself or disable this option."
682
        db  "                                                              ", 0
683
 hed:
684
title   db  "Hot Angles Configurator", 0
685
buttonText db "Apply", 0
686
buttonTextSize = 5
687
buttonTextXoffset = 0
688
 
7402 theonlymir 689
ch_text db 'Activate "Hot Angles"',0       ;сопровождающий текст для чек бокса
7389 theonlymir 690
 
691
superText:
7395 theonlymir 692
  .lu db 'Left up angle command:   ', 0
693
  .ld db 'Left down angle command: ', 0
694
  .ru db 'Right up angle command:  ', 0
7389 theonlymir 695
  .rd db 'Right down angle command:', 0
7395 theonlymir 696
superTextSize = 25
7389 theonlymir 697
 
7395 theonlymir 698
end if
699
 
700
 
7389 theonlymir 701
draw_super_text:
702
   push eax ebx ecx edx edi esi
703
   mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
704
   mov     ecx, 0x224466
705
   mov eax, superText.lu
706
   mov     edx, eax
7408 theonlymir 707
   mov     esi, superTextSize
7389 theonlymir 708
   mcall 4
709
 
710
   mov     ebx, Otstup * 65536 + 109
711
   mov     edx, superText.ld
7408 theonlymir 712
   mov     esi, superTextSize
7389 theonlymir 713
   mcall 4
714
 
715
   mov     ebx, 240 * 65536 + 74
716
   mov     edx, superText.ru
7408 theonlymir 717
   mov     esi, superTextSize
7389 theonlymir 718
   mcall 4
719
 
720
   mov     ebx, 240 * 65536 + 109
721
   mov     edx, superText.rd
7408 theonlymir 722
   mov     esi, superTextSize
7389 theonlymir 723
   mcall 4
724
 
725
   pop esi edi edx ecx ebx eax
726
   ret
727
 
728
 
7402 theonlymir 729
edMaxSize = 510 ;теперь с новым компонентом можно и 511 указать
7389 theonlymir 730
edMax = 0 ;max, size, pos
731
 
7402 theonlymir 732
align 4
733
editLU   edit_box 180,Otstup,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
734
editLD   edit_box 180,Otstup,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
735
editRU   edit_box 180,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
736
editRD   edit_box 180,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
7389 theonlymir 737
 
738
dataBuffer:
739
.1: rb 512
740
.2: rb 512
741
.3: rb 512
742
.4: rb 512
743
.size1: rd 1
744
.size2: rd 1
745
.size3: rd 1
746
.size4: rd 1
747
;255+255+2
748
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
749
dataBufferEnd:
750
 
7402 theonlymir 751
mouse_dd  dd ?
7389 theonlymir 752
sc  system_colors
753
 
754
I_END:
755
        rb 4096
756
align 16
757
STACKTOP:
758
 
759
MEM: