Difference between revisions of "OpenDialog/ru"

From KolibriOS wiki
Jump to navigation Jump to search
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 режима работы:

  • Диалог выбора для открытия файла.

OpenD1.png

  • Диалог выбора для сохранения файла.

OpenD2.png

  • Диалог выбора директории.

OpenD3.png
Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей 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