diff --git a/programs/media/scrshoot/editbox.inc b/programs/media/scrshoot/editbox.inc index 28a7e992e8..004835f904 100644 --- a/programs/media/scrshoot/editbox.inc +++ b/programs/media/scrshoot/editbox.inc @@ -1,6 +1,15 @@ -; 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной колавиши +; 01.02.2007 доработка edit_box, исправил баги. +; 26.01.2007 нормальная работа компанента исправил фукцию .check_offset +; 24.01.2007 пофиксел баги вызваные не правильным кодом )). +; 22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase +; 20.01.2007 реализовал выделение текста по shift +; 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!! +; 07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов. +; 03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги +; 09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода. +; 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши ; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru -; Дата последних изменений: 13.07.06 10:40 +; Дата последних изменений: 13.06.06 10:40 ; Напишите в исходном коде своей программы use_edit_box, ; это вставит необходимые процедуры в код вашей программы. ; Процедуры: @@ -14,7 +23,7 @@ ; оставить указатель на структуру. ; Пример структуры: ; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text -; длина, лево, верх, цвет фона, цвет рамки, если выбран, +; длина, высота, верх, цвет фона, цвет рамки, если выбран, ; цвет рамки, если не выбран, максимальное количество символов, ; указатель на буфер, где будут хранится символы. Буфер должен ; оканчиваться нулем, например если максимальное количество 255: @@ -41,147 +50,179 @@ macro use_edit_box { edit_box: -ed_width equ [edi] -ed_left equ [edi+2] -ed_top equ [edi+4] -ed_color equ [edi+6] -ed_focus_border_color equ [edi+10] -ed_blur_border_color equ [edi+14] -ed_text_color equ [edi+18] -ed_flags equ [edi+22] -ed_max equ [edi+24] -ed_size equ [edi+26] -ed_pos equ [edi+28] -ed_offset equ [edi+30] -ed_text equ [edi+32] +ed_width equ [edi] ;ширина компонента +ed_left equ [edi+4] ;положение по оси х +ed_top equ [edi+8] ;положение по оси у +ed_color equ [edi+12] ;цвет фона компонента +ed_focus_border_color equ [edi+16] ;цвет рамки компонента +ed_blur_border_color equ [edi+20] ;цвет не активного компонента +ed_text_color equ [edi+24] ;цвет текста +ed_max equ [edi+28] ;кол-во символов которые можно максимально ввести +ed_text equ [edi+32] ;указатель на буфер +ed_flags equ [edi+36] ;флаги +ed_size equ [edi+38] ;кол-во символов +ed_pos equ [edi+42] ;позиция курсора +ed_offset equ [edi+46] ;смещение +cl_curs_x equ [edi+50] ;предыдущее координата курсора по х +cl_curs_y equ [edi+54] ;предыдущее координата курсора по у +ed_shift_pos equ [edi+58] ed_height=14 ; высота +shift_color=0x6a9480 +ed_insert=10000b +ed_insert_cl=1111111111101111b ;========================================================== ;=== процедура прорисовки ================================= ;========================================================== .draw: pusha ;--- рисуем рамку --- - call .draw_border - + call .draw_border ; Функция стабильна .draw_bg_cursor_text: ;--- изменяем смещение, если надо --- - call .check_offset + call .check_offset ;вычисление позиции курсора стабильна ;--- рисуем внутреннюю область --- - call .draw_bg + call .draw_bg ;нарисовать прямоугольник рабочей области .draw_cursor_text: ;--- рисуем курсор --- - ;--- может его не надо рисовать ---- - bt word ed_flags,1 - jnc @f - call .draw_cursor + ;--- может его не надо рисовать ---- + test word ed_flags,ed_focus + je @f + call .draw_cursor @@: - call .draw_text + call .draw_text popa ret +;.str: +; mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число +; ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной +; cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax +; jb @f +; xor edx,edx ;очистить edx +; div ecx ;разделить - остаток в edx +; push edx ;положить в стек +; ;dec edi ;смещение необходимое для записи с конца строки +; call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx +; pop eax +; @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) +; ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает +; ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) +; or al,0x30 ;данная команда короче чем две выше +; stosb ;записать элемент из регистра al в ячеку памяти es:edi +; +; ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться + ;---------------------------------------------------------- ;--- процедура прорисовки текста -------------------------- ;---------------------------------------------------------- .draw_text: ;--- вычисляем, сколько помещается символов --- - call .get_n ;--- чтобы мусор не рисовать --- - movsx esi,word ed_size - sub si,ed_offset - cmp ax,si - ja @f - mov si,ax -@@: - + call .get_n + mov esi,ed_size + mov ebx,ed_offset + sub esi,ebx + cmp eax,esi + jae @F + mov esi,eax ;чтобы не выходить за пределы экрана ;--- рисуем текст --- - mov eax,4 - mov bx,ed_left - add bx,2 - shl ebx,16 - mov bx,ed_top - add bx,4 - mov ecx,ed_text_color - movsx edx,word ed_offset - add edx,ed_text - int 0x40 +@@: mov eax,4 + mov ebx,ed_left + mov edx,ed_offset + add ebx,2 + shl ebx,16 + mov bx,ed_top + add ebx,4 + mov ecx,ed_text_color + add edx,ed_text + int 0x40 ret - ;---------------------------------------------------------- ;--- процедура прорисовки фона ---------------------------- +;входные данные +;eax +;edx - color ;---------------------------------------------------------- .draw_bg_eax: -pusha - movsx ebx,ax - lea ebx,[ebx*2+ebx] - shl bx,1 - shl ebx,16 - shr eax,16 - lea eax,[eax*2+eax] - shl ax,1 - add ax,ed_left - add ax,2 - mov bx,ax - ror ebx,16 - jmp @f + mov ecx,ed_top + add ecx,1 + shl ecx,16 + mov cx,13 + mov eax,13 + int 0x40 +ret + + jmp @f .draw_bg: -pusha - mov bx,ed_left - inc bx - shl ebx,16 - mov bx,ed_width - dec bx + mov ebx,ed_left + add ebx,1 + shl ebx,16 + mov bx,ed_width + sub ebx,1 @@: - mov cx,ed_top - inc cx - shl ecx,16 - mov cx,ed_height - dec cx - - mov edx,ed_color - mov eax,13 - int 0x40 -popa + mov ecx,ed_top + mov eax,13 + add ecx,1 + shl ecx,16 + mov edx,ed_color + mov cx,ed_height + sub ecx,1 + int 0x40 ret ;---------------------------------------------------------- -;--- процедура получения количества символов -------------- +;--- процедура получения количества символов в текущей щирине компонента -------------- ;---------------------------------------------------------- .get_n: - xor edx,edx - movsx eax,word ed_width - sub ax,4 - mov bx,6 - div bx + mov eax,ed_width ;получем ширину компонента + xor edx,edx ;результат распологается в паре edx:eax в eax - остаток + sub eax,4 ;вычтим 4 + mov ebx,6 ;загрузми делитель + div ebx ;размделим на 6 ret ;---------------------------------------------------------- ;--- процедура рисования курсора -------------------------- ;---------------------------------------------------------- .clear_cursor: - mov edx,ed_color - jmp @f -.draw_cursor: - mov edx,ed_text_color + mov edx,ed_color + test word ed_flags,ed_shift + je @f + mov edx,shift_color @@: - movsx ebx,word ed_pos - sub bx,ed_offset - ;lea ebx,[ebx*2+ebx] - ;shl ebx,1 - imul ebx,6 - add bx,ed_left - inc bx - push bx - shl ebx,16 - pop bx - mov cx,ed_top - add cx,2 - push cx - shl ecx,16 - pop cx - add cx,ed_height-4 - mov eax,38 - int 0x40 + mov ebx,cl_curs_x + mov ecx,cl_curs_y + jmp .draw_curs +.draw_cursor: + + mov edx,ed_text_color +@@: + mov ebx,ed_pos + mov ecx,ed_offset + sub ebx,ecx + + lea ebx,[ebx*2+ebx] + shl ebx,1 + ;imul ebx,6 + add bx,ed_left + mov ecx,ed_top + inc ebx + add ecx,2 + mov ebp,ebx + shl ebx,16 + mov bx,bp + mov ebp,ecx + + shl ecx,16 + mov cx,bp + add cx,ed_height-4 + + mov cl_curs_x,ebx + mov cl_curs_y,ecx +.draw_curs: + mov eax,38 + int 0x40 ret ;---------------------------------------------------------- @@ -189,349 +230,547 @@ ret ;---------------------------------------------------------- .draw_border: ;--- цвет рамки --- - bt word ed_flags,1 - mov edx,ed_focus_border_color - jc @f - mov edx,ed_blur_border_color + test dword ed_flags,ed_focus + mov edx,ed_focus_border_color + jne @f + mov edx,ed_blur_border_color @@: ;--- сверху --- - mov bx,ed_left - push bx - shl ebx,16 - pop bx - add bx,ed_width - mov cx,ed_top - push cx - shl ecx,16 - pop cx - mov eax,38 - int 0x40 + mov eax,38 + mov ebx,ed_left + mov ecx,ebx + shl ebx,16 + mov bx,cx + add bx,ed_width + mov ecx, ed_top + mov esi,ecx + shl ecx,16 + mov cx,si + int 0x40 ;--- снизу --- - push cx - add cx,ed_height - push cx - shl ecx,16 - pop cx - int 0x40 + mov esi,ecx + add ecx,ed_height + mov ebp,ecx + shl ecx,16 + mov cx,bp + int 0x40 ;--- слева --- - pop cx - push bx - sub bx,ed_width - int 0x40 + mov cx,si + mov ebp,ebx + sub bx,ed_width + int 0x40 ;--- справа --- - pop bx - push bx - shl ebx,16 - pop bx - int 0x40 + mov ebx,ebp + shl ebx,16 + mov bx,bp + int 0x40 ret - ;---------------------------------------------------------- ;--- проверка, зашел ли курсор за границы и, если надо, --- ;--- изменяем смещение ------------------------------------ -;--- eax = 1, если не изменилось или eax = 0, если +;--- eax = -1, если не изменилось или eax = 0, если ; изменилось ;---------------------------------------------------------- .check_offset: - push word ed_offset - call .get_n -;--- правее --- - mov bx,ed_offset - add bx,ax - cmp bx,ed_pos - ja @f - mov bx,ed_pos - mov cx,ax - shr cx,2 - sub bx,cx - mov cx,ax - shr cx,1 - sub bx,cx - mov ed_offset,bx -@@: -;--- левее --- - mov bx,ed_offset - cmp bx,ed_pos - jb @f - mov bx,ed_pos - mov cx,ax - shr cx,2 - sub bx,cx - jnc $+5 - xor bx,bx - mov ed_offset,bx -@@: - xor eax,eax - pop bx - cmp bx,ed_offset - jne @f - inc eax -@@: -ret +pushad + mov ecx,ed_pos + mov ebx,ed_offset + cmp ebx,ecx + ja .sub_8 + push ebx + call .get_n ;получим кол-во символов в паре регистров edx:eax + pop ebx + mov edx,ebx + add edx,eax ;ed_offset+width editbox + cmp edx,ecx + ja @f + + mov edx,ed_size + cmp edx,ecx + je .add_end + + sub edx,ecx + cmp edx,8 + jbe .add_8 + add ebx,8 + jmp .chk_d + +.sub_8: cmp ecx,0 + je .sub_min + cmp ebx,8 + jbe .sub_min + sub ebx,8 ;ebx=ed_offset + jmp .chk_d +.sub_min: + xor ebx,ebx + jmp .chk_d + +.add_end:sub edx,eax + mov ebx,edx + jmp .chk_d +.add_8: add ebx,edx + +; ;----------- отладка +; pushad +; mov [data_of_code],0 +; mov eax,ebx;ed_offset +; mov edi,data_of_code +; call .str +; ;рисование фона +; mov eax,13 +; mov ebx,178*65536+36 +; mov ecx,28*65536+10 +; xor edx,edx +; int 0x40 +; ;вывод значения на экран +; mov eax,4 +; mov ebx,180*65536+30 +; mov ecx,0x10DDBBCC +; mov edx,data_of_code +; mov esi,4 +; int 0x40 +; popad +; ;----------- отладка + +.chk_d: mov ed_offset,ebx + + call .draw_bg + mov dword [esp+28],-1 +popad + ret + +@@: + mov dword [esp+28],0 +popad + ret + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; mov ebx,eax +; mov eax,ed_pos +; xor edx,edx +; idiv ebx +; xor edx,edx +; imul eax,ebx +; mov ed_offset,eax +; pop ebx +; cmp ax,bx +; je @f +;;;;;;;; данные для закрашивания всей полосы прямоугольника +; mov ebx,ed_left +; inc ebx +; shl ebx,16 +; mov bx,ed_width +; dec ebx +; mov edx,ed_color +; call .draw_bg_eax +; mov dword [esp+28],0 +;@@: popad +; ret ;========================================================== ;=== обработка клавиатуры ================================= ;========================================================== .key: pusha - bt word ed_flags,1 ; если не в фокусе, выходим - jc @f - popa - ret -@@: + test word ed_flags,ed_focus ; если не в фокусе, выходим + je .no_figure ;@f + xor ecx,ecx + push eax + inc ecx + mov eax,66 + mov ebx,3 + int 0x40 + test al,0x03 + je @f + or word ed_flags,ed_shift + +@@: pop eax ;---------------------------------------------------------- ;--- проверяем, что нажато -------------------------------- ;---------------------------------------------------------- - cmp ah,8 - je .backspace + cmp ah,8 + jz .backspace cmp ah,0xb6 - je .delete - cmp ah,176 - je .left - cmp ah,179 - je .right - cmp ah,180 - je .home - cmp ah,181 - je .end - + jz .delete + cmp ah,176 + jz .left + cmp ah,179 + jz .right + cmp ah,180 + jz .home + cmp ah,181 + jz .end + cmp ah,185 ;insert + jz .insert +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Заглушка на обработку клавиш вверх и вниз +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + cmp ah,177 + jz .no_figure + cmp ah,178 + jz .no_figure + cmp ah,27 ;ESC - клавиша )) + jz .no_figure ;--- нажата другая клавиша --- - bt word ed_flags,15 ; только цифры ? - jnc @f - cmp ah,'0' - jb .no_figure - cmp ah,'9' - ja .no_figure - jmp @f + test word ed_flags,ed_figure_only ; только цифры ? + jz @f + cmp ah,'0' + jb .no_figure + cmp ah,'9' + ja .no_figure + + +;проверка на shift +@@: test word ed_flags,ed_shift_on + je @f + ;Входные данные edx=ed_size;ecx=ed_pos + push eax + mov edx,ed_size + mov ecx,ed_pos + call .del_char +;;;; + mov eax,ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + pop eax + + ; проверяем, находится ли курсор в конце +@@: mov ecx,ed_size + mov edx, ed_max + cmp ecx,edx + jae .no_figure + mov ebx, ed_pos + cmp ebx,edx + jl @f ; если меньше или равно .no_figure: - popa - ret -@@: - ; проверяем, находится ли курсор в конце - mov bx,ed_max - cmp bx,ed_pos - jne @f ; если да, в конец процедуры - popa - ret -@@: - ; сдвигаем символы после курсора вправо - mov edx,ed_text - dec edx - xor ecx,ecx - mov cx,ed_size - cmp cx,ed_pos - je @f -.mov_right_next: - mov bh,[edx+ecx] - mov [edx+ecx+1],bh - dec cx - cmp cx,ed_pos - jne .mov_right_next -@@: - - - ; вставляем код клавиши туда, где курсор - mov edx,ed_text - movsx ebx,word ed_pos - mov [ebx+edx],ah - - call .clear_cursor - ; увеличиваем значение размера и позиции - inc word ed_pos - mov bx,ed_size - cmp bx,ed_max - je .draw_bg_cursor_text;.key_end_draw - inc word ed_size - - ;push word ed_offset - call .check_offset - ;pop ax - ;cmp ax,ed_offset - ;jne .draw_bg_cursor_text - test eax,eax - jz .draw_bg_cursor_text - - call .get_n - sub ax,ed_pos - add ax,ed_offset - inc ax - shl eax,16 - mov ax,ed_pos - sub ax,ed_offset - dec ax - ror eax,16 - call .draw_bg_eax - - jmp .draw_cursor_text - - ;jmp .draw_cursor_text;.key_end_draw - -.delete: - mov dx,ed_size - mov cx,ed_pos - ;inc edx - ;add ecx,900 - ;sub ecx,1 - cmp dx,cx - jg @f popa ret +.insert: test word ed_flags,ed_insert ;not word ed_insert + je .insert_1 + and word ed_flags,ed_insert_cl + jmp .no_figure +.insert_1: + or word ed_flags,ed_insert + jmp .no_figure +.ins_v: + dec dword [ebp+38];ed_size ;processing is insert + sub esi,ecx + add esi,ebx + mov edi,esi + jmp .In_k +@@: ; сдвигаем символы после курсора вправо + mov ecx,ed_size + push edi eax + mov ebp,edi + mov esi,ed_text ; Указатель на буфер + ;Будем работать со строкой + add esi,ecx ;add ed_size добавим max size + mov edi,esi -@@: - mov edx,ed_text - ;dec edx -.mov_stop_next: - mov bh,[edx+ecx+1] - mov [edx+ecx],bh - inc cx - mov bx,ed_size - ;dec bx - ;dec bx - cmp cx,bx - jne .mov_stop_next + cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце + je .In_k - ; уменьшаем значение позиции и размера - ;dec word ed_pos - dec word ed_size - ;push word ed_offset - call .check_offset - ;pop ax - ;cmp ax,ed_offset - ;jne .draw_bg_cursor_text - test eax,eax - jz .draw_bg_cursor_text + test word [ebp+36],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp + jne .ins_v - call .get_n - sub ax,ed_pos - add ax,ed_offset - shl eax,16 - mov ax,ed_pos - sub ax,ed_offset - ror eax,16 - call .draw_bg_eax - - jmp .draw_cursor_text -popa -ret + sub ecx,ebx ;Найдем кол-во символов для передвижения. + inc edi ;Сместим наши символы в право + std + inc ecx + @@: + ;-------- + lodsb + stosb + ;-------- + loop @b +.In_k: cld + pop eax + mov al,ah + stosb + pop edi +; вставляем код клавиши туда, где курсор + ; увеличиваем значение размера и позиции + inc dword ed_size + inc dword ed_pos + call .draw_all2 + jmp .shift;.draw_cursor_text +.delete: + mov edx,ed_size + mov ecx,ed_pos + cmp edx,ecx + jg .bac_del + test word ed_flags,ed_shift_on + jne .del_bac + popa + ret +.bac_del: + call .del_char + jmp .draw_all ;--- нажата клавиша backspace --- .backspace: - ; проверяем, курсор у левого края ? - mov bx,ed_pos - ;cmp bx,0 - ;jne @f; .key_end ; если да, в конец - test bx,bx - jnz @f - popa - ret -@@: + ; проверяем, курсор у левого края ? + mov edx,ed_size + mov ecx,ed_pos + test ecx,ecx + jnz .del_bac + test word ed_flags,ed_shift_on + jne .bac_del + popa + ret +.del_bac: + cmp edx,ecx ;if ed_pos=ed_size + je @f + dec ecx + call .del_char +@@: test word ed_flags,ed_shift_on + jne .bac_del + dec dword ed_pos - ; сдвигаем символы после курсора влево - mov edx,ed_text - dec edx - movsx ecx,word ed_pos +.draw_all: + push .shift;.draw_cursor_text;eax -.mov_left_next: - mov bh,[edx+ecx+1] - mov [edx+ecx],bh - inc cx - mov bx,ed_size - inc bx - cmp cx,bx - jne .mov_left_next + test word ed_flags,ed_shift_on + je @f + mov eax,ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + jmp .draw_all2 - ; уменьшаем значение позиции и размера - dec word ed_pos - dec word ed_size +@@: dec dword ed_size - ;push word ed_offset - call .check_offset - ;pop ax - ;cmp ax,ed_offset - ;jne .draw_bg_cursor_text - test eax,eax - jz .draw_bg_cursor_text +.draw_all2: + and word ed_flags,ed_shift_cl + call .clear_cursor + call .check_offset +;;;;;;;;;;;;;;; + test eax,eax + jne @f + call .draw_bg + ret +;;;;;;;;;;;;;;; +@@: call .get_n + push eax + mov ebx,ed_offset + add eax,ebx ;eax = w_off= ed_offset+width + mov ebx,ed_size - call .get_n - sub ax,ed_pos - add ax,ed_offset - shl eax,16 - mov ax,ed_pos - sub ax,ed_offset - ror eax,16 - call .draw_bg_eax + cmp eax,ebx + jb @f + mov eax,ed_pos + sub ebx,eax + mov ecx,ed_offset + sub eax,ecx + jmp .nxt +@@: mov ebx,ed_pos + push ebx + sub eax,ebx + mov ebx,eax ;It is don't optimal - jmp .draw_cursor_text -popa -ret + pop eax ;ed_pos + mov ecx,ed_offset + sub eax,ecx +.nxt: + mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины + add ebp,ebx + pop edx + cmp ebp,edx + je @f + inc ebx + +@@: mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + mov edx,ed_color + call .draw_bg_eax + ret +; jmp .shift ;--- нажата клавиша left --- -.left: - mov bx,ed_pos - ;cmp bx,0 - ;je @f - test bx,bx - jz @f - call .clear_cursor - dec word ed_pos - call .check_offset - test eax,eax - jz .draw_bg_cursor_text - call .draw_cursor -@@: -popa -ret - +.left: call .sh_enable + mov ebx,ed_pos + test ebx,ebx + jz .nd_k + call .clear_cursor + dec dword ed_pos + jmp .nd_k ;--- нажата клавиша right --- -.right: - mov bx,ed_pos - cmp bx,ed_size - je @f - call .clear_cursor - inc word ed_pos - call .check_offset - test eax,eax - jz .draw_bg_cursor_text - call .draw_cursor +.right: call .sh_enable + mov ebx,ed_pos + cmp ebx,ed_size + je .nd_k + call .clear_cursor + inc dword ed_pos + jmp .nd_k +.home: call .sh_enable + mov ebx,ed_pos + test ebx,ebx + jz .nd_k + call .clear_cursor + xor eax,eax + mov ed_pos,eax + jmp .nd_k + +.end: call .sh_enable + mov ebx,ed_pos + cmp ebx,dword ed_size + je .nd_k + call .clear_cursor + mov eax,ed_size + mov ed_pos,eax +.nd_k: call .check_offset + ;test eax,eax + ;jz .draw_bg_cursor_text + call .draw_cursor + +.shift: ;;;;;;;SHIFT + + call .draw_bg ;не оптимально + test word ed_flags,ed_shift + je .f_exit +;;;;;;SHIFT end + mov eax,dword ed_pos + mov ebx,dword ed_shift_pos + cmp eax,ebx + jae .sh_n + push eax ;меньшее в eax + push ebx ;большее + jmp .sh_n1 + ;если иначе +.sh_n: push ebx + push eax +.sh_n1: +; jmp .draw_all2 +;;;;;;;;;;;;;;;;;;;;;;;;; + ;call .clear_cursor + call .check_offset + call .get_n + mov edx,eax ;size of ed_box +; push eax + mov ecx,ed_offset + add eax,ecx ;eax = w_off= ed_offset+width + mov ebp,eax ;save + pop ebx ;большее + pop eax ;меньшее + + + cmp eax,ecx ;сравнение с меньшего с offset. + jae .f_f ;если больше + xor eax,eax + cmp ebp,ebx ;cравним размер w_off с большим + jb @f + sub ebx,ecx + jmp .nxt_f +@@: mov ebx,ebp + sub ebx,ecx + jmp .nxt_f + +.f_f: + sub eax,ecx + cmp ebp,ebx ;cравним размер w_off с большим + jle @f + sub ebx,ecx + sub ebx,eax + jmp .nxt_f @@: -popa -ret + mov ebx,ebp + sub ebx,ecx + sub ebx,eax +.nxt_f: + mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + mov edx,shift_color + call .draw_bg_eax + and word ed_flags,1111111111111011b + jmp .draw_cursor_text +;;;;;;;;;;;;;;;;;;;;; -.home: - mov bx,ed_pos - test bx,bx - jz @f - call .clear_cursor - xor eax,eax - mov ed_pos,ax - call .check_offset - test eax,eax - jz .draw_bg_cursor_text - call .draw_cursor +.f_exit: and word ed_flags,ed_shift_cl + jmp .draw_cursor_text + +;проверка состояния shift был ли он нажат раньше? +.sh_enable: + test word ed_flags,ed_shift + je @f + test word ed_flags,ed_shift_on + jne .sh_ext_en + push dword ed_pos + pop dword ed_shift_pos + or word ed_flags,ed_shift_on + ret + +@@: and word ed_flags,ed_shift_cl +.sh_ext_en: ret + + ;- удаление символа + ;Входные данные edx=ed_size;ecx=ed_pos +.del_char: + mov esi,ed_text + test word ed_flags,ed_shift_on + je @f + mov eax,dword ed_shift_pos + mov ebx,esi + cmp eax,ecx + jae .dh_n + + mov ed_pos,eax ;что бы не было убегания курсора + mov ebp,ecx + sub ebp,eax + add ebx,eax ;eax меньше + sub edx,ecx + add esi,ecx + + + mov ed_shift_pos,ebp + jmp .del_ch_sh + ;если иначе +.dh_n: + mov ebp,eax + sub ebp,ecx + add ebx,ecx + sub edx,eax + add esi,eax + mov ed_shift_pos,ebp + jmp .del_ch_sh + +@@: add esi,ecx ;указатель + смещение к реальному буфферу + mov ebx,esi + inc esi + cld + + sub edx,ecx +.del_ch_sh: + + push edi + mov edi,ebx @@: -popa -ret - -.end: - mov bx,ed_pos - cmp bx,ed_size - je @f - call .clear_cursor - mov ax,ed_size - mov ed_pos,ax - call .check_offset - test eax,eax - jz .draw_bg_cursor_text - call .draw_cursor -@@: -popa -ret - + lodsb + stosb + dec edx + jns @b + pop edi + ret ;========================================================== ;=== обработка мыши ======================================= ;========================================================== @@ -540,106 +779,85 @@ pusha ;---------------------------------------------------------- ;--- получаем состояние кнопок мыши ----------------------- ;---------------------------------------------------------- - mov eax,37 - mov ebx,2 - int 0x40 + mov eax,37 + mov ebx,2 + int 0x40 ;---------------------------------------------------------- ;--- проверяем состояние ---------------------------------- ;---------------------------------------------------------- - bt eax,0 - jc .mouse_left_button - - bt eax,1 - jc @f - btr word ed_flags,2 -@@: - - popa - ret + test eax,1 + jnz .mouse_left_button +@@: popa + ret .mouse_left_button: ;---------------------------------------------------------- ;--- получаем координаты мыши ----------------------------- ;---------------------------------------------------------- - bts word ed_flags,2 - jc .mouse_pressed - mov eax,37 - ;mov ebx,1 - xor ebx,ebx - inc ebx - int 0x40 + mov eax,37 + xor ebx,ebx + inc ebx + int 0x40 ;---------------------------------------------------------- ;--- проверяем, попадает ли курсор в edit box ------------- ;---------------------------------------------------------- - mov bx,ed_top - cmp ax,bx - jl ._blur;.mouse_end_no_focus + mov ebx,ed_top + cmp ax,bx + jl ._blur;.mouse_end_no_focus - add bx,ed_height - cmp ax,bx - jg ._blur;.mouse_end_no_focus + add bx,ed_height + cmp ax,bx + jg ._blur;.mouse_end_no_focus - shr eax,16 + shr eax,16 - mov bx,ed_left - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_width - cmp ax,bx - jg ._blur;.mouse_end_no_focus + mov bx,ed_left + cmp ax,bx + jl ._blur;.mouse_end_no_focus + add bx,ed_width + cmp ax,bx + jg ._blur;.mouse_end_no_focus ;--- изменяем позицию курсора --- - push eax - call .clear_cursor - pop eax - xor dx,dx - sub ax,ed_left - add ax,2 - mov bx,6 - div bx - add ax,ed_offset - cmp ax,ed_size - jna @f - mov ax,ed_size + push eax + call .clear_cursor + pop eax + xor dx,dx + sub ax,ed_left + add ax,2 + mov bx,6 + div bx + add ax,ed_offset + cmp ax,ed_size + jna @f + mov ax,ed_size @@: - mov ed_pos,ax - call .check_offset - test eax,eax - jz .draw_bg_cursor_text - call .draw_cursor - - call .focus - + mov ed_pos,ax + call .check_offset + call .draw_cursor +;---------------------------------------------------------- +;--- процедура установки фокуса --------------------------- +;---------------------------------------------------------- + bts word ed_flags,1 + jc .mouse_pressed + call .draw_cursor + call .draw_border .mouse_pressed: popa ret - ;.mouse_end_no_focus: ; call .blur ;popa ;ret - - -;---------------------------------------------------------- -;--- процедура установки фокуса --------------------------- -;---------------------------------------------------------- -.blur: -pusha +;.blur: +;pusha ._blur: - bt word ed_flags,14 - jc @f - btr word ed_flags,1 - jnc @f - call .clear_cursor - jmp .blur_end -.focus: -pusha - bts word ed_flags,1 - jc @f - call .draw_cursor -.blur_end: - call .draw_border + test word ed_flags,ed_always_focus + jne @f + btr word ed_flags,1 ; если не в фокусе, выходим + jnc @f + call .clear_cursor + call .draw_border @@: popa ret @@ -650,10 +868,10 @@ ret ;.blur: ;pusha ;._blur: - ;btr word ed_flags,1 - ;jnc @f - ;call .draw_border - ;call .clear_cursor + ;btr ed_flags,1 + ;jnc @f + ;call .draw_border + ;call .clear_cursor ;@@: ;popa ;ret @@ -661,95 +879,100 @@ ret ed_figure_only=1000000000000000b ed_always_focus=100000000000000b ed_focus=10b -ed_struc_size=36 +ed_shift_on=1000b +ed_shift=100b +ed_shift_cl=1111111111110011b macro draw_edit_boxes start,end { - mov edi,start - mov ecx,((end-start)/ed_struc_size) + mov edi,start + mov ecx,((end-start)/ed_struc_size) @@: - call edit_box.draw - add edi,ed_struc_size - loop @b + call edit_box.draw + add edi,ed_struc_size + loop @b } macro mouse_edit_boxes start,end { - mov edi,start - mov ecx,((end-start)/ed_struc_size) + mov edi,start + mov ecx,((end-start)/ed_struc_size) @@: - call edit_box.mouse - add edi,ed_struc_size - loop @b + call edit_box.mouse + add edi,ed_struc_size + loop @b } macro key_edit_boxes start,end { - mov edi,start - mov ecx,((end-start)/ed_struc_size) + mov edi,start + mov ecx,((end-start)/ed_struc_size) @@: - call edit_box.key - add edi,ed_struc_size - loop @b + call edit_box.key + add edi,ed_struc_size + loop @b } - +ed_struc_size=62 struc edit_box width,left,top,color,focus_border_color,\ blur_border_color,text_color,max,text,flags,size { -.width dw width -.left dw left -.top dw top +.width dd width +.left dd left +.top dd top .color dd color .focus_border_color dd focus_border_color .blur_border_color dd blur_border_color .text_color dd text_color -.flags dw flags+0 -.max dw max -.size dw size+0 -.pos dw 0 -.offset dw 0 +.max dd max .text dd text +.flags dw flags+0 +.size dd size+0 +.pos dd 0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 } macro edit_boxes_set_sys_color start,end,color_table { - mov edi,start - mov ecx,((end-start)/ed_struc_size) - mov esi,color_table + mov edi,start + mov ecx,((end-start)/ed_struc_size) + mov esi,color_table @@: - mov eax,[esi+36] - mov ebx,[esi+20] - mov ed_focus_border_color,eax - shr bh,1 - shr bl,1 - shr ah,1 - shr al,1 - add ah,bh - add al,bl - ror eax,16 - ror ebx,16 - shr bl,1 - shr al,1 - add al,bl - ror eax,16 - mov ed_blur_border_color,eax - add edi,ed_struc_size - loop @b + mov eax,[esi+36] + mov ebx,[esi+20] + mov ed_focus_border_color,eax + shr bh,1 + shr bl,1 + shr ah,1 + shr al,1 + add ah,bh + add al,bl + ror eax,16 + ror ebx,16 + shr bl,1 + shr al,1 + add al,bl + ror eax,16 + mov ed_blur_border_color,eax + add edi,ed_struc_size + loop @b } macro draw_edit_box ed_ptr { - mov edi,ed_ptr - call edit_box.draw + mov edi,ed_ptr + call edit_box.draw } macro mouse_edit_box ed_ptr { - mov edi,ed_ptr - call edit_box.mouse + mov edi,ed_ptr + call edit_box.mouse } macro key_edit_box ed_ptr { - mov edi,ed_ptr - call edit_box.key + mov edi,ed_ptr + call edit_box.key } \ No newline at end of file diff --git a/programs/media/scrshoot/gp.inc b/programs/media/scrshoot/gp.inc index 0334190263..af4ebaa7f7 100644 --- a/programs/media/scrshoot/gp.inc +++ b/programs/media/scrshoot/gp.inc @@ -1,17 +1,20 @@ -macro use_gp -{ ;esi - screen size ;edi - pointer to image csi_width equ [esi+2] csi_height equ [esi] csi_bitspp equ [esi+4] csi_bytesps equ [esi+6] + + copy_screen_to_image: pusha xor edx,edx xor ecx,ecx xor ebx,ebx + bt dword [use_rect.flags],1 + jc copy_area + cmp csi_bitspp,word 24 je .next_str_24 @@ -60,4 +63,32 @@ ret jl .next_str_24 popa ret -} \ No newline at end of file + +copy_area: + mov eax,[scr.bytesps] + mov ebx,eax + movzx ecx,word [rect.top] + mul ecx + movzx ecx,word [rect.width] + shl ecx,2 + sub ebx,ecx + movzx ecx,word [rect.left] + shl ecx,2 + add eax,ecx + movzx ecx,word [rect.height] + mov edx,eax +.next_str: + movzx esi,word [rect.width] +.next_pixel: + mov eax,[gs:edx] + mov [edi],ax + shr eax,8 + mov [edi+2],ah + add edx,4 + add edi,3 + dec esi + jnz .next_pixel + add edx,ebx + loop .next_str +popa +ret \ No newline at end of file diff --git a/programs/media/scrshoot/macros.inc b/programs/media/scrshoot/macros.inc index dab55d0806..7f2509dab4 100644 --- a/programs/media/scrshoot/macros.inc +++ b/programs/media/scrshoot/macros.inc @@ -1,7 +1,7 @@ ;--- другие макросы --- include 'editbox.inc' include 'txtbut.inc' -include 'gp.inc' +;include 'gp.inc' include 'label.inc' ;include 'checkbox.inc' include 'check.inc' @@ -167,7 +167,7 @@ macro get_grab_area int 0x40 } -macro get_scin_height +macro get_skin_height { movr eax,48 movr ebx,4 @@ -347,4 +347,8 @@ struc ipc_buffer size ;--- цвета --- cl_white=0xffffff -cl_black=0x000000 \ No newline at end of file +cl_black=0x000000 + +;============================================================================== +;============== Константы ===================================================== +;============================================================================== diff --git a/programs/media/scrshoot/readme.txt b/programs/media/scrshoot/readme.txt index 6b2b8037c4..5cd311a05c 100644 --- a/programs/media/scrshoot/readme.txt +++ b/programs/media/scrshoot/readme.txt @@ -1,7 +1,7 @@ Автор документа и программы: Евтихов Максим (Maxxxx32) Благодарности: Марату Закиянову (Mario79) за помощь, советы, критику; - всем участникам проекта. + всем участникам проекта KolibriOS. Screenshooter - программа, предназначенная для фотографирования экрана и сохранения фотографии ввиде файла BMP. @@ -15,7 +15,7 @@ * автоматическая нумерация файлов; * автосъемка. - Длинные имена файлов. + Длинные имена файлов. При сохранении файлов программа использует 70-ю функцию, следовательно имена файлов могут содержать до 260 символов. @@ -23,22 +23,22 @@ Если включить функцию "Свернуть окно", после нажатия на кнопку "Сделать снимок экрана" сначала свернется окно, потом будет сделан снимок. - Просмотр снимка. + Просмотр снимка. Если включить функцию "Показать снимок", после съемки будет показан текущий снимок. Если нажать на кнопку "Показать снимок сейчас", будет показан последний сделанный снимок. Чтобы закрыть просмотр, надо нажать любую клавишу. - Задержка. + Задержка. Если включить функцию "Задержка", перед съемкой будет задержка, равная введенному числу. Если число не введено, задержка будет считаться равной нулю. 1 = 1/100 секунды, 100 = 1 секунда, 1000 = 10 секунд. - Автосохранение. + Автосохранение. Если включить функцию автосохранение, сразу после съемки файл сохранится на жесткий диск. - Автонумерация. + Автонумерация. Если включить функцию "Автонумерация" вместо "*" в имени файла будет вставлен текущий номер снимка, при этом необходимо задать количество знаков в номере. Если не задать начальный номер, он будет считаться @@ -49,7 +49,7 @@ Если функция "Автонумерация не будет включена, значок "*" игнорируется. - Автосъемка. + Автосъемка. Чтобы начать автосъемку, необходимо: 1) ввести полный путь к файлу, где вместо "*" будет вставляться номер кадра; @@ -60,5 +60,5 @@ 6) нажать кнопку "Начать автосъемку". Для остановки автосъемки необходимо нажать кнопку "Остановить автосъемку". - Горячие клавиши: + Горячие клавиши: PrintScrn - сделать снимок экрана (глобальная). \ No newline at end of file diff --git a/programs/media/scrshoot/scrsavef.inc b/programs/media/scrshoot/scrsavef.inc index 66af7fae56..34bf6733f1 100644 --- a/programs/media/scrshoot/scrsavef.inc +++ b/programs/media/scrshoot/scrsavef.inc @@ -45,6 +45,21 @@ pusha jmp .next .str_end: +; Вычисляем, сколько байт нужно прибавлять к каждой строке, +; чтобы следующая была выравнена на 4 байта. +; Результат помещаем в edi. + xor edx,edx + movzx eax,word [scr_buf.width] ; eax = ширина картинки + lea eax,[eax*3] ; eax = байт на строку картинки + movr ebx,4 ; ebx = 4 + mov edi,ebx ; edi = 4 + div ebx ; eax = байт на строку картинки div 4 edx = байт... mod 4 + sub edi,edx ; edi = количество байт + test edx,edx + jnz @f + xor edi,edi +@@: + ; выделяем память mov ecx,[scr_buf.end_ptr] mov [sf_buf.bmp_header],ecx @@ -52,8 +67,10 @@ pusha mov [sf_buf.bmp_area],ecx movsx ebx,word [scr_buf.width] movsx edx,word [scr_buf.height] - imul ebx,edx + ;imul ebx,edx lea ebx,[ebx*3] + add ebx,edi + imul ebx,edx add ecx,ebx mov [sf_buf.end],ecx add ecx,4096 @@ -62,6 +79,7 @@ pusha movr eax,64 int 0x40 + push edi ; заполняем структуру для сохранения файла mov edi,fs_struc mov [edi],dword 2 @@ -82,37 +100,58 @@ pusha add ebx,0x36 mov [edi+2],ebx ; размер файла mov [edi+14],dword 0x28 - movsx eax,word [scr_buf.width] + movzx eax,word [scr_buf.width] mov [edi+18],eax ; горизонтальный размер - movsx eax,word [scr_buf.height] + movzx eax,word [scr_buf.height] mov [edi+22],eax ; вертикльный размер mov [edi+26],word 1 mov [edi+28],word 24 ; копируем и переворачиваем - mov esi,[scr_buf.ptr] - mov edi,[sf_buf.bmp_area] - mov edx,[sf_buf.end] - sub edx,edi - movsx ecx,word [scr_buf.height] -.next_str: -push ecx +; mov esi,[scr_buf.ptr] +; mov edi,[sf_buf.bmp_area] +; mov edx,[sf_buf.end] +; sub edx,edi +; movsx ecx,word [scr_buf.height] +;.next_str: +;push ecx +; +; movsx ecx,word [scr_buf.width] +; lea ecx,[ecx*3] +; mov ebx,ecx +;.next_byte: +; mov ah,[esi+ebx] +; mov [edi+edx],ah +; dec ebx +; dec edx +; loop .next_byte +; movsx ecx,word [scr_buf.width] +; lea ecx,[ecx*3] +; add esi,ecx +;pop ecx +; loop .next_str - movsx ecx,word [scr_buf.width] - lea ecx,[ecx*3] - mov ebx,ecx -.next_byte: - mov ah,[esi+ebx] - mov [edi+edx],ah - dec ebx + mov esi,[scr_buf.end_ptr] + mov edi,[sf_buf.bmp_area] + movzx ecx,word [scr_buf.height] + movzx ebx,word [scr_buf.width] + lea ebx,[ebx*3] + add edi,ebx +.next_str: + mov edx,ebx +.next_pixel: + mov ah,[esi] + mov [edi],ah + dec esi + dec edi dec edx - loop .next_byte - movsx ecx,word [scr_buf.width] - lea ecx,[ecx*3] - add esi,ecx -pop ecx + jnz .next_pixel + lea edi,[2*ebx+edi] + add edi,[esp] loop .next_str + pop edi + ; сохраняем draw_status saving mov eax,70 @@ -126,6 +165,7 @@ pop ecx call draw_number draw_status saved_ok + popa ret diff --git a/programs/media/scrshoot/scrshoot.asm b/programs/media/scrshoot/scrshoot.asm index 2444708cef..fb66cae2c3 100644 --- a/programs/media/scrshoot/scrshoot.asm +++ b/programs/media/scrshoot/scrshoot.asm @@ -1,5 +1,6 @@ ; Автор программы Евтихов Максим (Maxxxx32) -; Дата последнего изменения: 20.07.06 18:05 +; 01.02.07 - обновлён editbox +; 31.01.07 - всё теперь рисуется относительно клиентской области macro draw_status text_ptr { mov [status.text],dword text_ptr @@ -7,20 +8,21 @@ macro draw_status text_ptr } -title equ 'Maxxxx32 Screenshooter v 0.78' ; Заголовок окна -include 'lang.inc' +title equ 'Screenshooter v 0.9' ; Заголовок окна include 'macros.inc' ; вставляем макросы meos_header cmdstr ; вставляем заголовок программы include 'scrwin.inc' ; вставляем код окна прдпросмотра include 'scrsavef.inc'; вставляем процедуру сохранения файла use_edit_box ; \ use_txt_button ; | - use_label ; | - use_gp ; |-- GUI компоненты и некоторые процедуры + use_label ; |-- GUI компоненты и некоторые процедуры use_check_box ; | use_text_work ; / +include 'gp.inc' +include 'srectwin.inc' ;--- начало программы --- app_start + ;mov al,[gs:1280*4*1024] ; устанавливаем ipc буффер push 60 pop eax @@ -106,6 +108,15 @@ ipc: p_close: btr dword [flags],1 + + bt dword [flags],3 + jnc @f + movr eax,18 + mov ebx,eax + mov ecx,[set_rect_window_pid] + int 0x40 +@@: + close: app_close @@ -114,27 +125,17 @@ close: ;-------------------------------------------------------------------- draw_window: start_draw_window ; начало перерисовки - xor eax,eax ; определяем окно + ; определяем окно + get_skin_height mov ebx,100*65536+320 - mov ecx,100*65536+240 + mov ecx,100*65536+220 + add cx,ax mov edx,[sc.work] - add edx,0x03000000 + add edx,0x33000000;0x33000000 xor esi,esi - xor edi,edi - int 0x40 - - get_scin_height ; получаем высоту заголовка окна и расчитываем - sub ax,4 ; положение текста заголовка - shr ax,1 - mov bx,10 - shl ebx,16 - mov bx,ax - - mov eax,4 ; рисуем текст загооловка - mov ecx,[sc.grab_text] - bts ecx,28 - mov edx,grab_text - mov esi,grab_text_end-grab_text + ;xor edi,edi + mov edi,grab_text + xor eax,eax int 0x40 movr eax,47 ; выводим числа в окно @@ -193,7 +194,13 @@ shoot: mov edi,[scr_buf.ptr] call copy_screen_to_image + bt dword [use_rect.flags],1 + jc .use_rect push dword [scr] + jmp @f +.use_rect: + push dword [rect.height] +@@: pop dword [scr_buf.size] bt dword [ch5.flags],1 ; включено ли автосохранение ? @@ -220,10 +227,19 @@ shoot: @@: ret +;--- получить память для снимка --- get_mem_for_shoot: mov [scr_buf.ptr],dword __app_end - movsx ecx, word [scr.width] - movsx ebx, word [scr.height] + bt dword [use_rect.flags],1 ; фоткать область экрана + jc .use_area + movzx ecx, word [scr.width] + movzx ebx, word [scr.height] + jmp @f +.use_area: + call read_rect + movzx ecx, word [rect.width] + movzx ebx, word [rect.height] +@@: imul ecx,ebx lea ecx,[ecx*3] add ecx,__app_end @@ -263,7 +279,7 @@ draw_number: call zstr_to_int mov [sign_n],al movr eax,13 - mov ebx,140*65536+96 + mov ebx,150*65536+96 mov cx,[label9.top] shl ecx,16 mov cx,10 @@ -273,7 +289,7 @@ draw_number: movsx bx,byte [sign_n] shl ebx,16 mov ecx,[cur_number] - mov dx,140 + mov dx,150 shl edx,16 mov dx,[label9.top] mov esi,[sc.work_text] @@ -319,14 +335,14 @@ autoshoot: ; (должна вызываться потоком главного окна) dr_st: movr eax,38 ; отрезок - mov ebx,5*65536+315 - mov ecx,222*65536+222 + mov ebx,0*65536+310 + mov ecx,198*65536+198 mov edx,[sc.work_graph] int 0x40 movr eax,13 ; полоска mov bx,310 - mov ecx,223*65536+12 + mov ecx,199*65536+15 mov edx,[sc.work] int 0x40 @@ -343,22 +359,24 @@ get_slot_n: dec ecx int 0x40 - mov edx,[app.pid] + mov edx,[ebx+30] xor ecx,ecx @@: movr eax,9 inc ecx int 0x40 - cmp [app.pid],edx + cmp [ebx+30],edx je @f jmp @b @@: ret +;--- процедура, запускающая поток, делающий 1 снимок --- one_shoot: mov ecx,one_shoot_thread mov edx,shoot_esp jmp @f +;--- процедра, запускающая поток, сохраняющий снимок --- save_shoot: mov ecx,save_shoot_thread mov edx,shoot_esp @@ -376,6 +394,7 @@ save_shoot: .running: ret +;--- поток, делающий 1 снимок --- one_shoot_thread: mov ecx,[slot_n] activ_window @@ -392,6 +411,8 @@ one_shoot_thread: btr dword [flags],2 jmp close +;--- процедура, отправляющая главному окну сообщение о перерисовке +; строки состояния --- send_draw_status: movr eax,60 movr ebx,2 @@ -401,6 +422,7 @@ send_draw_status: int 0x40 ret +;--- поток, сохраняюий файл --- save_shoot_thread: mov ecx,[slot_n] activ_window @@ -408,6 +430,40 @@ save_shoot_thread: btr dword [flags],2 jmp close +;--- процедура, запускающая поток окна установки области съемки --- +show_set_rect_window: + bts dword [flags],3 + jc @f + movr eax,51 + xor ebx,ebx + inc ebx + mov ecx,set_rect_window + mov edx,set_rect_window_esp + int 0x40 + + mov [set_rect_window_pid],eax +ret + +@@: + movr eax,18 + mov ebx,eax + mov ecx,[set_rect_window_pid] + int 0x40 + btr dword [flags],3 +ret + +;--- получение информации об активном окне --- +get_active_window_info: + movr eax,18 + movr ebx,7 + int 0x40 + + mov ecx,eax + movr eax,9 + mov ebx,active_app + int 0x40 +ret + ;==================================================================== ;=== данные программы =============================================== ;==================================================================== @@ -418,77 +474,81 @@ messages: grab_text: - db title -grab_text_end: + db title,0 + labels: -label1 label 10,30,0,text.1 ; высота экрана -label2 label 10,40,0,text.2 ; ширина экрана -label3 label 10,50,0,text.3 ; введите имя файла -label4 label 150,30,0,text.4 ; бит на пиксель -label5 label 150,40,0,text.5 ; байт на строку -label6 label 120,163,0,text.6 +label1 label 5,5,0,text.1 ; ширина экрана +label2 label 5,15,0,text.2 ; высота экрана +label3 label 5,25,0,text.3 ; введите имя файла +label4 label 150,5,0,text.4 ; бит на пиксель +label5 label 150,15,0,text.5 ; байт на строку +label6 label 115,138,0,text.6 ; 100 = 1 сек. ;label7 label 10,190,0,text.7 ;label8 label 10,225,0,text.8 -label9 label 10,78,0,text.9 ; текущий -label10 label 10,210,0,text.10 -status label 10,226,0,no_shoot +label9 label 5,52,0,text.9 ; номер текущего симка +label10 label 5,185,0,text.10 +status label 5,201,0,no_shoot labels_end: editboxes: -edit1 edit_box 300,10,60,cl_white,0,0,0,1024,ed_buffer.1,ed_focus -edit2 edit_box 35,80,159,cl_white,0,0,0,9,ed_buffer.2,ed_figure_only -edit3 edit_box 35,170,189,cl_white,0,0,0,9,ed_buffer.3,ed_figure_only -edit4 edit_box 16,170,206,cl_white,0,0,0,1,sign_n_input,ed_figure_only,1 +edit1 edit_box 300,5,35,cl_white,0,0,0,1024,ed_buffer.1,ed_focus ; путь к файлу +edit2 edit_box 35,75,134,cl_white,0,0,0,9,ed_buffer.2,ed_figure_only ; задержка +edit3 edit_box 35,165,164,cl_white,0,0,0,9,ed_buffer.3,ed_figure_only +edit4 edit_box 16,165,181,cl_white,0,0,0,1,sign_n_input,ed_figure_only,1 editboxes_end: buttons: -but1 txt_button 150,10,15,90,2,0,0,but_text.1,one_shoot -but2 txt_button 145,165,15,90,3,0,0,but_text.2,save_shoot -but3 txt_button 140,120,12,145,4,0,0,but_text.3,show_scr_window -but4 txt_button 80,210,15,188,5,0,0,but_text.4,apply_number -but5 txt_button 150,10,15,110,6,0,0,but_text.5,start_autoshoot -but6 txt_button 145,165,15,110,7,0,0,but_text.6,stop_autoshoot +but1 txt_button 150,5,15,65,2,0,0,but_text.1,one_shoot ; сделать снимок +but2 txt_button 145,160,15,65,3,0,0,but_text.2,save_shoot ; сохранить снимок +but3 txt_button 140,115,12,120,4,0,0,but_text.3,show_scr_window ; показать снимок +but4 txt_button 80,205,15,163,5,0,0,but_text.4,apply_number ; применить номер +but5 txt_button 150,5,15,85,6,0,0,but_text.5,start_autoshoot ; начать автосъёмку +but6 txt_button 145,160,15,85,7,0,0,but_text.6,stop_autoshoot ; остановить автосъёмку +but7 txt_button 40,205,10,150,8,0,0,but_text.7,show_set_rect_window ; задать область buttons_end: check_boxes: -ch1 check_box 10,130,cl_white,0,0,ch_text.1,(ch_text.2-ch_text.1) -ch2 check_box 10,145,cl_white,0,0,ch_text.2,(ch_text.3-ch_text.2) -ch3 check_box 150,130,cl_white,0,0,ch_text.3,(ch_text.4-ch_text.3) -ch4 check_box 10,160,cl_white,0,0,ch_text.4,(ch_text.5-ch_text.4) -ch5 check_box 10,175,cl_white,0,0,ch_text.5,(ch_text.6-ch_text.5) -ch6 check_box 10,190,cl_white,0,0,ch_text.6,(ch_text.7-ch_text.6) +ch1 check_box 5,105,cl_white,0,0,ch_text.1,(ch_text.2-ch_text.1) ; свернуть окно +ch2 check_box 5,120,cl_white,0,0,ch_text.2,(ch_text.3-ch_text.2) ; затем сделать активным +ch3 check_box 145,105,cl_white,0,0,ch_text.3,(ch_text.4-ch_text.3) ; показать снимок +ch4 check_box 5,135,cl_white,0,0,ch_text.4,(ch_text.5-ch_text.4) ; +ch5 check_box 5,150,cl_white,0,0,ch_text.5,(ch_text.6-ch_text.5) +ch6 check_box 5,165,cl_white,0,0,ch_text.6,(ch_text.7-ch_text.6) +use_rect check_box 145,150,cl_white,0,0,ch_text.7,(ch_text.8-ch_text.7) ; исп. область ; автонумерация check_boxes_end: if lang eq ru text: -.2: db 'Высота экрана:',0 -.1: db 'Ширина экрана:',0 -.3: db 'Введите полный путь к файлу:',0 -.4: db 'Бит на пиксель:',0 -.5: db 'Байт на строку:',0 -.6: db '100 = 1 секунда',0 +.2 db 'Высота экрана:',0 +.1 db 'Ширина экрана:',0 +.3 db 'Введите полный путь к файлу:',0 +.4 db 'Бит на пиксель:',0 +.5 db 'Байт на строку:',0 +.6 db '100 = 1 секунда',0 ;.7: db 'Введите имя файла:',0 ;.8: db 'Вместо "*" в имени файла будет вставляться номер.',0 -.9: db 'Текущий номер снимка:',0 -.10: db 'Количество знаков в номере:',0 +.9 db 'Номер текущего снимка:',0 +.10 db 'Количество знаков в номере:',0 but_text: -.1: db 'Сделать снимок экрана',0 -.2: db 'Сохранить снимок экрана',0 -.3: db 'Показать снимок сейчас',0 -.4: db 'Применить',0 -.5: db 'Начать автосъемку',0 -.6: db 'Остановить автосъемку',0 +.1 db 'Сделать снимок экрана',0 +.2 db 'Сохранить снимок экрана',0 +.3 db 'Показать снимок сейчас',0 +.4 db 'Применить',0 +.5 db 'Начать автосъемку',0 +.6 db 'Остановить автосъемку',0 +.7 db 'задать',0 ch_text: .1 db 'Свернуть окно';,0 .2 db 'Показать снимок';,0 .3 db 'затем сделать активным';,0 -.4: db 'Задержка:';,0 -.5: db 'Автосохранение';,0 -.6: db 'Автонумерация, начиная с';,0 -.7: +.4 db 'Задержка:';,0 +.5 db 'Автосохранение';,0 +.6 db 'Автонумерация, начиная с';,0 +.7 db 'Область' +.8: no_shoot db 'Снимок не сделан',0 shooting db 'Фотографирование...',0 @@ -503,6 +563,7 @@ ac_den db ' device_er db 'Ошибка устройства',0 not_shooted db 'Сделайте снимок !!!',0 no_file_name db 'Введите имя файла !!!',0 +invalid_rect db 'Недопустимые размеры области',0 end if sign_n_input: @@ -538,6 +599,15 @@ sf_buf: .bmp_area dd ? .end dd ? +set_rect_window_pid dd ? +set_rect_window_slot dd ? + +rect_input_buffer: +.left rb 6 +.top rb 6 +.width rb 6 +.height rb 6 + cmdstr rb 257 ed_buffer: @@ -549,7 +619,17 @@ file_name: rb 1058 scr screen_prop +rect: +.left dw ? +.top dw ? +.height dw ? +.width dw ? + + sc sys_color_table -app procinfo -shoot_esp rb 512 +app procinfo ; информация о главном окне +active_app procinfo ; информация об активном окне +set_rect_window_procinfo procinfo ; информация об окне области +shoot_esp rb 512 ; стек потока фотканья +set_rect_window_esp rb 512 ; стек окна области app_end ; конец программы \ No newline at end of file diff --git a/programs/media/scrshoot/scrwin.inc b/programs/media/scrshoot/scrwin.inc index 34b70c38c9..ed07c0bc52 100644 --- a/programs/media/scrshoot/scrwin.inc +++ b/programs/media/scrshoot/scrwin.inc @@ -1,3 +1,6 @@ +;==================================================================== +;===== ОКНО ПРЕДПРОСМОТРА =========================================== +;==================================================================== scr_window: .start: .red: