;===================================================================== ; Прорисовка объекта ; object ~Button~ (имеет фокус) ; Input: HL=описатель объекта ; Format table: ; +0 - номер объекта ~Claster check buttons" ; +1 - Xo левая позиция объекта ; +2 - Xi правая позиция объекта ; +3 - Y позиция объекта ; +4 - номер команды ; +5 - скен-код hot-клавиши ; +6 - контекст ;--------------------------------------------------------------------- ; Формат описателя: ; db Button ; номер объекта ; dw 0205h ; Yo,Xo ; db " ~O~k ",0 ; имя бутона ; db 18h ; скен-код hot-клавиши ; db cmOkey ; номер команды ; db 5 ; контекст ;===================================================================== PutButton: push iy inc iy ; пройти ячейку размера таблицы ld (iy+0),a ; +0 номер объекта ld a,(hl) ; X pos inc hl ld c,a add a,(ix+0) ; Pos X from begin screen ld (iy+1),a ; +1 Xo left ld a,(hl) ; Y pos inc hl ld b,a add a,(ix+1) ; Pos Y from begin screen ld (iy+3),a ;+3 Yo call GetPutA ex de,hl ld a,(color_array+24) ; цвет диал. окна ld c,a ld b,0 ; счетчик ширины бутона ld (iy+5),b ; hot-key ; вставить имя бутона ld a,(de) PButLp1:inc de cp "&" jr nz,PButN0 ; вставить hot-букву ld a,(de) ld (hl),a ; hot-букву в буфер inc hl inc de push bc ld a,(color_array+25) ; цвет hot-буквы диал. окна ld b,a ld a,c ; цвет бутона and 0F0h or b ld (hl),a ; атрибут pop bc inc hl inc b ld a,(de) inc de PButN0: ld (hl),a inc hl ld (hl),c inc hl inc b ld a,(de) or a jr nz,PButLp1 ; не конец имени inc de ld a,(de) ; скен-код hot-клавиши inc de ld (iy+5),a ; hot-клавиша ld a,(iy+1) ; Xi left add a,b ; + ширина бутона ld (iy+2),a ; Xi right ex de,hl ld a,(hl) ; описатель объекта inc hl ld (iy+4),a ; номер команды ld a,(hl) inc hl ld (iy+6),a ; контекст ld bc,7 ; размер таблицы объекта "Button" add iy,bc push iy exx pop hl pop de ; de=iy and a sbc hl,de ; de=DialTab+5 ld a,l ld (de),a ; размер таблицы объекта "Button" exx ret ;------------------------------------------------- ; Фокус на объект "Button" ;------------------------------------------------- ButtonI:ld de,color_array+34 ; цвет Selected buttons ld (set_dial_tmp_inv+1),de ld e,(ix+2) ; Xo left ld d,(ix+4) ; Y ld a,(ix+3) ; Xi right sub e ld c,a call SetDialInv ; выделить цветом ld hl,color_array+26 ; Selected title (объекта) ld (set_dial_tmp_inv+1),hl ; восст. ячейку ret ;===================================================================== ; ; Обработчик событий объектов "Button" ; ;===================================================================== EvButton: ld hl,what ; поле событий ld a,(hl) ;+0 inc hl cp evMouseFr jr z,EBmouse cp evKeyboard jp z,EBkeys cp evCombKey ret nz bit 7,(ix+1) ; sel or nosel ret nz ; объект уже выделен ld b,(hl) ;+1 what inc hl ld a,(hl) ;+2 what cp 56h ; курсор вправо jr z,tb__ push ix ld e,(ix+0) ; размер таблицы "Button" ld d,0 add ix,de bit 7,(ix+0) pop ix ret z ; еще не конец объектов cp 54h ; курсор влево jr z,tb__ ld a,b and 00111111b ; биты Ctrl, Alt ret nz ld a,(hl) ;+2 what cp 15+80h ; Tab скен-код+80h ret nz ; Shift+Tab tb__: xor a ld (_Push+1),a ; Push flag jp SetButton ; select my ; Событие - мышка EBmouse:ld e,(hl) ;+1 X coord inc hl ld d,(hl) ;+2 Y coord ld a,d cp (ix+4) ; Y pos button jr nz,get_fr ; if <> exit ld a,e bit 7,(ix+2) jr nz,$+6 cp (ix+2) ; Xo pos jr c,get_fr ; < bit 7,(ix+3) jr nz,get_fr cp (ix+3) ; Xi pos jr nc,get_fr ; > xor a inc a ld (_Push+1),a ; Push flag bit 7,(ix+1) jr nz,_Push jr SetButton ; Событие - обычная клавиша EBkeys: xor a ld (_Push+1),a ; Push flag ld a,(hl) ;+1 what код клавиши bit 7,(ix+1) ; Sel or nosel jr nz,EBkeyN cp 9 ; Tab jr z,SetButton ; if tab then set button jr EBkeyN1 ; EBkeyN: cp 0Dh ; Enter jr z,EBent EBkeyN1:inc hl ld a,(hl) ;+2 what скен-код cp (ix+6) ; hot-буква ret nz EBent: ld a,1 ld (_Push+1),a SetButton: call MoveObj ; Select Button call ResDialInv ; Reset previos invert ld ix,DialTab+5 ld de,color_array+34 ; цвет Selected buttons ld (set_dial_tmp_inv+1),de ld e,(ix+2) ; Xo ld d,(ix+4) ; Y ld a,(ix+3) ; Xi sub e ld c,a call SetDialInv ; выделить бутон цветом ld de,color_array+26 ; цвет Selected title (объекта) ld (set_dial_tmp_inv+1),de _Push: ld a,0 or a jr z,BTexit call PushBut ; засветить курсор ld hl,what ld (hl),evCommand inc hl ld a,(ix+5) ; номер команды ld (hl),a get_fr: jp get_fire ; ; Button exit BTexit: ld hl,what ld (hl),evNothing ret