Box lib tree list/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
m (fix file include in example code)
 
(One intermediate revision by one other user not shown)
Line 126: Line 126:
include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'mem.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc
include 'svn/programs/dll.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc


@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0
Line 157: Line 157:
mcall 68,11
mcall 68,11


stdcall dword[tl_data_init], dword tree1
stdcall dword[tl_data_init], tree1


; читаем *.bmp файл с системными иконками
; читаем *.bmp файл с системными иконками
Line 167: Line 167:


mov [run_file_70.Buffer], eax
mov [run_file_70.Buffer], eax
mov eax,70 ;load icon file
mov [run_file_70.Function], 0
mov [run_file_70.Function], 0
mov [run_file_70.Position], 54
mov [run_file_70.Position], 54
Line 174: Line 173:
mov byte[run_file_70+20], 0
mov byte[run_file_70+20], 0
mov [run_file_70.FileName], file_name
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
mcall 70,run_file_70
int 0x40
cmp ebx,0
cmp ebx,0
jl @f
jl @f
Line 189: Line 187:


mov [run_file_70.Buffer], eax
mov [run_file_70.Buffer], eax
mov eax,70 ;load icon file
;mov [run_file_70.Function], 0
;mov [run_file_70.Function], 0
;mov [run_file_70.Position], 54
;mov [run_file_70.Position], 54
Line 196: Line 193:
mov byte[run_file_70+20], 0
mov byte[run_file_70+20], 0
mov [run_file_70.FileName], file_name
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
mcall 70,run_file_70
int 0x40
cmp ebx,0
cmp ebx,0
jl @f
jl @f
Line 206: Line 202:
align 4
align 4
red_win:
red_win:
  mcall 12,1
mcall 12,1


  xor eax,eax
xor eax,eax
  mov ebx,30*65536+320
mov ebx,30*65536+320
  mov ecx,25*65536+255
mov ecx,25*65536+255
  mov edx,[sc.work]
mov edx,[sc.work]
  or  edx,0x33000000
or  edx,0x33000000
  mov edi,hed
mov edi,hed
  mcall
mcall


  mov eax,8 ;кнопка
mov eax,8 ;кнопка
  mov ebx,215*65536+85
mov ebx,215*65536+85
  mov ecx,5*65536+15
mov ecx,5*65536+15
  mov edx,2
mov edx,2
  mov esi,[sc.work_button]
mov esi,[sc.work_button]
  int 0x40
int 0x40


  mov ebx,215*65536+60
mov ebx,215*65536+60
  mov ecx,25*65536+15
mov ecx,25*65536+15
  mov edx,3
mov edx,3
;  mov esi,0xffd000
;  mov esi,0xffd000
  int 0x40
int 0x40


  mov ebx,215*65536+85
mov ebx,215*65536+85
  mov ecx,45*65536+15
mov ecx,45*65536+15
  mov edx,4
mov edx,4
  int 0x40
int 0x40


  mov ecx,65*65536+15
mov ecx,65*65536+15
  mov edx,5
mov edx,5
  int 0x40
int 0x40


  mov ecx,85*65536+15
mov ecx,85*65536+15
  mov edx,6
mov edx,6
  int 0x40
int 0x40


  mov ecx,105*65536+15
mov ecx,105*65536+15
  mov edx,7
mov edx,7
  int 0x40
int 0x40


  mov ecx,125*65536+15
mov ecx,125*65536+15
  mov edx,8
mov edx,8
  int 0x40
int 0x40


  mov ecx,145*65536+15
mov ecx,145*65536+15
  mov edx,9
mov edx,9
  int 0x40
int 0x40


  mov ecx,165*65536+15
mov ecx,165*65536+15
  mov edx,10
mov edx,10
  int 0x40
int 0x40


  mov ecx,185*65536+15
mov ecx,185*65536+15
  mov edx,11
mov edx,11
  int 0x40
int 0x40


  mov ecx,205*65536+15
mov ecx,205*65536+15
  mov edx,12
mov edx,12
  int 0x40
int 0x40


  mov ebx,280*65536+20
mov ebx,280*65536+20
  mov ecx,25*65536+15
mov ecx,25*65536+15
  mov edx,100
mov edx,100
  mov esi,0xd0d0
mov esi,0xd0d0
  int 0x40
int 0x40


  mov eax,4 ;рисование текста
mov eax,4 ;рисование текста
  mov ebx,10*65536+25
mov ebx,10*65536+25
  mov ecx,[sc.work_button_text]
mov ecx,[sc.work_button_text]
  or  ecx,0x80000000
or  ecx,0x80000000
  mov edx,dword[node_data]
mov edx,dword[node_data]
  int 0x40
int 0x40


  mov eax,4 ;рисование текста
mov eax,4 ;рисование текста
  mov ebx,220*65536+10
mov ebx,220*65536+10
  mov edx,txt10
mov edx,txt10
  int 0x40
int 0x40


  mov ebx,220*65536+30
mov ebx,220*65536+30
  mov edx,txt11
mov edx,txt11
  int 0x40
int 0x40


  mov ebx,220*65536+50
mov ebx,220*65536+50
  mov edx,txt12
mov edx,txt12
  int 0x40
int 0x40


  mov ebx,220*65536+70
mov ebx,220*65536+70
  mov edx,txt13
mov edx,txt13
  int 0x40
int 0x40


  mov ebx,220*65536+90
mov ebx,220*65536+90
  mov edx,txt14
mov edx,txt14
  int 0x40
int 0x40


  mov ebx,220*65536+110
mov ebx,220*65536+110
  mov edx,txt15
mov edx,txt15
  int 0x40
int 0x40


  mov ebx,220*65536+130
mov ebx,220*65536+130
  mov edx,txt16
mov edx,txt16
  int 0x40
int 0x40


  mov ebx,220*65536+150
mov ebx,220*65536+150
  mov edx,txt17
mov edx,txt17
  int 0x40
int 0x40


  mov ebx,220*65536+170
mov ebx,220*65536+170
  mov edx,txt18
mov edx,txt18
  int 0x40
int 0x40


  mov ebx,220*65536+190
mov ebx,220*65536+190
  mov edx,txt19
mov edx,txt19
  int 0x40
int 0x40


  mov ebx,220*65536+210
mov ebx,220*65536+210
  mov edx,txt20
mov edx,txt20
  int 0x40
int 0x40


  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  stdcall [edit_box_draw], dword edit1
stdcall [edit_box_draw], dword edit1


  mov dword[wScr.all_redraw],1
mov dword[wScr.all_redraw],1
  stdcall [scrollbar_ver_draw], dword wScr
stdcall [scrollbar_ver_draw], dword wScr


  mcall 12,2
mcall 12,2


align 4
align 4
Line 349: Line 345:
key:
key:
mcall 2
mcall 2
stdcall [tl_key], dword tree1
stdcall [tl_key], tree1
stdcall [edit_box_key], dword edit1
stdcall [edit_box_key], dword edit1
jmp still
jmp still
Line 355: Line 351:
align 4
align 4
button:
button:
  mcall 17 ;получить код нажатой кнопки
mcall 17 ;получить код нажатой кнопки
  cmp ah,2
cmp ah,2
  jz  but_clear
jz  but_clear
  cmp ah,3
cmp ah,3
  jz  but_add_node
jz  but_add_node
  cmp ah,4
cmp ah,4
  jz  but_undo
jz  but_undo
  cmp ah,5
cmp ah,5
  jz  but_redo
jz  but_redo
  cmp ah,6
cmp ah,6
  jz  but_lev_add
jz  but_lev_add
  cmp ah,7
cmp ah,7
  jz  but_lev_dec
jz  but_lev_dec
  cmp ah,8
cmp ah,8
  jz  but_node_set_data
jz  but_node_set_data
  cmp ah,9
cmp ah,9
  jz  but_node_get_data
jz  but_node_get_data
  cmp ah,10
cmp ah,10
  jz  but_node_delete
jz  but_node_delete
  cmp ah,11
cmp ah,11
  jz  but_node_move_up
jz  but_node_move_up
  cmp ah,12
cmp ah,12
  jz  but_node_move_down
jz  but_node_move_down
  cmp ah,100
cmp ah,100
  jz  but_add_node_2
jz  but_add_node_2


  cmp ah,1
cmp ah,1
  jne still
jne still
.exit:
.exit:
;  stdcall mem.Free,[bmp_icon]
;  stdcall mem.Free,[bmp_icon]
  stdcall dword[tl_data_clear], dword tree1
stdcall dword[tl_data_clear], tree1
  mcall -1 ;выход из программы
mcall -1 ;выход из программы




align 4
align 4
mouse:
mouse:
  stdcall [tl_mouse], dword tree1
stdcall [tl_mouse], tree1
  stdcall [edit_box_mouse], dword edit1
stdcall [edit_box_mouse], dword edit1
  jmp still
jmp still


but_clear:
but_clear:
  stdcall dword[tl_info_clear], dword tree1
stdcall dword[tl_info_clear], tree1
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


;добавляем узел (иконка которого будет с индексом 0)
;добавляем узел (иконка которого будет с индексом 0)
but_add_node:
but_add_node:
  stdcall dword[tl_node_add], dword ed_buffer, dword 0, dword tree1
stdcall dword[tl_node_add], tree1, 0, ed_buffer
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


;добавляем узел (иконка которого будет с индексом 1)
;добавляем узел (иконка которого будет с индексом 1)
but_add_node_2:
but_add_node_2:
  stdcall dword[tl_node_add], dword ed_buffer, dword 0x10000, dword tree1
stdcall dword[tl_node_add], tree1, 0x10000, ed_buffer
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


but_undo:
but_undo:
  stdcall dword[tl_info_undo], dword tree1
