; ; Example for Box_lib: scrollbar, menubar, dinamic_button ; Copyright (c) 2009, Mario79 ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions are met: ; * Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; * Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; * Neither the name of the nor the ; names of its contributors may be used to endorse or promote products ; derived from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY Mario79 ''AS IS'' AND ANY ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;***************************************************************************** ; import_boxlib procedure written by ;--------------------------------------------------------------------- use32 org 0x0 db 'MENUET01' dd 0x01 dd START dd IM_END dd I_END dd stacktop dd 0x0 dd path include 'MACROS.INC' ;--------------------------------------------------------------------- ;--- Start of program ---------------------------------------------- ;--------------------------------------------------------------------- START: mcall 68, 11 mcall 66, 1, 1 mcall 40, 0x27 ;--------------------------------------------------------------------- ; Procinfo area for function 9 in MenuBar mcall 68,12,1024 mov [menu_data_1.procinfo],eax mov [menu_data_2.procinfo],eax ;--------------------------------------------------------------------- ; loading Box_Lib library mov ebx,boxlib_name mov esi,path mov edi,file_name call copy_path mcall 68,19,file_name ; load of alternative test eax,eax jnz @f mcall 68,19,system_dir ; load of sys directory test eax,eax jz button.exit @@: call import_boxlib ;--------------------------------------------------------------------- ; Load and convert BMP file for DinamicButton ; This procedures use cnv_bmp.obj and this module used only for ; demonstration of use DinamicButton ; mov ebx,plugin_BMP_name mov esi,path mov edi,file_name call copy_path mcall 68,19,file_name test eax,eax jz button.exit mov eax,[eax+4] mov [plugin],eax mov ebx,icons_file_name mov esi,path mov edi,file_name call copy_path mcall 70, fileinfo mov [fileinfo+0],dword 0 mov ecx,[file_info+32] mov [fileinfo+12],ecx mov [img_size],ecx mcall 68, 12 mov [fileinfo+16],eax mov [image_file],eax mcall 70, fileinfo xor eax,eax mov [return_code],eax mov eax,image_file call [plugin] mov ecx,[image_file] mcall 68, 13, cmp [return_code],dword 0 jne button.exit mov ebx,[raw_pointer] mov eax,[ebx+4] ; set of button size mov [dinamic_button_data_1.size_x],ax mov [dinamic_button_data_1.size_y],ax mov [dinamic_button_data_2.size_x],ax mov [dinamic_button_data_2.size_y],ax mov eax,[ebx+12] ; set of RAW resolution to pixel mov [dinamic_button_data_1.resolution_raw],eax mov [dinamic_button_data_2.resolution_raw],eax mov eax,[ebx+20] add eax,ebx ; set RAW palette, use else resolution 8bit or less mov [dinamic_button_data_1.palette_raw],eax mov [dinamic_button_data_2.palette_raw],eax mov eax,[ebx+28] add eax,ebx ; set RAW area for passive button mov [dinamic_button_data_1.passive_raw],eax mov [dinamic_button_data_2.passive_raw],eax mov ecx,[ebx+4] imul ecx,[ebx+4] imul ecx,[ebx+12] shr ecx,3 add eax,ecx ; set RAW area for active button mov [dinamic_button_data_1.active_raw],eax mov [dinamic_button_data_2.active_raw],eax add eax,ecx ; RAW area for click button mov [dinamic_button_data_1.click_raw],eax mov [dinamic_button_data_2.click_raw],eax ;--------------------------------------------------------------------- red: call draw_window still: mcall 10 cmp eax,1 je red cmp eax,2 je key cmp eax,3 je button cmp eax,6 je mouse jmp still ;--------------------------------------------------------------------- key: mcall 2 jmp still ;--------------------------------------------------------------------- button: mcall 17 cmp ah, 1 jne still .exit: mcall -1 ;--------------------------------------------------------------------- mouse: ;----------------------------------------------- cmp [scroll_bar_data_horizontal.delta2],0 jne .horizontal .vertical: mov eax,[scroll_bar_data_vertical.max_area] cmp eax,[scroll_bar_data_vertical.cur_area] jbe .horizontal ; mouse event for Vertical ScrollBar push dword scroll_bar_data_vertical call [scrollbar_ver_mouse] mov eax,scroll_bar_data_vertical.redraw xor ebx,ebx cmp [eax],ebx je @f mov [eax],ebx jmp .draw_cube @@: cmp [scroll_bar_data_vertical.delta2],0 jne still .horizontal: mov eax,[scroll_bar_data_horizontal.max_area] cmp eax,[scroll_bar_data_horizontal.cur_area] jbe .other ; mouse event for Horizontal ScrollBar push dword scroll_bar_data_horizontal call [scrollbar_hor_mouse] mov eax,scroll_bar_data_horizontal.redraw xor ebx,ebx cmp [eax],ebx je .other mov [eax],ebx .draw_cube: call draw_cube jmp still .other: cmp [scroll_bar_data_vertical.delta2],0 jne still cmp [scroll_bar_data_horizontal.delta2],0 jne still ;----------------------------------------------- .menu_bar_1: call .set_mouse_flag @@: ; mouse event for Menu 1 push dword menu_data_1 call [menu_bar_mouse] cmp [menu_data_1.click],dword 1 jne .menu_bar_2 cmp [menu_data_1.cursor_out],dword 0 jne analyse_out_menu_1 jmp .menu_bar_1 ;-------------------------------------------- .menu_bar_2: ; mouse event for Menu 2 push dword menu_data_2 call [menu_bar_mouse] cmp [menu_data_2.click],dword 1 jne .mouse_dinamic_button cmp [menu_data_2.cursor_out],dword 0 jne analyse_out_menu_2 jmp .menu_bar_1 ;-------------------------------------------- .mouse_dinamic_button: ; mouse event for Dinamic Button 1 push dword dinamic_button_data_1 call [dinamic_button_mouse] mov eax,dinamic_button_data_1.click cmp [eax],dword 1 jne @f mov [eax],dword 0 jmp about @@: ; mouse event for Dinamic Button 2 push dword dinamic_button_data_2 call [dinamic_button_mouse] mov eax,dinamic_button_data_2.click cmp [eax],dword 1 jne still ;@f mov [eax],dword 0 jmp button.exit ;--------------------------------------------------------------------- .set_mouse_flag: xor eax,eax inc eax mov [menu_data_1.get_mouse_flag],eax mov [menu_data_2.get_mouse_flag],eax ret ;--------------------------------------------------------------------- analyse_out_menu_1: ; analyse result of Menu 1 cmp [menu_data_1.cursor_out],dword 3 je button.exit jmp still analyse_out_menu_2: ; analyse result of Menu 2 cmp [menu_data_2.cursor_out],dword 2 je about jmp still ;--------------------------------------------------------------------- about: mcall 51,1,thread3,thread jmp still ;--------------------------------------------------------------------- draw_window: mcall 12, 1 mcall 0, <0,400>, <0,400>, 0x03AABBCC, 0x805080D0, 0x005080D0 mcall 71, 1, header_1 ;--------------------------------------------- ; draw for Menu 1 push dword menu_data_1 call [menu_bar_draw] ; draw for Menu 2 push dword menu_data_2 call [menu_bar_draw] ;--------------------------------------------- ; draw for Dinamic Button 1 push dword dinamic_button_data_1 call [dinamic_button_draw] ; draw for Dinamic Button 2 push dword dinamic_button_data_2 call [dinamic_button_draw] ;--------------------------------------------- ; set all_redraw flag for draw all ScrollBar ; In some cases it is necessity to draw only the area ; of moving of a "runner", for acceleration of output - ; in this case the flag needs to be reset to 0 (zero). xor eax,eax inc eax mov [scroll_bar_data_vertical.all_redraw],eax mov [scroll_bar_data_horizontal.all_redraw],eax ; draw for Vertical ScrollBar push dword scroll_bar_data_vertical call [scrollbar_ver_draw] ; draw for Horizontal ScrollBar push dword scroll_bar_data_horizontal call [scrollbar_hor_draw] ; reset all_redraw flag xor eax,eax mov [scroll_bar_data_vertical.all_redraw],eax mov [scroll_bar_data_horizontal.all_redraw],eax ;--------------------------------------------- call draw_cube mcall 12, 2 ret ;--------------------------------------------------------------------- draw_cube: mcall 13,<30,301>,<50,301>,0xafafaf mov ecx,[scroll_bar_data_vertical.position] add ecx,50 shl ecx,16 mov cx,30 mov ebx,[scroll_bar_data_horizontal.position] add ebx,30 shl ebx,16 mov bx,30 mcall 13, , , 0x0 ret ;--------------------------------------------------------------------- copy_path: xor eax,eax @@: cld lodsb stosb test eax,eax jnz @b mov esi,edi @@: std lodsb cmp al,'/' jnz @b mov edi,esi add edi,2 mov esi,ebx @@: cld lodsb stosb test eax,eax jnz @b ret ;--------------------------------------------------------------------- ; Import procedure written by ; Copyright (c) 2008, 2009, ; All rights reserved. ; importing Box_lib entry import_boxlib: ; initialize import mov edx, eax mov esi,myimport .import_loop: lodsd test eax, eax jz .import_done push edx .import_find: mov ebx, [edx] test ebx, ebx jz .exit ;import_not_found push eax @@: mov cl, [eax] cmp cl, [ebx] jnz .import_find_next test cl, cl jz .import_found inc eax inc ebx jmp @b .import_find_next: pop eax add edx, 8 jmp .import_find .import_found: pop eax mov eax, [edx+4] mov [esi-4], eax pop edx jmp .import_loop .import_done: ret .exit: add esp,4 jmp button.exit ;--------------------------------------------------------------------- include 'data.inc' include 'w_about.inc' IM_END: rb 1024 thread: rb 1024 stacktop: path: rb 4096 file_name: rb 4096 file_info: rb 40 I_END: