Difference between revisions of "OpenDialog/ru"
(подключение через proc_lib.obj) |
|||
Line 7: | Line 7: | ||
*Диалог выбора директории. | *Диалог выбора директории. | ||
[[Image:OpenD3.png]] | [[Image:OpenD3.png]] | ||
− | <br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. | + | <br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей '''OpenDialog'''. Для использования OpenDialog была создана библиотека '''proc_lib.obj'''. |
==Пример== | ==Пример== | ||
Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''. | Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''. | ||
<asm>use32 | <asm>use32 | ||
− | + | org 0x0 | |
− | + | db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт | |
− | + | dd 0x1 | |
− | + | dd start | |
− | + | dd i_end ; размер приложения | |
− | + | dd mem | |
− | + | dd stacktop | |
− | + | dd 0x0 | |
− | + | dd sys_path | |
include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы | include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы | ||
− | include 'svn/programs/develop/libraries/box_lib/ | + | include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;макрос для загрузки библиотек |
− | include 'svn/programs/ | + | include 'svn/programs/proc32.inc' ;что-бы работали макросы stdcall |
− | + | ||
− | @use_library | + | @use_library |
align 4 | align 4 | ||
start: ;начало программы | start: ;начало программы | ||
+ | load_libraries l_libs_start,load_lib_end | ||
mcall 48,3,sc,sizeof.system_colors ;получить системные цвета | mcall 48,3,sc,sizeof.system_colors ;получить системные цвета | ||
mcall 40,0x25 ;маска ожидаемых событий | mcall 40,0x25 ;маска ожидаемых событий | ||
mcall 68,11 ;что-бы работали функции выделения/освобождения памяти | mcall 68,11 ;что-бы работали функции выделения/освобождения памяти | ||
− | + | stdcall [OpenDialog_Init],OpenDialog_data | |
align 4 | align 4 | ||
Line 40: | Line 41: | ||
align 4 | align 4 | ||
still: ;главный цикл | still: ;главный цикл | ||
− | + | mcall 10 | |
− | + | cmp al,0x1 ;изменилось положение окна ? | |
− | + | jz red_win | |
− | + | cmp al,0x3 ;нажали кнопку ? | |
− | + | jz button | |
− | + | jmp still | |
align 4 | align 4 | ||
Line 77: | Line 78: | ||
align 4 | align 4 | ||
button: | button: | ||
− | + | mcall 17 ;получить код нажатой кнопки | |
− | + | cmp ah,2 | |
− | + | jne @f | |
− | + | call but_open_dlg | |
− | + | @@: | |
− | + | cmp ah,1 | |
− | + | jne still | |
.exit: | .exit: | ||
− | + | mcall -1 ;выход из программы | |
align 4 | align 4 | ||
Line 92: | Line 93: | ||
copy_path open_dialog_name,communication_area_default_path,file_name,0 | copy_path open_dialog_name,communication_area_default_path,file_name,0 | ||
mov [OpenDialog_data.type],0 | mov [OpenDialog_data.type],0 | ||
− | + | stdcall [OpenDialog_Start],OpenDialog_data | |
cmp [OpenDialog_data.status],2 | cmp [OpenDialog_data.status],2 | ||
je @f | je @f | ||
Line 116: | Line 117: | ||
.filename_area dd filename_area ;+40 | .filename_area dd filename_area ;+40 | ||
.filter_area dd Filter | .filter_area dd Filter | ||
+ | .x: | ||
+ | .x_size dw 420 ;+48 ; Window X size | ||
+ | .x_start dw 10 ;+50 ; Window X position | ||
+ | .y: | ||
+ | .y_size dw 320 ;+52 ; Window y size | ||
+ | .y_start dw 10 ;+54 ; Window Y position | ||
communication_area_name: | communication_area_name: | ||
Line 132: | Line 139: | ||
.end: | .end: | ||
db 0 | db 0 | ||
+ | |||
+ | align 4 | ||
+ | proclib_import: ;описание экспортируемых функций | ||
+ | OpenDialog_Init dd aOpenDialog_Init | ||
+ | OpenDialog_Start dd aOpenDialog_Start | ||
+ | dd 0,0 | ||
+ | aOpenDialog_Init db 'OpenDialog_init',0 | ||
+ | aOpenDialog_Start db 'OpenDialog_start',0 | ||
+ | |||
+ | head_f_i: | ||
+ | head_f_l db 'Системная ошибка',0 | ||
+ | err_message_found_lib0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0 | ||
+ | err_message_import0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0 | ||
+ | |||
+ | system_dir0 db '/sys/lib/' | ||
+ | lib0_name db 'proc_lib.obj',0 | ||
+ | |||
+ | ;library structures | ||
+ | l_libs_start: | ||
+ | lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i | ||
+ | load_lib_end: | ||
hed db 'пример использования ',39,'OpenDialog',39,0 | hed db 'пример использования ',39,'OpenDialog',39,0 | ||
Line 141: | Line 169: | ||
procinfo process_information | procinfo process_information | ||
stacktop: | stacktop: | ||
− | + | sys_path: | |
rb 4096 | rb 4096 | ||
file_name: | file_name: | ||
Line 152: | Line 180: | ||
rb 256 | rb 256 | ||
mem:</asm> | mem:</asm> | ||
+ | |||
==Разработчик== | ==Разработчик== | ||
'''Mario''' | '''Mario''' |
Revision as of 11:07, 24 August 2010
Программа является подобием Windows компонента Microsoft Common Dialog Control или его аналогов в Linux (там их вообще несколько разных присутствует). Программа имеет 3 режима работы:
- Диалог выбора для открытия файла.
- Диалог выбора для сохранения файла.
- Диалог выбора директории.
Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. Для использования OpenDialog была создана библиотека proc_lib.obj.
Пример
Пример подключения диалога открытия файла. Для компиляции в инструкциях include нужно указать полный путь к папке svn. <asm>use32 org 0x0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт dd 0x1 dd start dd i_end ; размер приложения dd mem dd stacktop dd 0x0 dd sys_path
include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;макрос для загрузки библиотек include 'svn/programs/proc32.inc' ;что-бы работали макросы stdcall
@use_library
align 4 start: ;начало программы load_libraries l_libs_start,load_lib_end mcall 48,3,sc,sizeof.system_colors ;получить системные цвета mcall 40,0x25 ;маска ожидаемых событий mcall 68,11 ;что-бы работали функции выделения/освобождения памяти stdcall [OpenDialog_Init],OpenDialog_data
align 4 red_win: call draw_window
align 4 still: ;главный цикл mcall 10
cmp al,0x1 ;изменилось положение окна ? jz red_win cmp al,0x3 ;нажали кнопку ? jz button jmp still
align 4 draw_window:
mcall 12,1 ;начало прорисовки окна
xor eax,eax mov ebx,80*65536+250 mov ecx,80*65536+150 mov edx,[sc.work] or edx,0x33000000 mov edi,hed mcall ;вывод окна на экран, при повторном вызове игнорируется
mov ebx,10*65536+50 mov ecx,30*65536+20 mov edx,2 ;id для кнопки mov esi,[sc.work_button] ;системный цвет кнопки mcall 8 ;кнопка
mov ebx,15*65536+35 mov ecx,[sc.work_button_text] ;системный цвет текста на кнопке or ecx,0x80000000 mov edx,txt_open mcall 4 ;подпись кнопки mcall 12,2 ;конец прорисовки окна ret
align 4 button: mcall 17 ;получить код нажатой кнопки cmp ah,2 jne @f call but_open_dlg @@: cmp ah,1 jne still .exit: mcall -1 ;выход из программы
align 4 but_open_dlg: pushad copy_path open_dialog_name,communication_area_default_path,file_name,0 mov [OpenDialog_data.type],0 stdcall [OpenDialog_Start],OpenDialog_data cmp [OpenDialog_data.status],2 je @f ;код при удачном открытии диалога ;... @@: popad ret
- дынные для диалога открытия файлов
align 4 OpenDialog_data: .type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию .procinfo dd procinfo ;+4 .com_area_name dd communication_area_name ;+8 .com_area dd 0 ;+12 .opendir_path dd plugin_path ;+16 .dir_default_path dd openfile_path ;+20 .start_path dd file_name ;+24 путь к диалогу открытия файлов .draw_window dd draw_window ;+28 .status dd 0 ;+32 .openfile_path dd openfile_path ;+36 путь к открываемому файлу .filename_area dd filename_area ;+40 .filter_area dd Filter .x: .x_size dw 420 ;+48 ; Window X size .x_start dw 10 ;+50 ; Window X position .y: .y_size dw 320 ;+52 ; Window y size .y_start dw 10 ;+54 ; Window Y position
communication_area_name: db 'FFFFFFFF_open_dialog',0 open_dialog_name: db 'opendial',0 communication_area_default_path: db '/rd/1/File managers/',0
Filter: dd Filter.end - Filter.1 .1: db 'ASM',0 db 'INC',0 db 'TXT',0 .end: db 0
align 4 proclib_import: ;описание экспортируемых функций OpenDialog_Init dd aOpenDialog_Init OpenDialog_Start dd aOpenDialog_Start dd 0,0 aOpenDialog_Init db 'OpenDialog_init',0 aOpenDialog_Start db 'OpenDialog_start',0
head_f_i: head_f_l db 'Системная ошибка',0 err_message_found_lib0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0 err_message_import0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
system_dir0 db '/sys/lib/' lib0_name db 'proc_lib.obj',0
- library structures
l_libs_start: lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i load_lib_end:
hed db 'пример использования ',39,'OpenDialog',39,0 txt_open db 'Открыть',0 sc system_colors ;структура с системными цветами
i_end: ;конец кода rb 1024 procinfo process_information stacktop: sys_path: rb 4096 file_name: rb 4096 plugin_path: rb 4096 openfile_path: rb 4096 filename_area: rb 256 mem:</asm>
Разработчик
Mario
|