Difference between revisions of "OpenDialog/ru"
m (moved OpenDialog to OpenDialog/ru: Add /ru) |
|||
Line 8: | Line 8: | ||
[[Image:OpenD3.png]] | [[Image:OpenD3.png]] | ||
<br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. | <br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. | ||
+ | ==Пример== | ||
+ | Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''. | ||
+ | <asm>use32 | ||
+ | org 0x0 | ||
+ | db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт | ||
+ | dd 0x1 | ||
+ | dd start | ||
+ | dd i_end ; размер приложения | ||
+ | dd mem | ||
+ | dd stacktop | ||
+ | dd 0x0 | ||
+ | dd cur_path | ||
+ | |||
+ | include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы | ||
+ | include 'svn/programs/develop/libraries/box_lib/asm/trunk/opendial.mac' ;макросы диалога открытия файлов | ||
+ | include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;отсюда используем макрос 'copy_path' | ||
+ | use_OpenDialog | ||
+ | @use_library ;библиотеки не подключаем, но это нужно для использования макроса 'copy_path' | ||
+ | |||
+ | align 4 | ||
+ | start: ;начало программы | ||
+ | mcall 48,3,sc,sizeof.system_colors ;получить системные цвета | ||
+ | mcall 40,0x25 ;маска ожидаемых событий | ||
+ | mcall 68,11 ;что-бы работали функции выделения/освобождения памяти | ||
+ | init_OpenDialog 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 | ||
+ | start_OpenDialog 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 | ||
+ | |||
+ | 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 | ||
+ | |||
+ | hed db 'пример использования ',39,'OpenDialog',39,0 | ||
+ | txt_open db 'Открыть',0 | ||
+ | sc system_colors ;структура с системными цветами | ||
+ | |||
+ | i_end: ;конец кода | ||
+ | rb 1024 | ||
+ | procinfo process_information | ||
+ | stacktop: | ||
+ | cur_path: | ||
+ | rb 4096 | ||
+ | file_name: | ||
+ | rb 4096 | ||
+ | plugin_path: | ||
+ | rb 4096 | ||
+ | openfile_path: | ||
+ | rb 4096 | ||
+ | filename_area: | ||
+ | rb 256 | ||
+ | mem:</asm> | ||
==Разработчик== | ==Разработчик== | ||
'''Mario''' | '''Mario''' |
Revision as of 10:46, 12 June 2010
Программа является подобием Windows компонента Microsoft Common Dialog Control или его аналогов в Linux (там их вообще несколько разных присутствует). Программа имеет 3 режима работы:
- Диалог выбора для открытия файла.
- Диалог выбора для сохранения файла.
- Диалог выбора директории.
Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog.
Пример
Пример подключения диалога открытия файла. Для компиляции в инструкциях include нужно указать полный путь к папке svn. <asm>use32
org 0x0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт dd 0x1 dd start dd i_end ; размер приложения dd mem dd stacktop dd 0x0 dd cur_path
include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы include 'svn/programs/develop/libraries/box_lib/asm/trunk/opendial.mac' ;макросы диалога открытия файлов include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;отсюда используем макрос 'copy_path' use_OpenDialog @use_library ;библиотеки не подключаем, но это нужно для использования макроса 'copy_path'
align 4 start: ;начало программы mcall 48,3,sc,sizeof.system_colors ;получить системные цвета mcall 40,0x25 ;маска ожидаемых событий mcall 68,11 ;что-бы работали функции выделения/освобождения памяти init_OpenDialog 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 start_OpenDialog 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
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
hed db 'пример использования ',39,'OpenDialog',39,0 txt_open db 'Открыть',0 sc system_colors ;структура с системными цветами
i_end: ;конец кода rb 1024 procinfo process_information stacktop: cur_path: rb 4096 file_name: rb 4096 plugin_path: rb 4096 openfile_path: rb 4096 filename_area: rb 256 mem:</asm>
Разработчик
Mario
|