Rev 1608 | Rev 1685 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1608 | mario79 | 1 | ; |
2 | ; Screenshooter for Kolibri |
||
3 | ; |
||
4 | ; version: 1.0 |
||
5 | ; last update: 08/09/2010 |
||
6 | ; written by: Marat Zakiyanov aka Mario79, aka Mario |
||
7 | ; changes: select path for save with OpenDialog, |
||
8 | ; bag fix for threads stacks |
||
9 | ;--------------------------------------------------------------------- |
||
1373 | IgorA | 10 | ; 01.06.09 - Компоненты беруться из системной библиотеки |
205 | heavyiron | 11 | ; Автор программы Евтихов Максим (Maxxxx32) |
833 | Lrz | 12 | ; 24.07.2008 |
307 | Lrz | 13 | ; 01.02.07 - обновлён editbox |
14 | ; 31.01.07 - всё теперь рисуется относительно клиентской области |
||
205 | heavyiron | 15 | |
1608 | mario79 | 16 | title equ 'Screenshooter v 1.0' ; Заголовок окна |
1109 | Lrz | 17 | include '../../develop/libraries/box_lib/load_lib.mac' |
1373 | IgorA | 18 | include '../../develop/libraries/box_lib/trunk/box_lib.mac' |
1098 | Lrz | 19 | ;include '../../develop/examples/editbox/trunk/editbox.inc' |
20 | include '../../macros.inc' |
||
21 | include 'txtbut.inc' |
||
22 | include 'label.inc' |
||
23 | include 'textwork.inc' |
||
1228 | Lrz | 24 | include 'scrshoot.mac' |
205 | heavyiron | 25 | |
1098 | Lrz | 26 | ;include 'macros.inc' ; вставляем макросы |
27 | ; meos_header cmdstr ; вставляем заголовок программы |
||
1373 | IgorA | 28 | use32 |
1098 | Lrz | 29 | org 0x0 |
30 | db 'MENUET01' |
||
31 | dd 0x1 |
||
32 | dd start |
||
1608 | mario79 | 33 | dd IM_END |
1098 | Lrz | 34 | dd i_end |
1608 | mario79 | 35 | dd stacktop |
1098 | Lrz | 36 | dd cmdstr |
37 | dd cur_dir_path |
||
38 | |||
39 | align 4 |
||
1373 | IgorA | 40 | @use_library |
41 | use_txt_button ; | |
||
42 | use_label ; |-- GUI компоненты и некоторые процедуры |
||
43 | use_text_work ; / |
||
1228 | Lrz | 44 | include 'scrwin.inc' ; вставляем код окна прдпросмотра |
45 | include 'scrsavef.inc'; вставляем процедуру сохранения файла |
||
46 | |||
307 | Lrz | 47 | include 'gp.inc' |
48 | include 'srectwin.inc' |
||
310 | heavyiron | 49 | include 'lang.inc' |
1373 | IgorA | 50 | |
51 | macro get_sys_colors col_buf |
||
52 | { |
||
53 | ;mov eax,48 |
||
54 | push 48 |
||
55 | pop eax |
||
56 | ;mov ebx,3 |
||
57 | push 3 |
||
58 | pop ebx |
||
59 | ;mov ecx,col_buf |
||
60 | push col_buf |
||
61 | pop ecx |
||
62 | ;mov edx,40 |
||
63 | push 40 |
||
64 | pop edx |
||
65 | mcall |
||
66 | } |
||
67 | |||
205 | heavyiron | 68 | ;--- начало программы --- |
1098 | Lrz | 69 | align 4 |
70 | start: |
||
1608 | mario79 | 71 | ;sys_load_library library_name, cur_dir_path, library_path, system_path, \ |
72 | ;err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i |
||
73 | |||
74 | load_libraries l_libs_start,end_l_libs |
||
75 | |||
1098 | Lrz | 76 | ;if return code =-1 then exit, else nornary work |
77 | ; cmp eax,-1 |
||
1373 | IgorA | 78 | inc eax |
79 | test eax,eax |
||
80 | jz close |
||
1098 | Lrz | 81 | ;;;;;;;;;;;;;;;; init memory 68/11 |
1373 | IgorA | 82 | mov eax,68 |
83 | mov ebx,11 |
||
84 | mcall |
||
85 | test eax,eax |
||
86 | jz close |
||
1098 | Lrz | 87 | |
1608 | mario79 | 88 | ;--------------------------------------------------------------------- |
89 | mov edi,filename_area |
||
90 | mov esi,start_temp_file_name |
||
91 | xor eax,eax |
||
92 | cld |
||
93 | @@: |
||
94 | lodsb |
||
95 | stosb |
||
96 | test eax,eax |
||
97 | jnz @b |
||
98 | |||
99 | |||
100 | mov edi,fname_buf |
||
101 | mov esi,ed_buffer.1 |
||
102 | xor eax,eax |
||
103 | cld |
||
104 | @@: |
||
105 | lodsb |
||
106 | stosb |
||
107 | test eax,eax |
||
108 | jnz @b |
||
109 | |||
110 | ;OpenDialog initialisation |
||
111 | push dword OpenDialog_data |
||
112 | call [OpenDialog_Init] |
||
113 | |||
114 | ; prepare for PathShow |
||
115 | push dword PathShow_data_1 |
||
116 | call [PathShow_prepare] |
||
117 | ;--------------------------------------------------------------------- |
||
1373 | IgorA | 118 | ;mov al,[gs:1280*4*1024] |
119 | ; устанавливаем ipc буффер |
||
120 | push 60 |
||
121 | pop eax |
||
122 | ;mov ebx,1 |
||
123 | xor ebx,ebx |
||
124 | inc ebx |
||
125 | mov ecx,app_ipc |
||
126 | mov edx,32 |
||
127 | mcall |
||
205 | heavyiron | 128 | |
1373 | IgorA | 129 | push 66 ; устанавливаем глобальную горячую клавишу |
130 | pop eax |
||
131 | push eax |
||
132 | mov ebx,4 |
||
133 | mov cl,55 ; 55 - PrintScrn |
||
134 | xor edx,edx |
||
135 | mcall |
||
205 | heavyiron | 136 | |
1373 | IgorA | 137 | mov ebx,app |
138 | call get_slot_n |
||
139 | mov [slot_n],ecx |
||
205 | heavyiron | 140 | |
1373 | IgorA | 141 | ; устанавливаем маску событий |
142 | set_events_mask (evm_redraw+evm_key+evm_button+evm_mouse+evm_ipc) |
||
205 | heavyiron | 143 | |
144 | ; сюда прыгаем при каждой перерисовке |
||
145 | red: |
||
1373 | IgorA | 146 | get_procinfo app ; получаем информацию о процессе |
147 | get_sys_colors sc ; получаем системные цвета |
||
205 | heavyiron | 148 | |
1373 | IgorA | 149 | ; устанавливаем системные цвета у GUI компонентов |
150 | txt_but_set_sys_color buttons,buttons_end,sc ; \ |
||
151 | labels_set_sys_color labels,labels_end,sc ; | |
||
152 | check_boxes_set_sys_color check_boxes,check_boxes_end,sc ; | |
||
153 | edit_boxes_set_sys_color editboxes,editboxes_end,sc ; / |
||
205 | heavyiron | 154 | |
1373 | IgorA | 155 | get_screen_prop scr ; получаем информацию об экране |
156 | call draw_window ; перерисовываем окно |
||
205 | heavyiron | 157 | still: |
1373 | IgorA | 158 | wait_event red,key,button,mouse,ipc,still ; ждем событий |
205 | heavyiron | 159 | |
160 | key: |
||
1373 | IgorA | 161 | get_key |
162 | cmp al,2 |
||
163 | jne @f |
||
164 | cmp ah,55 |
||
1608 | mario79 | 165 | jne still |
166 | mov [PrintScreen],1 |
||
1373 | IgorA | 167 | call shoot |
1608 | mario79 | 168 | mov [PrintScreen],0 |
1373 | IgorA | 169 | jmp still |
205 | heavyiron | 170 | @@: |
1098 | Lrz | 171 | ; key_edit_boxes editboxes,editboxes_end |
1608 | mario79 | 172 | ; push dword edit1 |
173 | ; call [edit_box_key] |
||
1098 | Lrz | 174 | |
1373 | IgorA | 175 | push dword edit2 |
176 | call [edit_box_key] |
||
1098 | Lrz | 177 | |
1373 | IgorA | 178 | push dword edit3 |
179 | call [edit_box_key] |
||
1098 | Lrz | 180 | |
1373 | IgorA | 181 | push dword edit4 |
182 | call [edit_box_key] |
||
1098 | Lrz | 183 | |
1373 | IgorA | 184 | jmp still |
205 | heavyiron | 185 | button: |
1373 | IgorA | 186 | get_pressed_button |
187 | cmp ah,1 |
||
188 | je p_close |
||
189 | txt_but_ev buttons,buttons_end |
||
190 | jmp still |
||
205 | heavyiron | 191 | mouse: |
1373 | IgorA | 192 | get_active_window |
193 | cmp eax,[slot_n] |
||
194 | jne still |
||
1098 | Lrz | 195 | ;---------------------------------- |
1608 | mario79 | 196 | ; push dword edit1 |
197 | ; call [edit_box_mouse] |
||
1373 | IgorA | 198 | push dword edit2 |
199 | call [edit_box_mouse] |
||
200 | push dword edit3 |
||
201 | call [edit_box_mouse] |
||
202 | push dword edit4 |
||
203 | call [edit_box_mouse] |
||
1098 | Lrz | 204 | ;---------------------------------- |
1373 | IgorA | 205 | push dword ch1 |
206 | call [check_box_mouse] |
||
207 | push dword ch2 |
||
208 | call [check_box_mouse] |
||
209 | push dword ch3 |
||
210 | call [check_box_mouse] |
||
211 | push dword ch4 |
||
212 | call [check_box_mouse] |
||
213 | push dword ch5 |
||
214 | call [check_box_mouse] |
||
215 | push dword ch6 |
||
216 | call [check_box_mouse] |
||
217 | push dword use_rect |
||
218 | call [check_box_mouse] |
||
1098 | Lrz | 219 | ;----------------------------------- |
220 | ; mouse_check_boxes check_boxes,check_boxes_end |
||
221 | ; mouse_edit_boxes editboxes,editboxes_end |
||
1373 | IgorA | 222 | jmp still |
205 | heavyiron | 223 | ipc: |
1373 | IgorA | 224 | cmp word [app_ipc+8],2 |
225 | jne @f |
||
226 | min_window |
||
227 | jmp .clear_ipc |
||
205 | heavyiron | 228 | @@: |
1373 | IgorA | 229 | cmp word [app_ipc+8],3 |
230 | jne @f |
||
231 | mov ecx,[slot_n] |
||
232 | activ_window |
||
233 | jmp .clear_ipc |
||
1100 | Lrz | 234 | @@: |
1373 | IgorA | 235 | call draw_number |
236 | call dr_st |
||
205 | heavyiron | 237 | |
238 | .clear_ipc: |
||
1373 | IgorA | 239 | cld |
240 | xor eax,eax |
||
241 | mov ecx,32/4 |
||
242 | mov edi,app_ipc |
||
243 | rep stosd |
||
244 | jmp still |
||
205 | heavyiron | 245 | |
246 | p_close: |
||
1373 | IgorA | 247 | btr dword [flags],1 |
307 | Lrz | 248 | |
1373 | IgorA | 249 | bt dword [flags],3 |
250 | jnc @f |
||
251 | mov eax,18 |
||
252 | mov ebx,eax |
||
253 | mov ecx,[set_rect_window_pid] |
||
254 | mcall |
||
307 | Lrz | 255 | @@: |
256 | |||
205 | heavyiron | 257 | close: |
1373 | IgorA | 258 | app_close |
205 | heavyiron | 259 | |
1608 | mario79 | 260 | ;--------------------------------------------------------------------- |
261 | draw_PathShow: |
||
262 | pusha |
||
263 | mcall 13,<4,302>,<35,15>,0xffffff |
||
264 | ; draw for PathShow |
||
265 | push dword PathShow_data_1 |
||
266 | call [PathShow_draw] |
||
267 | popa |
||
268 | ret |
||
205 | heavyiron | 269 | ;-------------------------------------------------------------------- |
270 | ;--- прооцедура перерисовки главного окна --------------------------- |
||
271 | ;-------------------------------------------------------------------- |
||
272 | draw_window: |
||
1373 | IgorA | 273 | start_draw_window ; начало перерисовки |
274 | ; определяем окно |
||
275 | get_skin_height |
||
276 | mov ebx,100*65536+320 |
||
277 | mov ecx,100*65536+220 |
||
278 | add cx,ax |
||
279 | mov edx,[sc.work] |
||
280 | or edx,0x34000000;0x33000000 |
||
281 | xor esi,esi |
||
282 | ;xor edi,edi |
||
283 | mov edi,grab_text |
||
284 | xor eax,eax |
||
285 | mcall |
||
205 | heavyiron | 286 | |
1373 | IgorA | 287 | mov eax,47 ; выводим числа в окно |
288 | mov bx,4 |
||
289 | shl ebx,16 |
||
290 | movsx ecx,word [scr.width] ; ширина экрана |
||
291 | mov dx,95 |
||
292 | shl edx,16 |
||
293 | mov dx,[label1.top] |
||
294 | push dx |
||
295 | mov esi,[sc.work_text] |
||
296 | mcall |
||
297 | movsx ecx,word [scr.height] ; высота экрана |
||
298 | mov dx,[label2.top] |
||
299 | mcall |
||
300 | mov bx,2 |
||
301 | shl ebx,16 |
||
302 | movsx ecx,word [scr.bitspp] ; бит на пиксель |
||
303 | mov dx,240 |
||
304 | shl edx,16 |
||
305 | pop dx |
||
306 | mcall |
||
307 | mov bx,6 |
||
308 | shl ebx,16 |
||
309 | mov ecx,[scr.bytesps] ; байт на строку |
||
310 | mov dx,[label2.top] |
||
311 | mcall |
||
205 | heavyiron | 312 | |
1373 | IgorA | 313 | call draw_number ; прорисовываем номер снимка |
314 | call dr_st |
||
205 | heavyiron | 315 | |
1373 | IgorA | 316 | draw_labels labels,labels_end ; метки |
1098 | Lrz | 317 | ; draw_edit_boxes editboxes,editboxes_end ; edit_box |
318 | ;------ show check editbox ----------- |
||
1608 | mario79 | 319 | ; push dword edit1 |
320 | ; call [edit_box_draw] |
||
1373 | IgorA | 321 | push dword edit2 |
322 | call [edit_box_draw] |
||
323 | push dword edit3 |
||
324 | call [edit_box_draw] |
||
325 | push dword edit4 |
||
326 | call [edit_box_draw] |
||
1098 | Lrz | 327 | ;------ end check all editbox ------- |
328 | |||
1608 | mario79 | 329 | call draw_PathShow |
330 | |||
1373 | IgorA | 331 | draw_txt_buttons buttons,buttons_end ; кнопки |
1098 | Lrz | 332 | ; draw_check_boxes check_boxes,check_boxes_end ; флажки |
333 | ;------ check all checkbox --------- |
||
1373 | IgorA | 334 | push dword ch1 |
335 | call [check_box_draw] |
||
336 | push dword ch2 |
||
337 | call [check_box_draw] |
||
338 | push dword ch3 |
||
339 | call [check_box_draw] |
||
340 | push dword ch4 |
||
341 | call [check_box_draw] |
||
342 | push dword ch5 |
||
343 | call [check_box_draw] |
||
344 | push dword ch6 |
||
345 | call [check_box_draw] |
||
346 | push dword use_rect |
||
347 | call [check_box_draw] |
||
1098 | Lrz | 348 | ;------ end check all checkbox ------ |
349 | |||
205 | heavyiron | 350 | stop_draw_window ; конец перерисовки |
351 | ret |
||
352 | |||
353 | shoot: |
||
1373 | IgorA | 354 | bt dword [ch4.flags],1 ; включена ли задержка ? |
355 | jnc @f |
||
356 | draw_status delay_now |
||
357 | mov edi,ed_buffer.2 |
||
358 | call zstr_to_int |
||
359 | mov ebx,eax |
||
360 | delay |
||
205 | heavyiron | 361 | @@: |
1373 | IgorA | 362 | call get_mem_for_shoot; получаем память для снимка |
205 | heavyiron | 363 | |
364 | |||
1373 | IgorA | 365 | bts dword [flags],0 ; нулевой флаг - снимок есть в памяти |
205 | heavyiron | 366 | |
1373 | IgorA | 367 | ; делаем снимок |
368 | draw_status shooting |
||
369 | mov esi,scr |
||
370 | mov edi,[scr_buf.ptr] |
||
371 | call copy_screen_to_image |
||
205 | heavyiron | 372 | |
1373 | IgorA | 373 | bt dword [use_rect.flags],1 |
374 | jc .use_rect |
||
375 | push dword [scr] |
||
376 | jmp @f |
||
307 | Lrz | 377 | .use_rect: |
1373 | IgorA | 378 | push dword [rect.height] |
307 | Lrz | 379 | @@: |
1373 | IgorA | 380 | pop dword [scr_buf.size] |
205 | heavyiron | 381 | |
1610 | mario79 | 382 | cmp [autoshoot_flag],1 |
383 | jne .2 |
||
384 | |||
385 | bt dword [ch5.flags],1 ; включено ли автосохранение ? |
||
386 | jnc @f |
||
387 | call save_file |
||
388 | @@: |
||
1373 | IgorA | 389 | draw_status shooted_ok |
1610 | mario79 | 390 | .2: |
1373 | IgorA | 391 | bt dword [flags],1 |
392 | jnc @f |
||
393 | ret |
||
205 | heavyiron | 394 | @@: |
395 | |||
1373 | IgorA | 396 | bt dword [ch2.flags],1 ; показать окно предпросмотра ? |
397 | jnc @f |
||
1610 | mario79 | 398 | cmp [PrintScreen],0 |
1608 | mario79 | 399 | jne @f |
1373 | IgorA | 400 | call show_scr_window |
1100 | Lrz | 401 | ret |
205 | heavyiron | 402 | @@: |
1608 | mario79 | 403 | bt dword [ch5.flags],1 ; включено ли автосохранение ? |
404 | jnc @f |
||
405 | |||
406 | ; invoke OpenDialog |
||
407 | push dword OpenDialog_data |
||
408 | call [OpenDialog_Start] |
||
409 | cmp [OpenDialog_data.status],1 |
||
410 | je .1 |
||
411 | ret |
||
412 | .1: |
||
413 | ; prepare for PathShow |
||
414 | push dword PathShow_data_1 |
||
415 | call [PathShow_prepare] |
||
416 | |||
417 | call save_file |
||
418 | @@: |
||
419 | |||
1373 | IgorA | 420 | bt word [ch3.flags],1 ; восстановить окно ? |
421 | jnc @f |
||
205 | heavyiron | 422 | |
1373 | IgorA | 423 | delay 100 |
424 | mov ecx,[slot_n] |
||
425 | activ_window |
||
205 | heavyiron | 426 | @@: |
427 | ret |
||
428 | |||
307 | Lrz | 429 | ;--- получить память для снимка --- |
205 | heavyiron | 430 | get_mem_for_shoot: |
1098 | Lrz | 431 | ;clean memory |
1373 | IgorA | 432 | mov ecx,dword [scr_buf.ptr] |
433 | mov ebx,13 |
||
434 | mov eax,68 |
||
435 | mcall |
||
1098 | Lrz | 436 | |
1373 | IgorA | 437 | bt dword [use_rect.flags],1 ; фоткать область экрана |
438 | jc .use_area |
||
439 | movzx ecx, word [scr.width] |
||
440 | movzx ebx, word [scr.height] |
||
441 | jmp @f |
||
307 | Lrz | 442 | .use_area: |
1373 | IgorA | 443 | call read_rect |
444 | movzx ecx, word [rect.width] |
||
445 | movzx ebx, word [rect.height] |
||
307 | Lrz | 446 | @@: |
1373 | IgorA | 447 | imul ecx,ebx |
448 | lea ecx,[ecx*3] |
||
1098 | Lrz | 449 | ; add ecx,i_end |
1373 | IgorA | 450 | mov ebx,12 |
451 | mov eax,68 |
||
452 | mcall |
||
453 | mov [scr_buf.ptr],eax |
||
454 | add eax,ecx |
||
455 | mov [scr_buf.end_ptr],ecx |
||
205 | heavyiron | 456 | ret |
457 | |||
458 | ;--- содать окно проедпросмотра --- |
||
459 | show_scr_window: |
||
460 | pusha |
||
1373 | IgorA | 461 | bt dword [flags],0 |
462 | jnc @f |
||
463 | mov eax,51 |
||
464 | xor ebx,ebx |
||
465 | inc ebx |
||
466 | mov ecx,scr_window |
||
1610 | mario79 | 467 | mov edx,i_end_tread-512 |
1373 | IgorA | 468 | mcall |
205 | heavyiron | 469 | @@: |
470 | popa |
||
471 | ret |
||
472 | |||
473 | ;--- прочитать и нарисовать текущий номер --- |
||
474 | apply_number: |
||
1373 | IgorA | 475 | mov edi,ed_buffer.3 |
476 | call zstr_to_int |
||
477 | mov [cur_number],eax |
||
478 | call draw_number |
||
205 | heavyiron | 479 | ret |
480 | |||
481 | ;--- процедура прорисовки текущего номера --- |
||
482 | draw_number: |
||
1373 | IgorA | 483 | mov edi,sign_n_input |
484 | call zstr_to_int |
||
485 | mov [sign_n],al |
||
486 | mov eax,13 |
||
487 | mov ebx,150*65536+96 |
||
488 | mov cx,[label9.top] |
||
489 | shl ecx,16 |
||
490 | mov cx,10 |
||
491 | mov edx,[sc.work] |
||
492 | mcall |
||
493 | mov eax,47 |
||
494 | movsx bx,byte [sign_n] |
||
495 | shl ebx,16 |
||
496 | mov ecx,[cur_number] |
||
497 | mov dx,150 |
||
498 | shl edx,16 |
||
499 | mov dx,[label9.top] |
||
500 | mov esi,[sc.work_text] |
||
501 | mcall |
||
205 | heavyiron | 502 | ret |
503 | |||
504 | ;--- процедура, запускающая поток автосъемки --- |
||
505 | start_autoshoot: |
||
1373 | IgorA | 506 | bts dword [flags],1 |
507 | jc @f |
||
508 | mov eax,51 |
||
509 | ;mov ebx,1 |
||
510 | xor ebx,ebx |
||
511 | inc ebx |
||
512 | mov ecx,autoshoot |
||
1610 | mario79 | 513 | mov edx,i_end_tread |
1373 | IgorA | 514 | mcall |
205 | heavyiron | 515 | @@: |
516 | ret |
||
517 | |||
518 | ;--- останавливает этот поток --- |
||
519 | stop_autoshoot: |
||
1373 | IgorA | 520 | btr dword [flags],1 |
205 | heavyiron | 521 | ret |
522 | |||
523 | ;--- цикл потока автосъемки --- |
||
524 | autoshoot: |
||
1610 | mario79 | 525 | mov [autoshoot_flag],1 |
1373 | IgorA | 526 | mov ecx,[slot_n] |
527 | activ_window |
||
205 | heavyiron | 528 | .next: |
1373 | IgorA | 529 | bt dword [flags],1 |
530 | jnc close |
||
531 | mov eax,60 |
||
532 | mov ebx,2 |
||
533 | mov ecx,[app.pid] |
||
534 | mov edx,messages.draw_number |
||
535 | mov esi,2 |
||
536 | mcall |
||
537 | call shoot |
||
538 | jmp autoshoot.next |
||
1610 | mario79 | 539 | .close: |
540 | mov [autoshoot_flag],0 |
||
541 | jmp close |
||
205 | heavyiron | 542 | ;--- процедура прорисовки строки состояния --- |
543 | ; (должна вызываться потоком главного окна) |
||
544 | dr_st: |
||
1373 | IgorA | 545 | mov eax,38 ; отрезок |
546 | mov ebx,0*65536+310 |
||
547 | mov ecx,198*65536+198 |
||
548 | mov edx,[sc.work_graph] |
||
549 | mcall |
||
205 | heavyiron | 550 | |
1373 | IgorA | 551 | mov eax,13 ; полоска |
552 | mov bx,310 |
||
553 | mov ecx,199*65536+15 |
||
554 | mov edx,[sc.work] |
||
555 | mcall |
||
205 | heavyiron | 556 | |
1373 | IgorA | 557 | mov edi,status |
558 | call draw_label |
||
205 | heavyiron | 559 | ret |
560 | |||
561 | ;--- процедура получения номера слота потока --- |
||
562 | ; вход ebx - буффер 1024 байт |
||
563 | ; выход ecx - номер слота |
||
564 | get_slot_n: |
||
1373 | IgorA | 565 | mov eax,9 |
566 | xor ecx,ecx |
||
567 | dec ecx |
||
568 | mcall |
||
205 | heavyiron | 569 | |
1373 | IgorA | 570 | mov edx,[ebx+30] |
571 | xor ecx,ecx |
||
205 | heavyiron | 572 | @@: |
1373 | IgorA | 573 | mov eax,9 |
574 | inc ecx |
||
575 | mcall |
||
576 | cmp [ebx+30],edx |
||
577 | je @f |
||
578 | jmp @b |
||
205 | heavyiron | 579 | @@: |
580 | ret |
||
581 | |||
307 | Lrz | 582 | ;--- процедура, запускающая поток, делающий 1 снимок --- |
205 | heavyiron | 583 | one_shoot: |
1373 | IgorA | 584 | mov ecx,one_shoot_thread |
585 | mov edx,shoot_esp |
||
586 | jmp @f |
||
307 | Lrz | 587 | ;--- процедра, запускающая поток, сохраняющий снимок --- |
205 | heavyiron | 588 | save_shoot: |
1608 | mario79 | 589 | ; invoke OpenDialog |
590 | push dword OpenDialog_data |
||
591 | call [OpenDialog_Start] |
||
592 | cmp [OpenDialog_data.status],1 |
||
593 | je .1 |
||
594 | ret |
||
595 | .1: |
||
596 | ; prepare for PathShow |
||
597 | push dword PathShow_data_1 |
||
598 | call [PathShow_prepare] |
||
599 | |||
600 | call draw_PathShow |
||
601 | |||
1373 | IgorA | 602 | mov ecx,save_shoot_thread |
603 | mov edx,shoot_esp |
||
205 | heavyiron | 604 | @@: |
1373 | IgorA | 605 | bts dword [flags],2 |
606 | jc .running |
||
607 | bt dword [flags],1 |
||
608 | jc .running |
||
205 | heavyiron | 609 | |
1373 | IgorA | 610 | mov eax,51 |
611 | ;mov ebx,1 |
||
612 | xor ebx,ebx |
||
613 | inc ebx |
||
614 | mcall |
||
205 | heavyiron | 615 | .running: |
616 | ret |
||
617 | |||
307 | Lrz | 618 | ;--- поток, делающий 1 снимок --- |
205 | heavyiron | 619 | one_shoot_thread: |
1373 | IgorA | 620 | mov ecx,[slot_n] |
621 | activ_window |
||
622 | bt dword [ch1.flags],1 ; минимизировать окно ? |
||
623 | jnc @f |
||
624 | mov eax,60 |
||
625 | mov ebx,2 |
||
626 | mov ecx,[app.pid] |
||
627 | mov edx,messages.min_window |
||
628 | mov esi,2 |
||
629 | mcall |
||
205 | heavyiron | 630 | @@: |
1373 | IgorA | 631 | call shoot |
632 | btr dword [flags],2 |
||
633 | jmp close |
||
205 | heavyiron | 634 | |
307 | Lrz | 635 | ;--- процедура, отправляющая главному окну сообщение о перерисовке |
636 | ; строки состояния --- |
||
205 | heavyiron | 637 | send_draw_status: |
1373 | IgorA | 638 | mov eax,60 |
639 | mov ebx,2 |
||
640 | mov ecx,[app.pid] |
||
641 | mov edx,messages.draw_status |
||
642 | mov esi,2 |
||
643 | mcall |
||
205 | heavyiron | 644 | ret |
645 | |||
307 | Lrz | 646 | ;--- поток, сохраняюий файл --- |
205 | heavyiron | 647 | save_shoot_thread: |
1373 | IgorA | 648 | mov ecx,[slot_n] |
649 | activ_window |
||
650 | call save_file |
||
651 | btr dword [flags],2 |
||
652 | jmp close |
||
205 | heavyiron | 653 | |
307 | Lrz | 654 | ;--- процедура, запускающая поток окна установки области съемки --- |
655 | show_set_rect_window: |
||
1373 | IgorA | 656 | bts dword [flags],3 |
657 | jc @f |
||
658 | mov eax,51 |
||
659 | xor ebx,ebx |
||
660 | inc ebx |
||
661 | mov ecx,set_rect_window |
||
662 | mov edx,set_rect_window_esp |
||
663 | mcall |
||
307 | Lrz | 664 | |
1373 | IgorA | 665 | mov [set_rect_window_pid],eax |
307 | Lrz | 666 | ret |
667 | |||
668 | @@: |
||
1373 | IgorA | 669 | mov eax,18 |
670 | mov ebx,eax |
||
671 | mov ecx,[set_rect_window_pid] |
||
672 | mcall |
||
673 | btr dword [flags],3 |
||
307 | Lrz | 674 | ret |
675 | |||
676 | ;--- получение информации об активном окне --- |
||
677 | get_active_window_info: |
||
1373 | IgorA | 678 | mov eax,18 |
679 | mov ebx,7 |
||
680 | mcall |
||
307 | Lrz | 681 | |
1373 | IgorA | 682 | mov ecx,eax |
683 | mov eax,9 |
||
684 | mov ebx,active_app |
||
685 | mcall |
||
307 | Lrz | 686 | ret |
687 | |||
205 | heavyiron | 688 | ;==================================================================== |
689 | ;=== данные программы =============================================== |
||
690 | ;==================================================================== |
||
691 | messages: |
||
692 | .draw_number dw 0 |
||
693 | .draw_status dw 1 |
||
694 | .min_window dw 2 |
||
1100 | Lrz | 695 | .act_window dw 3 |
205 | heavyiron | 696 | |
697 | grab_text: |
||
1373 | IgorA | 698 | db title,0 |
307 | Lrz | 699 | |
205 | heavyiron | 700 | labels: |
307 | Lrz | 701 | label1 label 5,5,0,text.1 ; ширина экрана |
702 | label2 label 5,15,0,text.2 ; высота экрана |
||
703 | label3 label 5,25,0,text.3 ; введите имя файла |
||
704 | label4 label 150,5,0,text.4 ; бит на пиксель |
||
705 | label5 label 150,15,0,text.5 ; байт на строку |
||
706 | label6 label 115,138,0,text.6 ; 100 = 1 сек. |
||
205 | heavyiron | 707 | ;label7 label 10,190,0,text.7 |
708 | ;label8 label 10,225,0,text.8 |
||
307 | Lrz | 709 | label9 label 5,52,0,text.9 ; номер текущего симка |
710 | label10 label 5,185,0,text.10 |
||
711 | status label 5,201,0,no_shoot |
||
205 | heavyiron | 712 | labels_end: |
713 | |||
1608 | mario79 | 714 | ;--------------------------------------------------------------------- |
715 | l_libs_start: |
||
716 | |||
717 | library01 l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \ |
||
718 | err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i |
||
719 | |||
720 | library02 l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \ |
||
721 | err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i |
||
722 | |||
723 | end_l_libs: |
||
724 | ;--------------------------------------------------------------------- |
||
205 | heavyiron | 725 | editboxes: |
1608 | mario79 | 726 | ;edit1 edit_box 300,5,35,cl_white,0,0,0,0,300,ed_buffer.1,mouse_dd,ed_focus,10,10 ; путь к файлу |
1373 | IgorA | 727 | edit2 edit_box 35,75,134,cl_white,0,0,0,0,9,ed_buffer.2,mouse_dd,ed_figure_only,3,3 ; задержка |
1228 | Lrz | 728 | edit3 edit_box 35,165,164,cl_white,0,0,0,0,9,ed_buffer.3,mouse_dd,ed_figure_only ; автонумерация |
729 | edit4 edit_box 16,165,181,cl_white,0,0,0,0,1,sign_n_input,mouse_dd,ed_figure_only,1 |
||
205 | heavyiron | 730 | editboxes_end: |
1608 | mario79 | 731 | ;--------------------------------------------------------------------- |
205 | heavyiron | 732 | buttons: |
1373 | IgorA | 733 | but1 txt_button 150,5,15,65,2,0,0,but_text.1,one_shoot ; сделать снимок |
734 | but2 txt_button 145,160,15,65,3,0,0,but_text.2,save_shoot ; сохранить снимок |
||
307 | Lrz | 735 | but3 txt_button 140,115,12,120,4,0,0,but_text.3,show_scr_window ; показать снимок |
1373 | IgorA | 736 | but4 txt_button 80,205,15,163,5,0,0,but_text.4,apply_number ; применить номер |
737 | but5 txt_button 150,5,15,85,6,0,0,but_text.5,start_autoshoot ; начать автосъёмку |
||
738 | but6 txt_button 145,160,15,85,7,0,0,but_text.6,stop_autoshoot ; остановить автосъёмку |
||
307 | Lrz | 739 | but7 txt_button 40,205,10,150,8,0,0,but_text.7,show_set_rect_window ; задать область |
205 | heavyiron | 740 | buttons_end: |
1608 | mario79 | 741 | ;--------------------------------------------------------------------- |
205 | heavyiron | 742 | check_boxes: |
1098 | Lrz | 743 | ch1 check_box 5,105,5,11,cl_white,0,0,ch_text.1,(ch_text.2-ch_text.1),ch_flag_en ; свернуть окно |
744 | ch2 check_box 5,120,5,11,cl_white,0,0,ch_text.2,(ch_text.3-ch_text.2),ch_flag_en ; затем сделать активным |
||
745 | ch3 check_box 145,105,5,11,cl_white,0,0,ch_text.3,(ch_text.4-ch_text.3),ch_flag_en ; показать снимок |
||
746 | ch4 check_box 5,135,5,11,cl_white,0,0,ch_text.4,(ch_text.5-ch_text.4),ch_flag_en ; задержка |
||
1608 | mario79 | 747 | ch5 check_box 5,150,5,11,cl_white,0,0,ch_text.5,(ch_text.6-ch_text.5),ch_flag_en |
1098 | Lrz | 748 | ch6 check_box 5,165,5,11,cl_white,0,0,ch_text.6,(ch_text.7-ch_text.6),ch_flag_en |
749 | use_rect check_box 145,150,5,11,cl_white,0,0,ch_text.7,(ch_text.8-ch_text.7) ; исп. область |
||
205 | heavyiron | 750 | ; автонумерация |
751 | check_boxes_end: |
||
1608 | mario79 | 752 | ;--------------------------------------------------------------------- |
205 | heavyiron | 753 | if lang eq ru |
754 | text: |
||
307 | Lrz | 755 | .2 db 'Высота экрана:',0 |
756 | .1 db 'Ширина экрана:',0 |
||
757 | .3 db 'Введите полный путь к файлу:',0 |
||
758 | .4 db 'Бит на пиксель:',0 |
||
759 | .5 db 'Байт на строку:',0 |
||
760 | .6 db '100 = 1 секунда',0 |
||
205 | heavyiron | 761 | ;.7: db 'Введите имя файла:',0 |
762 | ;.8: db 'Вместо "*" в имени файла будет вставляться номер.',0 |
||
307 | Lrz | 763 | .9 db 'Номер текущего снимка:',0 |
764 | .10 db 'Количество знаков в номере:',0 |
||
205 | heavyiron | 765 | |
766 | but_text: |
||
307 | Lrz | 767 | .1 db 'Сделать снимок экрана',0 |
768 | .2 db 'Сохранить снимок экрана',0 |
||
769 | .3 db 'Показать снимок сейчас',0 |
||
770 | .4 db 'Применить',0 |
||
771 | .5 db 'Начать автосъемку',0 |
||
772 | .6 db 'Остановить автосъемку',0 |
||
773 | .7 db 'задать',0 |
||
205 | heavyiron | 774 | |
775 | ch_text: |
||
776 | .1 db 'Свернуть окно';,0 |
||
777 | .2 db 'Показать снимок';,0 |
||
778 | .3 db 'затем сделать активным';,0 |
||
307 | Lrz | 779 | .4 db 'Задержка:';,0 |
780 | .5 db 'Автосохранение';,0 |
||
781 | .6 db 'Автонумерация, начиная с';,0 |
||
782 | .7 db 'Область' |
||
783 | .8: |
||
205 | heavyiron | 784 | |
785 | no_shoot db 'Снимок не сделан',0 |
||
786 | shooting db 'Фотографирование...',0 |
||
787 | shooted_ok db 'Снимок сделан',0 |
||
788 | saving db 'Сохранение...',0 |
||
789 | saved_ok db 'Снимок сохранен',0 |
||
790 | delay_now db 'Задержка...',0 |
||
791 | bad_file_name db 'Имя файла введено неверно',0 |
||
792 | disk_filled db 'Диск заполнен',0 |
||
793 | bad_fat_table db 'Таблица FAT разрушена',0 |
||
794 | ac_den db 'Доступ запрещен',0 |
||
795 | device_er db 'Ошибка устройства',0 |
||
796 | not_shooted db 'Сделайте снимок !!!',0 |
||
797 | no_file_name db 'Введите имя файла !!!',0 |
||
307 | Lrz | 798 | invalid_rect db 'Недопустимые размеры области',0 |
310 | heavyiron | 799 | |
800 | else |
||
801 | text: |
||
802 | .2 db 'Screen width:',0 |
||
803 | .1 db 'Screen height:',0 |
||
804 | .3 db 'Enter full path to the file:',0 |
||
805 | .4 db 'Bits per pixel:',0 |
||
806 | .5 db 'Bytes per line:',0 |
||
807 | .6 db '100 = 1 second',0 |
||
808 | ;.7: db 'Enter name of file:',0 |
||
809 | ;.8: db 'Instead of "*" in filename the number will be included.',0 |
||
810 | .9 db 'Current photo number:',0 |
||
811 | .10 db 'Amount of digits in number:',0 |
||
812 | |||
813 | but_text: |
||
814 | .1 db 'Make screen photo',0 |
||
815 | .2 db 'Save screen photo',0 |
||
816 | .3 db 'Show photo now',0 |
||
817 | .4 db 'Apply',0 |
||
818 | .5 db 'Start autoshooting',0 |
||
819 | .6 db 'Stop autoshooting',0 |
||
820 | .7 db 'Set',0 |
||
821 | |||
822 | ch_text: |
||
823 | .1 db 'Minimize window';,0 |
||
824 | .2 db 'Show photo';,0 |
||
825 | .3 db 'then make active';,0 |
||
826 | .4 db 'Delay:';,0 |
||
827 | .5 db 'Autosave';,0 |
||
828 | .6 db 'Start numeration from';,0 |
||
829 | .7 db 'Area' |
||
830 | .8: |
||
831 | |||
832 | no_shoot db 'There is no photo',0 |
||
833 | shooting db 'Photographing...',0 |
||
834 | shooted_ok db 'Photo created',0 |
||
835 | saving db 'Saving...',0 |
||
836 | saved_ok db 'Photo saved',0 |
||
837 | delay_now db 'Delay...',0 |
||
838 | bad_file_name db 'File name is wrong',0 |
||
839 | disk_filled db 'Disk is full',0 |
||
840 | bad_fat_table db 'FAT table destroyed',0 |
||
841 | ac_den db 'Access denied',0 |
||
842 | device_er db 'Device error',0 |
||
1098 | Lrz | 843 | not_shooted db 'Make a photo !!!',0 |
310 | heavyiron | 844 | no_file_name db 'Enter file name !!!',0 |
845 | invalid_rect db 'Wrong area size',0 |
||
846 | |||
205 | heavyiron | 847 | end if |
848 | |||
1608 | mario79 | 849 | ;--------------------------------------------------------------------- |
850 | PathShow_data_1: |
||
851 | .type dd 0 ;+0 |
||
852 | .start_y dw 38 ;+4 |
||
853 | .start_x dw 6 ;+6 |
||
854 | .font_size_x dw 6 ;+8 ; 6 - for font 0, 8 - for font 1 |
||
855 | .area_size_x dw 300 ;+10 |
||
856 | .font_number dd 0 ;+12 ; 0 - monospace, 1 - variable |
||
857 | .background_flag dd 0 ;+16 |
||
858 | .font_color dd 0x0 ;+20 |
||
859 | .background_color dd 0x0 ;+24 |
||
860 | .text_pointer dd fname_buf ;+28 |
||
861 | .work_area_pointer dd text_work_area ;+32 |
||
862 | .temp_text_length dd 0 ;+36 |
||
863 | ;--------------------------------------------------------------------- |
||
864 | OpenDialog_data: |
||
865 | .type dd 1 ; Save |
||
866 | .procinfo dd procinfo ;+4 |
||
867 | .com_area_name dd communication_area_name ;+8 |
||
868 | .com_area dd 0 ;+12 |
||
869 | .opendir_pach dd temp_dir_pach ;+16 |
||
870 | .dir_default_pach dd communication_area_default_pach ;+20 |
||
871 | .start_path dd open_dialog_path ;+24 |
||
872 | .draw_window dd draw_window ;+28 |
||
873 | .status dd 0 ;+32 |
||
874 | .openfile_pach dd fname_buf ;+36 |
||
875 | .filename_area dd filename_area ;+40 |
||
876 | .filter_area dd Filter |
||
877 | .x: |
||
878 | .x_size dw 420 ;+48 ; Window X size |
||
879 | .x_start dw 10 ;+50 ; Window X position |
||
880 | .y: |
||
881 | .y_size dw 320 ;+52 ; Window y size |
||
882 | .y_start dw 10 ;+54 ; Window Y position |
||
883 | |||
884 | communication_area_name: |
||
885 | db 'FFFFFFFF_open_dialog',0 |
||
886 | open_dialog_path: |
||
887 | db '/sys/File Managers/opendial',0 |
||
888 | communication_area_default_pach: |
||
889 | db '/sys',0 |
||
890 | |||
891 | Filter: |
||
892 | dd Filter.end - Filter |
||
893 | .1: |
||
894 | db 'BMP',0 |
||
895 | .end: |
||
896 | db 0 |
||
897 | |||
898 | start_temp_file_name: db '1.bmp',0 |
||
899 | |||
900 | ;--------------------------------------------------------------------- |
||
205 | heavyiron | 901 | sign_n_input: |
1373 | IgorA | 902 | db '2',0 |
205 | heavyiron | 903 | |
1608 | mario79 | 904 | PrintScreen db 0 |
1610 | mario79 | 905 | autoshoot_flag db 0 |
1608 | mario79 | 906 | |
205 | heavyiron | 907 | app_ipc ipc_buffer 32 |
1098 | Lrz | 908 | align 4 |
205 | heavyiron | 909 | |
451 | heavyiron | 910 | mouse_flag: dd 0x0 |
1608 | mario79 | 911 | ;--------------------------------------------------------------------- |
912 | align 4 |
||
913 | |||
914 | ed_buffer: |
||
915 | .1: db '/sys/1.bmp',0 |
||
916 | ;rb 287 |
||
917 | .2: |
||
918 | db '100',0 |
||
919 | rb 6 |
||
920 | .3: |
||
921 | rb 10 |
||
922 | ;--------------------------------------------------------------------- |
||
923 | IM_END: |
||
924 | ;--------------------------------------------------------------------- |
||
451 | heavyiron | 925 | structure_of_potock: |
926 | rb 100 |
||
1608 | mario79 | 927 | ;--------------------------------------------------------------------- |
1098 | Lrz | 928 | align 4 |
929 | |||
1373 | IgorA | 930 | cur_number dd ? |
205 | heavyiron | 931 | |
1373 | IgorA | 932 | sign_n db ? |
205 | heavyiron | 933 | |
1373 | IgorA | 934 | slot_n dd ? |
205 | heavyiron | 935 | |
1373 | IgorA | 936 | flags dd ? |
205 | heavyiron | 937 | |
938 | scr_buf: |
||
1373 | IgorA | 939 | .ptr dd ? |
940 | .end_ptr dd ? |
||
205 | heavyiron | 941 | .size: |
942 | .height dw ? |
||
1373 | IgorA | 943 | .width dw ? |
205 | heavyiron | 944 | |
945 | fs_struc: |
||
946 | .funk_n dd ? |
||
1373 | IgorA | 947 | dd ? |
948 | dd ? |
||
949 | .bytes_to_write dd ? |
||
950 | .data_ptr dd ?,? |
||
205 | heavyiron | 951 | .fn_ptr dd ? |
952 | |||
953 | sf_buf: |
||
954 | .bmp_header dd ? |
||
955 | .bmp_area dd ? |
||
1373 | IgorA | 956 | .end dd ? |
205 | heavyiron | 957 | |
307 | Lrz | 958 | set_rect_window_pid dd ? |
959 | set_rect_window_slot dd ? |
||
1608 | mario79 | 960 | ;--------------------------------------------------------------------- |
1098 | Lrz | 961 | align 4 |
307 | Lrz | 962 | rect_input_buffer: |
963 | .left rb 6 |
||
964 | .top rb 6 |
||
1373 | IgorA | 965 | .width rb 6 |
307 | Lrz | 966 | .height rb 6 |
967 | |||
205 | heavyiron | 968 | cmdstr rb 257 |
1608 | mario79 | 969 | ;--------------------------------------------------------------------- |
1098 | Lrz | 970 | align 4 |
205 | heavyiron | 971 | |
972 | file_name: |
||
1373 | IgorA | 973 | rb 1058 |
205 | heavyiron | 974 | |
975 | scr screen_prop |
||
307 | Lrz | 976 | rect: |
977 | .left dw ? |
||
978 | .top dw ? |
||
979 | .height dw ? |
||
980 | .width dw ? |
||
981 | |||
205 | heavyiron | 982 | sc sys_color_table |
1373 | IgorA | 983 | app procinfo ; информация о главном окне |
307 | Lrz | 984 | active_app procinfo ; информация об активном окне |
985 | set_rect_window_procinfo procinfo ; информация об окне области |
||
1608 | mario79 | 986 | ;--------------------------------------------------------------------- |
987 | rb 512 ; стек потока фотканья |
||
988 | shoot_esp: |
||
989 | ;--------------------------------------------------------------------- |
||
990 | rb 512 ; стек окна области |
||
991 | set_rect_window_esp: |
||
992 | ;--------------------------------------------------------------------- |
||
1098 | Lrz | 993 | ; app_end ; конец программы |
1214 | Lrz | 994 | mouse_dd rd 1 |
1608 | mario79 | 995 | ;--------------------------------------------------------------------- |
1098 | Lrz | 996 | align 4 |
1608 | mario79 | 997 | cur_dir_path: |
998 | rb 4096 |
||
999 | ;--------------------------------------------------------------------- |
||
1000 | library_path: |
||
1001 | rb 4096 |
||
1002 | ;--------------------------------------------------------------------- |
||
1003 | temp_dir_pach: |
||
1004 | rb 4096 |
||
1005 | ;--------------------------------------------------------------------- |
||
1006 | text_work_area: |
||
1007 | rb 1024 |
||
1008 | ;--------------------------------------------------------------------- |
||
1009 | fname_buf: |
||
1010 | rb 4096 |
||
1011 | ;--------------------------------------------------------------------- |
||
1012 | procinfo: |
||
1013 | rb 1024 |
||
1014 | ;--------------------------------------------------------------------- |
||
1015 | filename_area: |
||
1016 | rb 256 |
||
1017 | ;--------------------------------------------------------------------- |
||
1018 | rb 1024 |
||
1098 | Lrz | 1019 | i_end_tread: |
1608 | mario79 | 1020 | ;--------------------------------------------------------------------- |
1021 | rb 1024 |
||
1022 | stacktop: |
||
1023 | ;--------------------------------------------------------------------- |
||
1098 | Lrz | 1024 | i_end:35,15>4,302> |