stdcall dword[tl_info_undo], tree1
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


but_redo:
but_redo:
  stdcall dword[tl_info_redo], dword tree1
stdcall dword[tl_info_redo], tree1
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


but_lev_add:
but_lev_add:
  stdcall dword[tl_node_lev_inc], dword tree1
stdcall dword[tl_node_lev_inc], tree1
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


but_lev_dec:
but_lev_dec:
  stdcall dword[tl_node_lev_dec], dword tree1
stdcall dword[tl_node_lev_dec], tree1
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


;устанавливаем (новые) данные узла
;устанавливаем (новые) данные узла
but_node_set_data:
but_node_set_data:
  stdcall dword[tl_node_set_data], dword ed_buffer, dword tree1
stdcall dword[tl_node_set_data], tree1, ed_buffer
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


;берем указатель на данные узла
;берем указатель на данные узла
but_node_get_data:
but_node_get_data:
  stdcall dword[tl_node_get_data], dword tree1
push eax
  pop dword[node_data]
stdcall dword[tl_node_get_data], tree1
  jmp red_win ;still
mov dword[node_data], eax
pop eax
jmp red_win ;still


;удаляем узел
;удаляем узел
but_node_delete:
but_node_delete:
  stdcall dword[tl_node_delete], dword tree1
stdcall dword[tl_node_delete], tree1
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  jmp still
jmp still


;функция вызываемая при нажатии [Enter]
;функция вызываемая при нажатии [Enter]
align 4
align 4
fun_on_enter:
fun_on_enter:
  stdcall dword[tl_node_set_data], dword txt_on_enter, dword tree1
stdcall dword[tl_node_set_data], tree1, txt_on_enter
  stdcall dword[tl_draw], dword tree1
stdcall dword[tl_draw], tree1
  ret
ret


but_node_move_up:
but_node_move_up:
  stdcall dword[tl_node_move_up], dword tree1
stdcall dword[tl_node_move_up], tree1
  jmp still
jmp still


but_node_move_down:
but_node_move_down:
  stdcall dword[tl_node_move_down], dword tree1
stdcall dword[tl_node_move_down], tree1
  jmp still
jmp still


;подписи на кнопки
;подписи на кнопки
Line 481: Line 479:
align 4
align 4
boxlib_import:
boxlib_import:
  dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна
dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна


  edit_box_draw  dd sz_Edit_box_draw
edit_box_draw  dd sz_Edit_box_draw
   edit_box_key dd sz_Edit_box_key
edit_box_key   dd sz_Edit_box_key
  edit_box_mouse dd sz_Edit_box_mouse
edit_box_mouse dd sz_Edit_box_mouse
  version_ed dd sz_Version_ed
version_ed     dd sz_Version_ed


  scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
  scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
  scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
  scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
  version_scrollbar  dd sz_Version_scrollbar
version_scrollbar  dd sz_Version_scrollbar


  tl_data_init dd sz_tl_data_init
tl_data_init dd sz_tl_data_init
  tl_data_clear dd sz_tl_data_clear
tl_data_clear dd sz_tl_data_clear
  tl_info_clear dd sz_tl_info_clear
tl_info_clear dd sz_tl_info_clear
  tl_key dd sz_tl_key
tl_key dd sz_tl_key
  tl_mouse dd sz_tl_mouse
tl_mouse dd sz_tl_mouse
  tl_draw dd sz_tl_draw
tl_draw dd sz_tl_draw
  tl_info_undo dd sz_tl_info_undo
tl_info_undo dd sz_tl_info_undo
  tl_info_redo dd sz_tl_info_redo
tl_info_redo dd sz_tl_info_redo
  tl_node_add dd sz_tl_node_add
tl_node_add dd sz_tl_node_add
  tl_node_set_data dd sz_tl_node_set_data
tl_node_set_data dd sz_tl_node_set_data
  tl_node_get_data dd sz_tl_node_get_data
tl_node_get_data dd sz_tl_node_get_data
  tl_node_delete dd sz_tl_node_delete
tl_node_delete dd sz_tl_node_delete
  tl_cur_beg dd sz_tl_cur_beg
tl_cur_beg dd sz_tl_cur_beg
  tl_cur_next dd sz_tl_cur_next
tl_cur_next dd sz_tl_cur_next
  tl_cur_perv dd sz_tl_cur_perv
tl_cur_perv dd sz_tl_cur_perv
  tl_node_close_open dd sz_tl_node_close_open
tl_node_close_open dd sz_tl_node_close_open
  tl_node_lev_inc dd sz_tl_node_lev_inc
tl_node_lev_inc dd sz_tl_node_lev_inc
  tl_node_lev_dec dd sz_tl_node_lev_dec
tl_node_lev_dec dd sz_tl_node_lev_dec
  tl_node_move_up dd sz_tl_node_move_up
tl_node_move_up dd sz_tl_node_move_up
  tl_node_move_down dd sz_tl_node_move_down
tl_node_move_down dd sz_tl_node_move_down


dd 0,0
dd 0,0


  sz_lib_init db 'lib_init',0
sz_lib_init db 'lib_init',0


  sz_Edit_box_draw  db 'edit_box',0
sz_Edit_box_draw  db 'edit_box',0
  sz_Edit_box_key  db 'edit_box_key',0
sz_Edit_box_key  db 'edit_box_key',0
  sz_Edit_box_mouse db 'edit_box_mouse',0
sz_Edit_box_mouse db 'edit_box_mouse',0
  sz_Version_ed   db 'version_ed',0
sz_Version_ed   db 'version_ed',0


  sz_Scrollbar_ver_draw  db 'scrollbar_v_draw',0
sz_Scrollbar_ver_draw  db 'scrollbar_v_draw',0
  sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0
sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0
  sz_Scrollbar_hor_draw  db 'scrollbar_h_draw',0
sz_Scrollbar_hor_draw  db 'scrollbar_h_draw',0
  sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0
sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0
  sz_Version_scrollbar  db 'version_scrollbar',0
sz_Version_scrollbar  db 'version_scrollbar',0


  sz_tl_data_init db 'tl_data_init',0
sz_tl_data_init db 'tl_data_init',0
  sz_tl_data_clear db 'tl_data_clear',0
sz_tl_data_clear db 'tl_data_clear',0
  sz_tl_info_clear db 'tl_info_clear',0
sz_tl_info_clear db 'tl_info_clear',0
  sz_tl_key db 'tl_key',0
sz_tl_key db 'tl_key',0
  sz_tl_mouse db 'tl_mouse',0
sz_tl_mouse db 'tl_mouse',0
  sz_tl_draw db 'tl_draw',0
sz_tl_draw db 'tl_draw',0
  sz_tl_info_undo db 'tl_info_undo',0
sz_tl_info_undo db 'tl_info_undo',0
  sz_tl_info_redo db 'tl_info_redo',0
sz_tl_info_redo db 'tl_info_redo',0
  sz_tl_node_add db 'tl_node_add',0
sz_tl_node_add db 'tl_node_add',0
  sz_tl_node_set_data db 'tl_node_set_data',0
sz_tl_node_set_data db 'tl_node_set_data',0
  sz_tl_node_get_data db 'tl_node_get_data',0
sz_tl_node_get_data db 'tl_node_get_data',0
  sz_tl_node_delete db 'tl_node_delete',0
sz_tl_node_delete db 'tl_node_delete',0
  sz_tl_cur_beg db 'tl_cur_beg',0
sz_tl_cur_beg db 'tl_cur_beg',0
  sz_tl_cur_next db 'tl_cur_next',0
sz_tl_cur_next db 'tl_cur_next',0
  sz_tl_cur_perv db 'tl_cur_perv',0
sz_tl_cur_perv db 'tl_cur_perv',0
  sz_tl_node_close_open db 'tl_node_close_open',0
sz_tl_node_close_open db 'tl_node_close_open',0
  sz_tl_node_lev_inc db 'tl_node_lev_inc',0
sz_tl_node_lev_inc db 'tl_node_lev_inc',0
  sz_tl_node_lev_dec db 'tl_node_lev_dec',0
sz_tl_node_lev_dec db 'tl_node_lev_dec',0
  sz_tl_node_move_up db 'tl_node_move_up',0
sz_tl_node_move_up db 'tl_node_move_up',0
  sz_tl_node_move_down db 'tl_node_move_down',0
sz_tl_node_move_down db 'tl_node_move_down',0




Line 594: Line 592:
edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13
edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13
ed_buffer: db 'dataNode Text',0
ed_buffer: db 'dataNode Text',0
  rb 69
rb 69


txt_on_enter db '1111Enter',0
txt_on_enter db '1111Enter',0
hed db 'Tree (Image) List 13.06.10',0
hed db 'Tree (Image) List 17.11.15',0
sc system_colors


;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
err_message_import db 'Ошибка при импорте box_lib.obj',0
err_message_import db 'Ошибка при импорте box_lib.obj',0
  err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
  head_f_i:  
head_f_i:  
  head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
  system_path db '/sys/lib/'
system_path db '/sys/lib/'
  library_name db 'box_lib.obj',0
library_name db 'box_lib.obj',0


node_data dd 0
node_data dd 0
Line 612: Line 609:
mouse_dd dd ?
mouse_dd dd ?


i_end: ;конец кода
i_end: ;конец исполняемого файла программы
  rb 1024
sc system_colors
  cur_dir_path rb 4096
rb 2048
  library_path rb 4096
  file_name rb 4096
stacktop:
stacktop:
cur_dir_path rb 4096
library_path rb 4096
file_name rb 4096
mem:</syntaxhighlight>
mem:</syntaxhighlight>


