box_lib.obj - библиотека gui компонентов
-
О, спасибо, кое-что начало доходить.
У меня 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:
Не знаю даже, нужно ли это в новую тему...
Slidebox
Структура:
Блок слайдбокса - область, на которой рисуется слайдбокс, текст и кнопка. Кнопка занимает всю область.
Процедуры:
1) slidebox.init (_slidebox)
Инициализирует слайдбокс, по сути просто устанавливает ID кнопки и процедуру клика. В качестве параметра нужно передать адрес на структуру _slidebox.
2)slidebox.draw (_slidebox)
Рисует кнопку, текст и сам слайдбокс. В качестве параметра нужно передать адрес на структуру _slidebox.
3) slidebox.update_button (btn, _slidebox)
Проверяет нажатие на слайдбокс. При нажатии меняет значение и вызывает процедуру [_slidebox.on_click]. В качестве параметра нужно передать результат возврата сф 17 и адрес на структуру _slidebox.
Пока что слайдбокс написан в INC файле, но это сделано для упрощения тестинга.
Пример 1: при нажатии на кнопку у окна будет появляться/исчезать заголовок, в зависимости от значения слайдбокса.
Пример 2: при нажатии на слайдбокс у окна будет появляться/исчезать заголовок, в зависимости от значения слайдбокса.
В архиве две версии slidebox.
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
Процедуры:
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:
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.
- Attachments
-
-
slidebox.gif (605 Bytes)Viewed 6687 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?
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 - позиция до выделения
Правильно? И эта позиция в символах?
Так понимаю:
shift - позиция после начала выделения
shift_old - позиция до выделения
Правильно? И эта позиция в символах?
to infinity and beyond
Если хочешь ускорить результат, то лучше автору в личку скинуть (письмо продублируется на мыло), еще можно в ВК сообщение дать.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Мне гараздо важнее полученный опыт.
to infinity and beyond
Who is online
Users browsing this forum: No registered users and 39 guests