forked from KolibriOS/kolibrios
ffd240bc4f
git-svn-id: svn://kolibrios.org@4813 a494cfbc-eb01-0410-851d-a64ba20cac60
193 lines
8.4 KiB
NASM
193 lines
8.4 KiB
NASM
;=============================================================================;
|
||
;============================[ HEADER ]===========================;
|
||
;=============================================================================;
|
||
use32
|
||
org 0x0
|
||
|
||
db 'MENUET01'
|
||
dd 0x01
|
||
dd START
|
||
dd I_END
|
||
dd 0x100000
|
||
dd 0x100000
|
||
dd 0x0
|
||
dd 0x0
|
||
|
||
include 'macros.inc'
|
||
;=============================================================================;
|
||
;============================[ EVENTS ]===========================;
|
||
;=============================================================================;
|
||
START:
|
||
mcall 40,0xC0000027 ; устанавливаем маску событий
|
||
call button_init ; устанавливаем параметры кнопок
|
||
|
||
mov eax,48 ; Функция 48 - стили отображения окон
|
||
mov ebx,3 ; Подфункция 3 - получить стандартные цвета окон.
|
||
mov ecx,sc ; Указатель на буфер размером edx байт, под структуру
|
||
mov edx,200 ; Размер таблицы цветов (должен быть 40 байт)
|
||
int 0x40 ; Прерывание
|
||
|
||
mov eax,48 ; Функция 48 - стили отображения окон
|
||
mov ebx,2 ; Подфункция 3 - получить стандартные цвета окон.
|
||
mov ecx,sc ; Указатель на буфер размером edx байт, под структуру
|
||
mov edx,200 ; Размер таблицы цветов (должен быть 40 байт)
|
||
int 0x40 ; Прерывание
|
||
|
||
mov eax,48 ; Функция 48 - стили отображения окон
|
||
mov ebx,3 ; Подфункция 3 - получить стандартные цвета окон.
|
||
mov ecx,sc ; Указатель на буфер размером edx байт, под структуру
|
||
mov edx,200 ; Размер таблицы цветов (должен быть 40 байт)
|
||
int 0x40 ; Прерывание
|
||
|
||
red:
|
||
call draw_window
|
||
still:
|
||
mov eax,10 ; функция 10 - ждать события
|
||
int 0x40
|
||
cmp eax,1 ; перерисовать окно ?
|
||
je red ; если да - на метку red
|
||
cmp eax,2 ; нажата клавиша ?
|
||
je key ; если да - на key
|
||
cmp eax,3 ; нажата кнопка ?
|
||
je button ; если да - на button
|
||
cmp eax,6
|
||
je mouse
|
||
jmp still ; если другое событие - в начало цикла
|
||
;end_still
|
||
|
||
key: ; нажата клавиша на клавиатуре
|
||
mov eax,2 ; функция 2 - считать код символа (в ah) (тут в принципе не нужна)
|
||
int 0x40
|
||
jmp still ; вернуться к началу цикла
|
||
;end_key
|
||
|
||
button:
|
||
mov eax,17 ; 17 - получить идентификатор нажатой кнопки
|
||
int 0x40
|
||
cmp ah, 1 ; если нажата кнопка с номером 1,
|
||
jz bexit ; выходим
|
||
jmp still
|
||
bexit:
|
||
mov eax,-1 ; иначе конец программы
|
||
int 0x40
|
||
;end_button
|
||
|
||
mouse:
|
||
; ; нажата ли лкм
|
||
call draw_edit
|
||
call mouse_local ; получаем координаты мыши относительно окна
|
||
call button_calc ; отслеживаем наведение курсора
|
||
call process_slot ; получаем позицию в оконном стеке
|
||
call button_draw ; отрисовываем кнопки
|
||
jmp still ; уходим на ожидание события
|
||
|
||
|
||
;============================[ CODE ]===========================;
|
||
|
||
ret
|
||
;end_draw_result
|
||
|
||
|
||
;#___________________________________________________________________________________________________
|
||
;****************************************************************************************************|
|
||
; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ |
|
||
;----------------------------------------------------------------------------------------------------/
|
||
draw_window:
|
||
mov eax,12 ; функция 12: означает, что будет рисоваться окно
|
||
mov ebx,1 ; 1,начало рисования
|
||
int 0x40 ; Прерывание
|
||
|
||
|
||
|
||
mov eax,48 ; Функция 48 - стили отображения окон.
|
||
mov ebx,4 ; Подфункция 4 - возвращает eax = высота скина.
|
||
int 0x40 ; Прерывание
|
||
mov ecx,eax ; Запоминаем высоту скина
|
||
|
||
xor eax,eax ; Очищаем eax (mov eax,0) (Функция 0)
|
||
mov ebx,200 shl 16+240 ; [координата по оси x]*65536 + [размер по оси x]
|
||
add ecx,200 shl 16+280 ; Высота скина + [координата по y]*65536 + [размер по y]
|
||
mov edx,[sc.win_body] ; Видимо стиль окна по дефолту
|
||
or edx,0x34000000 ; Или окно со скином фиксированных размеров
|
||
mov edi,title ; Заголовок окна
|
||
int 0x40 ; Прерывание
|
||
|
||
call process_slot ; получаем позицию в оконном стеке
|
||
call button_draw
|
||
call draw_edit
|
||
call list_draw
|
||
|
||
mov eax,12 ; функция 12: означает, что будет рисоваться окно
|
||
mov ebx,2 ; 1,начало рисования
|
||
int 0x40 ; Прерывание
|
||
|
||
ret
|
||
|
||
|
||
|
||
;===================================[ DATA ]==================================;
|
||
include 'inc/mouse.inc' ; мышь
|
||
include 'inc/process.inc' ; инфо о процессе
|
||
include 'inc/dtp.inc' ; структура новой таблицы
|
||
include 'inc/button.inc' ; самописные кнопки
|
||
include 'inc/edit.inc' ; эмуляция неактивного едита
|
||
include 'inc/list.inc' ; отрисовка списка
|
||
|
||
;; window -------------------------------------------------
|
||
sc new_colors ; новая таблица цветов
|
||
title db 'Color Table',0 ; заголовок
|
||
mouse_x dd 0 ; хранит глобальную х координату мыши
|
||
mouse_y dd 0 ; хранит глобальную у координату мыши
|
||
mouse_l dd 0 ; левая кнопка 1 - нажата 0 - нет
|
||
win_slot dd 0 ; 0- окно не на верху, 1- на верху
|
||
buffer rb 80 ; под 9 функцию
|
||
|
||
;; button -------------------------------------------------
|
||
bnext new_button
|
||
bback new_button
|
||
arrowa:
|
||
file 'l.raw'
|
||
arrowb:
|
||
file 'r.raw'
|
||
;; edit ---------------------------------------------------
|
||
edit_cnt dd 1 ; counter
|
||
edit_win db 'WINDOW',0 ; 1
|
||
edit_btn db 'BUTTON',0 ; 2
|
||
edit_gui db 'ELEMENT',0 ; 3
|
||
edit_cld db 'SUPPORT',0 ; 4
|
||
|
||
;; list win -----------------------------------------------
|
||
text_frame db 'Frame (Activate):',0
|
||
text_inframe db 'Frame (Inactivate):',0
|
||
text_fcframe db 'Frame (Focus):',0
|
||
text_face db 'Face (Activate):',0
|
||
text_inface db 'Face (Inactivate):',0
|
||
text_fcface db 'Face (Focus):',0
|
||
text_border db 'Border (Activate):',0
|
||
text_inborder db 'Border (Inactivate):',0
|
||
text_wtext db 'Text:',0
|
||
text_graytext db 'Graytext:',0
|
||
text_title db 'Title:',0
|
||
text_body db 'Body:',0
|
||
text_reserved db 'Reserved:',0
|
||
text_text db 'Text (Activate):',0
|
||
text_intext db 'Text (Inactivate):',0
|
||
text_fctext db 'Text (Focus):',0
|
||
text_3dlight db '3D Light:',0
|
||
text_3ddark db '3D Dark:',0
|
||
text_3dface db '3D Face:',0
|
||
text_shadow db 'Shadow:',0
|
||
text_select db 'Select:',0
|
||
text_p_face db 'Panel Body:',0
|
||
text_p_frame db 'Panel Frame:',0
|
||
text_p_text db 'Panel Text:',0
|
||
text_m_face db 'Menu Body:',0
|
||
text_m_frame db 'Menu Frame:',0
|
||
text_m_text db 'Menu Text:',0
|
||
text_h_face db 'Hint Body:',0
|
||
text_h_frame db 'Hint Frame:',0
|
||
text_h_text db 'Hint Text:',0
|
||
text_hex db '#',0
|
||
;----------------------------------------------------------
|
||
I_END:
|