[[Category: Кодинг]]
[[Category: Кодинг]]
[[Category: Библиотеки]]
[[Category: Библиотеки]]

Latest revision as of 19:15, 29 June 2016

Функции

  • tl_data_init - Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
  • tl_data_clear - Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
  • tl_info_clear - Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
  • tl_key - Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
  • tl_mouse - функция для событий от мыши.
  • tl_draw - полная перерисовка окна элемента.
  • tl_info_undo - Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
  • tl_info_redo - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
  • tl_node_add - Добавляет узел, в позицию указанную курсором. Пример добавления узла:

<syntaxhighlight lang="asm"> stdcall dword[tl_node_add], tree1, 0x10002, data_buffer</syntaxhighlight> где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.

  • tl_node_set_data - устанавливает новые данные (пользовательские и подпись) в узел под курсором.
  • tl_node_get_data - берет указатель на данные (пользовательские и подпись) из узла под курсором.
  • tl_node_delete - удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
  • tl_cur_beg - ставит курсор в начало списка, перематывает скроллинг если нужно.
  • tl_cur_next - переносит курсор на одну позицию ниже.
  • tl_cur_perv - переносит курсор на одну позицию выше.
  • tl_node_close_open - Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.
  • tl_node_lev_inc - Добавить уровень узла под курсором. Делает узел дочерним.
  • tl_node_lev_dec - Уменьшает уровень узла под курсором. Делает узел родительским.
  • tl_node_move_up - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:

<syntaxhighlight lang="asm"> push dword tree1

 call dword[tl_node_move_up] ;переместить узел</syntaxhighlight>

где: tree1 - структура tree_list

  • tl_node_move_down

Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции: <syntaxhighlight lang="asm"> push dword tree1

 call dword[tl_node_move_down] ;переместить узел</syntaxhighlight>

где: tree1 - структура tree_list

  • tl_node_poi_get_info - Берет внутренний указатель на структуру описывающую узел. Пример использования функции:

<syntaxhighlight lang="asm">stdcall dword[tl_node_poi_get_info], tree1, 0</syntaxhighlight> где: tree1 - структура tree_list; 0 - позиция узла, с которого берется указатель; eax - указатель на структуру описывающую узел.

  • tl_node_poi_get_next_info - берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
  • tl_node_poi_get_data - берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.

Функциями tl_node_poi_get_info, tl_node_poi_get_next_info и tl_node_poi_get_data можно считывать информацию о узлах элемента, при этом не меняя текущего положения курсора. Т. е. можно организовать доступ к данным элемента в "фоновом режиме".

  • tl_save_mem - Сохраняет информацию об узлах элемента в память. Пример использования функции:

<syntaxhighlight lang="asm"> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 stdcall dword[tl_save_mem], tree1, 0, node_data, MEM_SIZE</syntaxhighlight>

где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.

  • tl_load_mem - Загружает информацию об узлах элемента из памяти. Пример использования функции:

<syntaxhighlight lang="asm"> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 stdcall dword[tl_load_mem], tree1, 0, node_data, MEM_SIZE</syntaxhighlight>

где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.

  • tl_get_mem_size - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
  • version_tree_list - версия элемента

Структура tree_list

<syntaxhighlight lang="asm">struc tree_list info_size,info_max_count,style, img_cx,img_cy,\

   col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\
   info_capt_len,el_focus, p_scrol,on_press {
 .box_left   dd box_l
 .box_top    dd box_t
 .box_width  dd box_w
 .box_height dd box_h
 .data_info  dd 0
 .info_size  dw info_size
 .info_max_count dd info_max_count
 .style      dd style
 .data_nodes dd 0
 .data_img   dd 0
 .img_cx     dw img_cx
 .img_cy     dw img_cy
 .data_img_sys dd 0
 .ch_tim     dd 0
 .tim_undo   dd 0
 .cur_pos    dd 0
 .col_bkg    dd col_bkg
 .col_zag    dd col_zag
 .col_txt    dd col_txt
 .capt_cy    dw capt_cy
 .info_capt_offs dw info_capt_offs
 .info_capt_len  dw info_capt_len
 .el_focus    dd el_focus
 .p_scrol     dd p_scrol
 .on_press    dd on_press

}</syntaxhighlight>

  • info_size - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
  • info_max_count - максимальное количество узлов, которые можно добавить в элемент.
  • style - стили элемента.
  • data_nodes - указатель на внутренние структуры узлов (TreeList).
  • data_img - указатель на изображения с иконками узлов. Формат изображения такой же как и в сист. ф. 7: BBGGRRBBGGRR....
  • img_cx - ширина одной иконки.
  • img_cy - высота одной иконки.
  • data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов). Формат изображения такой же как и в сист. ф. 7: BBGGRRBBGGRR...
  • col_bkg - цвет фона.
  • col_zag - цвет строки заголовка (если она задана) и кнопок и ползунка вертикальной полосы прокрутки (если она есть).
  • col_txt - цвет текста.
  • capt_cy - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
  • info_capt_len - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
  • p_scrol - указатель на структуру скроллинга, связанного с данным элементом.
  • on_press - указатель на функцию, которая будет вызвана при нажатии [Enter]. Если указатель равен 0 то ничего не будет вызываться.

