;=============================================================================; ;============================[ 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: