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

Discussing libraries simplifying applications development
  • У меня progressbar_draw получилась не thread-safe из-за
    ; ............................
    mov [.last_esp], esp
    ; ............................
    mov esp, [.last_esp]
    ; ............................
    .last_esp dd 0
    Я нигде не нашёл таких требований к этой библиотеке, но, думаю, что лучше было бы переделать.
  • Ты специально так пишешь? Я опять ни хрена не понял.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • 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
    
    Ведь несколько потоков, вызывающих её одновременно, могут неправильно работать? Или если ядро создаст копию страницы, то всё будет нормально?
  • 0CodErr
    Каждый поток должен работать со своим блоком данных. Не нужно создавать самому себе проблемы.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • SVN r.4154 - FileBrowser проверка данных перед выделением файлов (клавиша Insert или правый клик мыши в OpenDialog).
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • SVN r.4155 - FileBrowser проверка данных перед: выделением всех файлов, снятием выделения всех файлов и инвертированием выделения всех файлов.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • ProgressBar example:
    PB_test.7z (1.56 KiB)
    pb_test.asm + pb_test.kex + make.bat
    compile with fasm or nasm
    Downloaded 243 times
  • Не знаю даже, нужно ли это в новую тему...
    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 241 times
    Attachments
    slidebox.gif
    slidebox.gif (605 Bytes)
    Viewed 6672 times
  • Не поленился собрал. Ну чё, круто :) В Колибри такого user experience'a ещё не было.
    Только определись со стилем. Желательно, чтобы был один вариант дизайна.
    Из хаоса в космос
  • 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?
    "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • ScrollBar by itself does not work with scrollwheel. So yes, you have to do it yourself.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • По поводу edit'а
    Так понимаю:
    shift - позиция после начала выделения
    shift_old - позиция до выделения

    Правильно? И эта позиция в символах?
    to infinity and beyond
  • Если хочешь ускорить результат, то лучше автору в личку скинуть (письмо продублируется на мыло), еще можно в ВК сообщение дать.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Мне гараздо важнее полученный опыт.
    to infinity and beyond
  • Who is online

    Users browsing this forum: Google [Bot] and 5 guests