Пример создания структуры: <syntaxhighlight lang="asm">tree1 tree_list 24,500, tl_draw_par_line+tl_list_box_mode, 16,16,\

   0x8080ff,0x0000ff,0xffffff, 10,35,200-16,285, 14,4,0,\
   el_focus, wScr,fun_on_enter</syntaxhighlight>

Стили элемента

  • tl_key_no_edit

Элемент нельзя редактировать на клавиатуре (изменять уровни, удалять). Ставьте этот стиль если нужно создать элемент только для просмотра данных.

  • tl_draw_par_line

Рисовать линии к родительскому узлу.

  • tl_list_box_mode

Стиль не отображает уровни (как в ListBox все узлы одного уровня).

Пример

Пример использования элемента tree_list. Для компиляции в include нужно указать полный путь к папке svn. Программа использует 2 файла с иконками tl_sys_16.bmp и tl_nod_16.bmp из папки svn\programs\develop\libraries\box_lib\trunk. <syntaxhighlight lang="asm">use32 org 0x0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт dd 0x1 dd start dd i_end ; размер приложения dd mem dd stacktop dd file_name dd cur_dir_path

include 'svn/programs/macros.inc' include 'svn/programs/proc32.inc' include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac' include 'svn/programs/develop/libraries/box_lib/load_lib.mac' include 'svn/programs/dll.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc

@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0

struct FileInfoBlock Function dd ? Position dd ? Flags dd ? Count dd ? Buffer dd ? db ? FileName dd ? ends

fn_icon1 db 'tl_sys_16.bmp',0 fn_icon2 db 'tl_nod_16.bmp',0 bmp_icon dd 0 run_file_70 FileInfoBlock

align 4 start:

sys_load_library library_name, cur_dir_path, library_path, system_path, \ err_message_found_lib, head_f_l, boxlib_import, err_message_import, head_f_i

cmp eax,-1
jz button.exit

mcall 48,3,sc,sizeof.system_colors mcall 40,0x27 ;маска ожидаемых событий mcall 68,11

stdcall dword[tl_data_init], tree1

читаем *.bmp файл с системными иконками

copy_path fn_icon1,cur_dir_path,file_name,0

mov ecx,3*256*13 stdcall mem.Alloc,ecx mov [bmp_icon],eax

mov [run_file_70.Buffer], eax mov [run_file_70.Function], 0 mov [run_file_70.Position], 54 mov [run_file_70.Flags], 0 mov [run_file_70.Count], ecx mov byte[run_file_70+20], 0 mov [run_file_70.FileName], file_name mcall 70,run_file_70 cmp ebx,0 jl @f m2m dword[tree1.data_img_sys],dword[bmp_icon] @@:

читаем *.bmp файл с иконками узлов

copy_path fn_icon2,cur_dir_path,file_name,0

mov ecx,3*256*13 stdcall mem.Alloc,ecx mov [bmp_icon],eax

mov [run_file_70.Buffer], eax ;mov [run_file_70.Function], 0 ;mov [run_file_70.Position], 54 ;mov [run_file_70.Flags], 0 mov [run_file_70.Count], ecx mov byte[run_file_70+20], 0 mov [run_file_70.FileName], file_name mcall 70,run_file_70 cmp ebx,0 jl @f m2m dword[tree1.data_img],dword[bmp_icon] @@:

перерисовка окна

align 4 red_win: mcall 12,1

xor eax,eax mov ebx,30*65536+320 mov ecx,25*65536+255 mov edx,[sc.work] or edx,0x33000000 mov edi,hed mcall

mov eax,8 ;кнопка mov ebx,215*65536+85 mov ecx,5*65536+15 mov edx,2 mov esi,[sc.work_button] int 0x40

mov ebx,215*65536+60 mov ecx,25*65536+15 mov edx,3

mov esi,0xffd000

int 0x40

mov ebx,215*65536+85 mov ecx,45*65536+15 mov edx,4 int 0x40

mov ecx,65*65536+15 mov edx,5 int 0x40

mov ecx,85*65536+15 mov edx,6 int 0x40

mov ecx,105*65536+15 mov edx,7 int 0x40

mov ecx,125*65536+15 mov edx,8 int 0x40

mov ecx,145*65536+15 mov edx,9 int 0x40

mov ecx,165*65536+15 mov edx,10 int 0x40

mov ecx,185*65536+15 mov edx,11 int 0x40

mov ecx,205*65536+15 mov edx,12 int 0x40

mov ebx,280*65536+20 mov ecx,25*65536+15 mov edx,100 mov esi,0xd0d0 int 0x40

