Page 19 of 29

Re: box_lib.obj - библиотека gui компонентов

Posted: Sat Oct 19, 2013 9:30 pm
by Heavyiron
О, спасибо, кое-что начало доходить.

Re: box_lib.obj - библиотека gui компонентов

Posted: Mon Oct 28, 2013 11:42 am
by 0CodErr
У меня progressbar_draw получилась не thread-safe из-за
; ............................
mov [.last_esp], esp
; ............................
mov esp, [.last_esp]
; ............................
.last_esp dd 0
Я нигде не нашёл таких требований к этой библиотеке, но, думаю, что лучше было бы переделать.

Re: box_lib.obj - библиотека gui компонентов

Posted: Mon Oct 28, 2013 12:16 pm
by Mario_r4
Ты специально так пишешь? Я опять ни хрена не понял.

Re: box_lib.obj - библиотека gui компонентов

Posted: Mon Oct 28, 2013 12:47 pm
by 0CodErr
Mario_r4, вот полностью подпрограмма полной перерисовки ProgressBar-а:
Spoiler:

Code: Select all

progressbar_draw:
        pushad
        mov    ebp, esp        
; draw frame
        push   ebp
        mov    [.last_esp], esp
        mov    eax, pb
        mov    esi, [eax + PB_LEFT]
        mov    edi, [eax + PB_TOP]
        mov    ebp, [eax + PB_WIDTH]
        add    ebp, esi
        dec    ebp
        mov    esp, [eax + PB_HEIGHT]
        add    esp, edi
        dec    esp
        mov    edx, [eax + PB_FRAME_COLOR]
        mov    eax, 38
        mov    ebx, esi
        shl    ebx, 16
        add    ebx, ebp
        mov    ecx, edi
        shl    ecx, 16
        add    ecx, edi
        int    64
        mov    ecx, esp
        shl    ecx, 16
        add    ecx, esp
        int    64    
        mov    bx, si
        mov    ecx, edi
        shl    ecx, 16
        add    ecx, esp
        int    64    
        mov    ebx, ebp
        shl    ebx, 16
        add    ebx, ebp
        int    64      
        mov    esp, [.last_esp]
        pop    ebp
; if min > max then .skip
        mov    eax, pb
        mov    edx, [eax + PB_MAX]
        mov    ecx, [eax + PB_MIN]
        cmp    ecx, edx
        ; jg     .skip
        jne    .min_no_eq_max
        dec    edx
.min_no_eq_max:        
; draw all progress rectangle
        call   get_progress_width
        mov    edi, eax
        mov    eax, pb        
        mov    ebx, [eax + PB_LEFT]
        inc    ebx
        shl    ebx, 16
        add    ebx, edi
        mov    ecx, [eax + PB_TOP]
        inc    ecx
        shl    ecx, 16
        add    ecx, [eax + PB_HEIGHT]
        dec    ecx
        dec    ecx
        mov    edx, [eax + PB_PROGRESS_COLOR]
        mov    eax, 13
        int    64
; draw last part of non-progress rectangle
; edi = pW, esi = W - 2 
        sub    esi, edi ; width
        shr    ebx, 16
        add    ebx, edi
        shl    ebx, 16
        add    ebx, esi
        mov    esi, pb
        mov    edx, [esi + PB_BACK_COLOR]
        int    64        
; .skip:
        popad
        ret    4
.last_esp dd 0
Ведь несколько потоков, вызывающих её одновременно, могут неправильно работать? Или если ядро создаст копию страницы, то всё будет нормально?

Re: box_lib.obj - библиотека gui компонентов

Posted: Mon Oct 28, 2013 12:55 pm
by Mario_r4
0CodErr
Каждый поток должен работать со своим блоком данных. Не нужно создавать самому себе проблемы.

Re: box_lib.obj - библиотека gui компонентов

Posted: Sun Nov 03, 2013 5:47 pm
by Mario_r4
SVN r.4154 - FileBrowser проверка данных перед выделением файлов (клавиша Insert или правый клик мыши в OpenDialog).

Re: box_lib.obj - библиотека gui компонентов

Posted: Sun Nov 03, 2013 6:02 pm
by Mario_r4
SVN r.4155 - FileBrowser проверка данных перед: выделением всех файлов, снятием выделения всех файлов и инвертированием выделения всех файлов.

Re: box_lib.obj - библиотека gui компонентов

Posted: Sun Nov 17, 2013 4:07 pm
by 0CodErr
ProgressBar example:
PB_test.7z (1.56 KiB)
pb_test.asm + pb_test.kex + make.bat
compile with fasm or nasm
Downloaded 272 times

Re: box_lib.obj - библиотека gui компонентов

Posted: Tue Nov 19, 2013 10:10 pm
by e-andrew
Не знаю даже, нужно ли это в новую тему...
Slidebox
Структура:

Code: Select all

struct slidebox
    x	     dd ?     ; 000        ; Начало блока
    y	     dd ?     ; 004        ; 
    width    dd ?     ; 008        ; Ширина блока (высота равна 20px)
    text     dd ?     ; 012        ; Текст
    _button  dd ?     ; 016        ; 0x60000000 + ID кнопки, автоматически устанавливается библиотекой, МЕНЯТЬ НЕЛЬЗЯ!!!!
    on_click dd ?     ; 020        ; Адрес процедуры, которая будет вызываться при клике, если 0, то вызывается пустая процедура(определена в библиотеке)
    color    dd ?     ; 024        ; Адрес на структуру system_colors
    value    db ?     ; 028        ; Значение (1/0). Динамически меняется
ends
Блок слайдбокса - область, на которой рисуется слайдбокс, текст и кнопка. Кнопка занимает всю область.

[The extension bmp has been deactivated and can no longer be displayed.]


Процедуры:
1) slidebox.init (_slidebox)
Инициализирует слайдбокс, по сути просто устанавливает ID кнопки и процедуру клика. В качестве параметра нужно передать адрес на структуру _slidebox.
2)slidebox.draw (_slidebox)
Рисует кнопку, текст и сам слайдбокс. В качестве параметра нужно передать адрес на структуру _slidebox.
3) slidebox.update_button (btn, _slidebox)
Проверяет нажатие на слайдбокс. При нажатии меняет значение и вызывает процедуру [_slidebox.on_click]. В качестве параметра нужно передать результат возврата сф 17 и адрес на структуру _slidebox.
Пока что слайдбокс написан в INC файле, но это сделано для упрощения тестинга.
Пример 1: при нажатии на кнопку у окна будет появляться/исчезать заголовок, в зависимости от значения слайдбокса.
Spoiler:

Code: Select all

    use32
    org     0x0
;-------------------------------------------------------------------------------
    db	    "MENUET01"
    dd	    1, @code, @data, @mem, @stack, 0, 0
;-------------------------------------------------------------------------------
    include "macros.inc"
    include "slidebox_flat.inc"
;===============================================================================
@code:
    mcall   48, 3, color, 40
;-------------------------------------------------------------------------------
    mov     [slidebox1.x],     10
    mov     [slidebox1.y],     10
    mov     [slidebox1.width], 226
    mov     [slidebox1.text],  slidebox1_text
    mov     [slidebox1.value], 0
    mov     [slidebox1.color], color

    push    slidebox1
    call    slidebox.init
;-------------------------------------------------------------------------------
main_loop:
    mcall   10
    cmp     eax, EV_REDRAW
    je	    event_redraw
    cmp     eax, EV_BUTTON
    je	    event_button

    jmp     main_loop
;-------------------------------------------------------------------------------
exit:
    mcall   -1
;-------------------------------------------------------------------------------
event_redraw:
    call    win.draw
    jmp     main_loop
;-------------------------------------------------------------------------------
event_button:
    mcall   17
    cmp     ah, 1
    je	    exit
    cmp     ah, 2
    je	    .header_apply

    push    slidebox1
    push    eax
    call    slidebox.update_button

    jmp     main_loop

 .header_apply:
    cmp     [slidebox1.value], byte 1
    je	    @f
    mcall   71, 1, 0
    jmp     main_loop
  @@:
    mcall   71, 1, win.title
    jmp     main_loop
;-------------------------------------------------------------------------------
win.draw:
    mcall   12, 1

    mov     edx, [color.work]
    or	    edx, 0x34000000
    mcall   0, <128, 256>, <128, 96>

    mcall   8, <168, 64>, <42, 20>, 2, [color.work_button]
    mcall   4, <186, 49>, [color.work_button_text], button1_text, 5

    push    slidebox1
    call    slidebox.draw

    mcall   12, 2

    ret
;===============================================================================
slidebox1_text:
    db	    "Draw header", 0
button1_text:
    db	    "Apply", 0
win.title:
    db	    "Slidebox example", 0
@data:
;===============================================================================
    rb	    2048
@stack:
;-------------------------------------------------------------------------------
color	    system_colors
slidebox1   slidebox

@mem:
Пример 2: при нажатии на слайдбокс у окна будет появляться/исчезать заголовок, в зависимости от значения слайдбокса.
Spoiler:

Code: Select all

    use32
    org     0x0
;-------------------------------------------------------------------------------
    db	    "MENUET01"
    dd	    1, @code, @data, @mem, @stack, 0, 0
;-------------------------------------------------------------------------------
    include "macros.inc"
    include "slidebox.inc"
;===============================================================================
@code:
    mcall   48, 3, color, 40
;-------------------------------------------------------------------------------
    mov     [slidebox1.x],     10
    mov     [slidebox1.y],     10
    mov     [slidebox1.width], 226
    mov     [slidebox1.text],  slidebox1_text
    mov     [slidebox1.value], 0
    mov     [slidebox1.color], color
    mov     [slidebox1.on_click], slidebox1.event_click

    push    slidebox1
    call    slidebox.init
;-------------------------------------------------------------------------------
main_loop:
    mcall   10
    cmp     eax, EV_REDRAW
    je	    event_redraw
    cmp     eax, EV_BUTTON
    je	    event_button

    jmp     main_loop
;-------------------------------------------------------------------------------
exit:
    mcall   -1
;-------------------------------------------------------------------------------
event_redraw:
    call    win.draw
    jmp     main_loop
;-------------------------------------------------------------------------------
event_button:
    mcall   17
    cmp     ah, 0x01
    je	    exit

    push    slidebox1
    push    eax
    call    slidebox.update_button

    jmp     main_loop
;-------------------------------------------------------------------------------
win.draw:
    mcall   12, 1

    mov     edx, [color.work]
    or	    edx, 0x34000000
    mcall   0, <128, 256>, <128, 64>

    push    slidebox1
    call    slidebox.draw

    mcall   12, 2

    ret
;-------------------------------------------------------------------------------
slidebox1.event_click:
    cmp     [slidebox1.value], byte 1
    je	    @f
    mcall   71, 1, 0
    ret
  @@:
    mcall   71, 1, win.title
    ret
;===============================================================================
slidebox1_text:
    db	    "Draw header", 0
win.title:
    db	    "Slidebox example", 0
@data:
;===============================================================================
    rb	    2048
@stack:
;-------------------------------------------------------------------------------
color	    system_colors
slidebox1   slidebox

@mem:

В архиве две версии slidebox.
slidebox.7z (1.58 KiB)
Downloaded 277 times

Re: box_lib.obj - библиотека gui компонентов

Posted: Fri Nov 22, 2013 1:27 am
by Leency
Не поленился собрал. Ну чё, круто :) В Колибри такого user experience'a ещё не было.
Только определись со стилем. Желательно, чтобы был один вариант дизайна.

Re: box_lib.obj - библиотека gui компонентов

Posted: Sun Nov 24, 2013 1:59 am
by hidnplayr
How can one make the scrollbar work with scrollwheel?
I had hoped to set a bit to mark a scrollbar as active, and this scrollbar then accepts the mouse events...

Is it true that I need to manually catch the events, and increase/decrease values in the scrollbar structure?

Re: box_lib.obj - библиотека gui компонентов

Posted: Sun Nov 24, 2013 2:23 am
by Mario_r4
ScrollBar by itself does not work with scrollwheel. So yes, you have to do it yourself.

Re: box_lib.obj - библиотека gui компонентов

Posted: Mon Jan 06, 2014 4:02 am
by punk_joker
По поводу edit'а
Так понимаю:
shift - позиция после начала выделения
shift_old - позиция до выделения

Правильно? И эта позиция в символах?

Re: box_lib.obj - библиотека gui компонентов

Posted: Mon Jan 06, 2014 8:47 am
by Mario_r4
Если хочешь ускорить результат, то лучше автору в личку скинуть (письмо продублируется на мыло), еще можно в ВК сообщение дать.

Posted: Mon Jan 06, 2014 8:58 am
by punk_joker
Мне гараздо важнее полученный опыт.