mov eax,4 ;рисование текста mov ebx,10*65536+25 mov ecx,[sc.work_button_text] or ecx,0x80000000 mov edx,dword[node_data] int 0x40

mov eax,4 ;рисование текста mov ebx,220*65536+10 mov edx,txt10 int 0x40

mov ebx,220*65536+30 mov edx,txt11 int 0x40

mov ebx,220*65536+50 mov edx,txt12 int 0x40

mov ebx,220*65536+70 mov edx,txt13 int 0x40

mov ebx,220*65536+90 mov edx,txt14 int 0x40

mov ebx,220*65536+110 mov edx,txt15 int 0x40

mov ebx,220*65536+130 mov edx,txt16 int 0x40

mov ebx,220*65536+150 mov edx,txt17 int 0x40

mov ebx,220*65536+170 mov edx,txt18 int 0x40

mov ebx,220*65536+190 mov edx,txt19 int 0x40

mov ebx,220*65536+210 mov edx,txt20 int 0x40

stdcall dword[tl_draw], tree1 stdcall [edit_box_draw], dword edit1

mov dword[wScr.all_redraw],1 stdcall [scrollbar_ver_draw], dword wScr

mcall 12,2

align 4 still: mcall 10

cmp al,0x1 ;изм. положение окна jz red_win cmp al,0x2 jz key cmp al,0x3 jz button cmp al,0x6 jz mouse jmp still

align 4 key: mcall 2 stdcall [tl_key], tree1 stdcall [edit_box_key], dword edit1 jmp still

align 4 button: mcall 17 ;получить код нажатой кнопки cmp ah,2 jz but_clear cmp ah,3 jz but_add_node cmp ah,4 jz but_undo cmp ah,5 jz but_redo cmp ah,6 jz but_lev_add cmp ah,7 jz but_lev_dec cmp ah,8 jz but_node_set_data cmp ah,9 jz but_node_get_data cmp ah,10 jz but_node_delete cmp ah,11 jz but_node_move_up cmp ah,12 jz but_node_move_down cmp ah,100 jz but_add_node_2

cmp ah,1 jne still .exit:

stdcall mem.Free,[bmp_icon]

stdcall dword[tl_data_clear], tree1 mcall -1 ;выход из программы


align 4 mouse: stdcall [tl_mouse], tree1 stdcall [edit_box_mouse], dword edit1 jmp still

but_clear: stdcall dword[tl_info_clear], tree1 stdcall dword[tl_draw], tree1 jmp still

добавляем узел (иконка которого будет с индексом 0)

but_add_node: stdcall dword[tl_node_add], tree1, 0, ed_buffer stdcall dword[tl_draw], tree1 jmp still

добавляем узел (иконка которого будет с индексом 1)

but_add_node_2: stdcall dword[tl_node_add], tree1, 0x10000, ed_buffer stdcall dword[tl_draw], tree1 jmp still

but_undo: stdcall dword[tl_info_undo], tree1 stdcall dword[tl_draw], tree1 jmp still

but_redo: stdcall dword[tl_info_redo], tree1 stdcall dword[tl_draw], tree1 jmp still

but_lev_add: stdcall dword[tl_node_lev_inc], tree1 stdcall dword[tl_draw], tree1 jmp still

but_lev_dec: stdcall dword[tl_node_lev_dec], tree1 stdcall dword[tl_draw], tree1 jmp still

устанавливаем (новые) данные узла

but_node_set_data: stdcall dword[tl_node_set_data], tree1, ed_buffer stdcall dword[tl_draw], tree1 jmp still

берем указатель на данные узла

but_node_get_data: push eax stdcall dword[tl_node_get_data], tree1 mov dword[node_data], eax pop eax jmp red_win ;still

удаляем узел

but_node_delete: stdcall dword[tl_node_delete], tree1 stdcall dword[tl_draw], tree1 jmp still

функция вызываемая при нажатии [Enter]

align 4 fun_on_enter: stdcall dword[tl_node_set_data], tree1, txt_on_enter stdcall dword[tl_draw], tree1 ret

but_node_move_up: stdcall dword[tl_node_move_up], tree1 jmp still

but_node_move_down: stdcall dword[tl_node_move_down], tree1 jmp still

подписи на кнопки

txt10 db 'List Clear',0 txt11 db 'Node add',0 txt12 db 'List Undo',0 txt13 db 'List Redo',0 txt14 db 'Node lev >>',0 txt15 db 'Node lev <<',0 txt16 db 'Node set data',0 txt17 db 'Node get data',0 txt18 db 'Node delete',0 txt19 db 'Node move ',24,0 ;24 up txt20 db 'Node move ',25,0 ;25 down

таблица импортируемых функций

align 4 boxlib_import: dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна

edit_box_draw dd sz_Edit_box_draw edit_box_key dd sz_Edit_box_key edit_box_mouse dd sz_Edit_box_mouse version_ed dd sz_Version_ed

scrollbar_ver_draw dd sz_Scrollbar_ver_draw scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse scrollbar_hor_draw dd sz_Scrollbar_hor_draw scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse version_scrollbar dd sz_Version_scrollbar

tl_data_init dd sz_tl_data_init tl_data_clear dd sz_tl_data_clear tl_info_clear dd sz_tl_info_clear tl_key dd sz_tl_key tl_mouse dd sz_tl_mouse tl_draw dd sz_tl_draw tl_info_undo dd sz_tl_info_undo tl_info_redo dd sz_tl_info_redo tl_node_add dd sz_tl_node_add tl_node_set_data dd sz_tl_node_set_data tl_node_get_data dd sz_tl_node_get_data tl_node_delete dd sz_tl_node_delete tl_cur_beg dd sz_tl_cur_beg tl_cur_next dd sz_tl_cur_next tl_cur_perv dd sz_tl_cur_perv tl_node_close_open dd sz_tl_node_close_open tl_node_lev_inc dd sz_tl_node_lev_inc tl_node_lev_dec dd sz_tl_node_lev_dec tl_node_move_up dd sz_tl_node_move_up tl_node_move_down dd sz_tl_node_move_down

dd 0,0

sz_lib_init db 'lib_init',0

sz_Edit_box_draw db 'edit_box',0 sz_Edit_box_key db 'edit_box_key',0 sz_Edit_box_mouse db 'edit_box_mouse',0 sz_Version_ed db 'version_ed',0

sz_Scrollbar_ver_draw db 'scrollbar_v_draw',0 sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0 sz_Scrollbar_hor_draw db 'scrollbar_h_draw',0 sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0 sz_Version_scrollbar db 'version_scrollbar',0

sz_tl_data_init db 'tl_data_init',0 sz_tl_data_clear db 'tl_data_clear',0 sz_tl_info_clear db 'tl_info_clear',0 sz_tl_key db 'tl_key',0 sz_tl_mouse db 'tl_mouse',0 sz_tl_draw db 'tl_draw',0 sz_tl_info_undo db 'tl_info_undo',0 sz_tl_info_redo db 'tl_info_redo',0 sz_tl_node_add db 'tl_node_add',0 sz_tl_node_set_data db 'tl_node_set_data',0 sz_tl_node_get_data db 'tl_node_get_data',0 sz_tl_node_delete db 'tl_node_delete',0 sz_tl_cur_beg db 'tl_cur_beg',0 sz_tl_cur_next db 'tl_cur_next',0 sz_tl_cur_perv db 'tl_cur_perv',0 sz_tl_node_close_open db 'tl_node_close_open',0 sz_tl_node_lev_inc db 'tl_node_lev_inc',0 sz_tl_node_lev_dec db 'tl_node_lev_dec',0 sz_tl_node_move_up db 'tl_node_move_up',0 sz_tl_node_move_down db 'tl_node_move_down',0


структура элемента tree_list

tree1 tree_list 24,500, tl_draw_par_line, 16,16, 0x8080ff,0x0000ff,0xffffff,\

   10,35,200-16,185, 14,4,0, el_focus, wScr,fun_on_enter
структура для дочернего скроллинга

align 4 wScr: .x: .size_x dw 16 ;+0 .start_x dw 210-16 ;+2 .y: .size_y dw 185 ;+4 .start_y dw 35 ;+6 .btn_high dd 15 ;+8 .type dd 1  ;+12 .max_area dd 100  ;+16 .cur_area dd 30  ;+20 .position dd 0  ;+24 .bckg_col dd 0xeeeeee ;+28 .frnt_col dd 0xbbddff ;+32 .line_col dd 0  ;+36 .redraw dd 0  ;+40 .delta dw 0  ;+44 .delta2 dw 0  ;+46 .run_x: .r_size_x dw 0  ;+48 .r_start_x dw 0  ;+50 .run_y: .r_size_y dw 0 ;+52 .r_start_y dw 0 ;+54 .m_pos dd 0 ;+56 .m_pos_2 dd 0 ;+60 .m_keys dd 0 ;+64 .run_size dd 0 ;+68 .position2 dd 0 ;+72 .work_size dd 0 ;+76 .all_redraw dd 0 ;+80 .ar_offset dd 1 ;+84

структура элемента editbox

edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13 ed_buffer: db 'dataNode Text',0 rb 69

txt_on_enter db '1111Enter',0 hed db 'Tree (Image) List 17.11.15',0

-------------------------------------------------------------------------------

err_message_import db 'Ошибка при импорте box_lib.obj',0 err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена head_f_i: head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки system_path db '/sys/lib/' library_name db 'box_lib.obj',0

node_data dd 0 el_focus dd tree1 mouse_dd dd ?

i_end: ;конец исполняемого файла программы sc system_colors rb 2048 stacktop: cur_dir_path rb 4096 library_path rb 4096 file_name rb 4096 mem:</syntaxhighlight>