Rev 307 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
205 | heavyiron | 1 | ; Автор программы Евтихов Максим (Maxxxx32) |
2 | ; Дата последнего изменения: 20.07.06 18:05 |
||
3 | macro draw_status text_ptr |
||
4 | { |
||
5 | mov [status.text],dword text_ptr |
||
6 | call send_draw_status |
||
7 | } |
||
8 | |||
9 | |||
10 | title equ 'Maxxxx32 Screenshooter v 0.78' ; Заголовок окна |
||
11 | include 'lang.inc' |
||
12 | include 'macros.inc' ; вставляем макросы |
||
13 | meos_header cmdstr ; вставляем заголовок программы |
||
14 | include 'scrwin.inc' ; вставляем код окна прдпросмотра |
||
15 | include 'scrsavef.inc'; вставляем процедуру сохранения файла |
||
16 | use_edit_box ; \ |
||
17 | use_txt_button ; | |
||
18 | use_label ; | |
||
19 | use_gp ; |-- GUI компоненты и некоторые процедуры |
||
20 | use_check_box ; | |
||
21 | use_text_work ; / |
||
22 | ;--- начало программы --- |
||
23 | app_start |
||
24 | ; устанавливаем ipc буффер |
||
25 | push 60 |
||
26 | pop eax |
||
27 | ;mov ebx,1 |
||
28 | xor ebx,ebx |
||
29 | inc ebx |
||
30 | mov ecx,app_ipc |
||
31 | mov edx,32 |
||
32 | int 0x40 |
||
33 | |||
34 | push 66 ; устанавливаем глобальную горячую клавишу |
||
35 | pop eax |
||
36 | push eax |
||
37 | mov ebx,4 |
||
38 | mov cl,55 ; 55 - PrintScrn |
||
39 | xor edx,edx |
||
40 | int 0x40 |
||
41 | |||
42 | mov ebx,app |
||
43 | call get_slot_n |
||
44 | mov [slot_n],ecx |
||
45 | |||
46 | ; устанавливаем маску событий |
||
47 | set_events_mask (evm_redraw+evm_key+evm_button+evm_mouse+evm_ipc) |
||
48 | |||
49 | ; сюда прыгаем при каждой перерисовке |
||
50 | red: |
||
51 | get_procinfo app ; получаем информацию о процессе |
||
52 | get_sys_colors sc ; получаем системные цвета |
||
53 | |||
54 | ; устанавливаем системные цвета у GUI компонентов |
||
55 | txt_but_set_sys_color buttons,buttons_end,sc ; \ |
||
56 | labels_set_sys_color labels,labels_end,sc ; | |
||
57 | check_boxes_set_sys_color check_boxes,check_boxes_end,sc ; | |
||
58 | edit_boxes_set_sys_color editboxes,editboxes_end,sc ; / |
||
59 | |||
60 | get_screen_prop scr ; получаем информацию об экране |
||
61 | call draw_window ; перерисовываем окно |
||
62 | still: |
||
63 | wait_event red,key,button,mouse,ipc,still ; ждем событий |
||
64 | |||
65 | key: |
||
66 | get_key |
||
67 | cmp al,2 |
||
68 | jne @f |
||
69 | cmp ah,55 |
||
70 | jne @f |
||
71 | call shoot |
||
72 | jmp still |
||
73 | @@: |
||
74 | key_edit_boxes editboxes,editboxes_end |
||
75 | jmp still |
||
76 | button: |
||
77 | get_pressed_button |
||
78 | cmp ah,1 |
||
79 | je p_close |
||
80 | txt_but_ev buttons,buttons_end |
||
81 | jmp still |
||
82 | mouse: |
||
83 | get_active_window |
||
84 | cmp eax,[slot_n] |
||
85 | jne still |
||
86 | mouse_check_boxes check_boxes,check_boxes_end |
||
87 | mouse_edit_boxes editboxes,editboxes_end |
||
88 | jmp still |
||
89 | ipc: |
||
90 | cmp word [app_ipc+8],2 |
||
91 | jne @f |
||
92 | min_window |
||
93 | jmp .clear_ipc |
||
94 | @@: |
||
95 | |||
96 | call draw_number |
||
97 | call dr_st |
||
98 | |||
99 | .clear_ipc: |
||
100 | cld |
||
101 | xor eax,eax |
||
102 | movr ecx,32 |
||
103 | mov edi,app_ipc |
||
104 | rep stosb |
||
105 | jmp still |
||
106 | |||
107 | p_close: |
||
108 | btr dword [flags],1 |
||
109 | close: |
||
110 | app_close |
||
111 | |||
112 | ;-------------------------------------------------------------------- |
||
113 | ;--- прооцедура перерисовки главного окна --------------------------- |
||
114 | ;-------------------------------------------------------------------- |
||
115 | draw_window: |
||
116 | start_draw_window ; начало перерисовки |
||
117 | xor eax,eax ; определяем окно |
||
118 | mov ebx,100*65536+320 |
||
119 | mov ecx,100*65536+240 |
||
120 | mov edx,[sc.work] |
||
121 | add edx,0x03000000 |
||
122 | xor esi,esi |
||
123 | xor edi,edi |
||
124 | int 0x40 |
||
125 | |||
126 | get_scin_height ; получаем высоту заголовка окна и расчитываем |
||
127 | sub ax,4 ; положение текста заголовка |
||
128 | shr ax,1 |
||
129 | mov bx,10 |
||
130 | shl ebx,16 |
||
131 | mov bx,ax |
||
132 | |||
133 | mov eax,4 ; рисуем текст загооловка |
||
134 | mov ecx,[sc.grab_text] |
||
135 | bts ecx,28 |
||
136 | mov edx,grab_text |
||
137 | mov esi,grab_text_end-grab_text |
||
138 | int 0x40 |
||
139 | |||
140 | movr eax,47 ; выводим числа в окно |
||
141 | mov bx,4 |
||
142 | shl ebx,16 |
||
143 | movsx ecx,word [scr.width] ; ширина экрана |
||
144 | mov dx,95 |
||
145 | shl edx,16 |
||
146 | mov dx,[label1.top] |
||
147 | push dx |
||
148 | mov esi,[sc.work_text] |
||
149 | int 0x40 |
||
150 | movsx ecx,word [scr.height] ; высота экрана |
||
151 | mov dx,[label2.top] |
||
152 | int 0x40 |
||
153 | mov bx,2 |
||
154 | shl ebx,16 |
||
155 | movsx ecx,word [scr.bitspp] ; бит на пиксель |
||
156 | mov dx,240 |
||
157 | shl edx,16 |
||
158 | pop dx |
||
159 | int 0x40 |
||
160 | mov bx,6 |
||
161 | shl ebx,16 |
||
162 | mov ecx,[scr.bytesps] ; байт на строку |
||
163 | mov dx,[label2.top] |
||
164 | int 0x40 |
||
165 | |||
166 | call draw_number ; прорисовываем номер снимка |
||
167 | call dr_st |
||
168 | |||
169 | draw_labels labels,labels_end ; метки |
||
170 | draw_edit_boxes editboxes,editboxes_end ; edit_box |
||
171 | draw_txt_buttons buttons,buttons_end ; кнопки |
||
172 | draw_check_boxes check_boxes,check_boxes_end ; флажки |
||
173 | stop_draw_window ; конец перерисовки |
||
174 | ret |
||
175 | |||
176 | shoot: |
||
177 | bt dword [ch4.flags],1 ; включена ли задержка ? |
||
178 | jnc @f |
||
179 | draw_status delay_now |
||
180 | mov edi,ed_buffer.2 |
||
181 | call zstr_to_int |
||
182 | mov ebx,eax |
||
183 | delay |
||
184 | @@: |
||
185 | call get_mem_for_shoot; получаем память для снимка |
||
186 | |||
187 | |||
188 | bts dword [flags],0 ; нулевой флаг - снимок есть в памяти |
||
189 | |||
190 | ; делаем снимок |
||
191 | draw_status shooting |
||
192 | mov esi,scr |
||
193 | mov edi,[scr_buf.ptr] |
||
194 | call copy_screen_to_image |
||
195 | |||
196 | push dword [scr] |
||
197 | pop dword [scr_buf.size] |
||
198 | |||
199 | bt dword [ch5.flags],1 ; включено ли автосохранение ? |
||
200 | jnc @f |
||
201 | call save_file |
||
202 | @@: |
||
203 | draw_status shooted_ok |
||
204 | |||
205 | bt dword [flags],1 |
||
206 | jnc @f |
||
207 | ret |
||
208 | @@: |
||
209 | |||
210 | bt dword [ch2.flags],1 ; показать окно предпросмотра ? |
||
211 | jnc @f |
||
212 | call show_scr_window |
||
213 | @@: |
||
214 | bt word [ch3.flags],1 ; восстановить окно ? |
||
215 | jnc @f |
||
216 | |||
217 | delay 100 |
||
218 | mov ecx,[slot_n] |
||
219 | activ_window |
||
220 | @@: |
||
221 | ret |
||
222 | |||
223 | get_mem_for_shoot: |
||
224 | mov [scr_buf.ptr],dword __app_end |
||
225 | movsx ecx, word [scr.width] |
||
226 | movsx ebx, word [scr.height] |
||
227 | imul ecx,ebx |
||
228 | lea ecx,[ecx*3] |
||
229 | add ecx,__app_end |
||
230 | mov [scr_buf.end_ptr],ecx |
||
231 | xor ebx,ebx |
||
232 | inc ebx |
||
233 | mov eax,64 |
||
234 | int 0x40 |
||
235 | ret |
||
236 | |||
237 | ;--- содать окно проедпросмотра --- |
||
238 | show_scr_window: |
||
239 | pusha |
||
240 | bt dword [flags],0 |
||
241 | jnc @f |
||
242 | mov eax,51 |
||
243 | xor ebx,ebx |
||
244 | inc ebx |
||
245 | movr ecx,scr_window |
||
246 | mov edx,__app_end-1000 |
||
247 | int 0x40 |
||
248 | @@: |
||
249 | popa |
||
250 | ret |
||
251 | |||
252 | ;--- прочитать и нарисовать текущий номер --- |
||
253 | apply_number: |
||
254 | mov edi,ed_buffer.3 |
||
255 | call zstr_to_int |
||
256 | mov [cur_number],eax |
||
257 | call draw_number |
||
258 | ret |
||
259 | |||
260 | ;--- процедура прорисовки текущего номера --- |
||
261 | draw_number: |
||
262 | mov edi,sign_n_input |
||
263 | call zstr_to_int |
||
264 | mov [sign_n],al |
||
265 | movr eax,13 |
||
266 | mov ebx,140*65536+96 |
||
267 | mov cx,[label9.top] |
||
268 | shl ecx,16 |
||
269 | mov cx,10 |
||
270 | mov edx,[sc.work] |
||
271 | int 0x40 |
||
272 | movr eax,47 |
||
273 | movsx bx,byte [sign_n] |
||
274 | shl ebx,16 |
||
275 | mov ecx,[cur_number] |
||
276 | mov dx,140 |
||
277 | shl edx,16 |
||
278 | mov dx,[label9.top] |
||
279 | mov esi,[sc.work_text] |
||
280 | int 0x40 |
||
281 | ret |
||
282 | |||
283 | ;--- процедура, запускающая поток автосъемки --- |
||
284 | start_autoshoot: |
||
285 | bts dword [flags],1 |
||
286 | jc @f |
||
287 | movr eax,51 |
||
288 | ;mov ebx,1 |
||
289 | xor ebx,ebx |
||
290 | inc ebx |
||
291 | mov ecx,autoshoot |
||
292 | mov edx,__app_end-512 |
||
293 | int 0x40 |
||
294 | @@: |
||
295 | ret |
||
296 | |||
297 | ;--- останавливает этот поток --- |
||
298 | stop_autoshoot: |
||
299 | btr dword [flags],1 |
||
300 | ret |
||
301 | |||
302 | ;--- цикл потока автосъемки --- |
||
303 | autoshoot: |
||
304 | mov ecx,[slot_n] |
||
305 | activ_window |
||
306 | .next: |
||
307 | bt dword [flags],1 |
||
308 | jnc close |
||
309 | movr eax,60 |
||
310 | movr ebx,2 |
||
311 | mov ecx,[app.pid] |
||
312 | mov edx,messages.draw_number |
||
313 | mov esi,2 |
||
314 | int 0x40 |
||
315 | call shoot |
||
316 | jmp autoshoot.next |
||
317 | |||
318 | ;--- процедура прорисовки строки состояния --- |
||
319 | ; (должна вызываться потоком главного окна) |
||
320 | dr_st: |
||
321 | movr eax,38 ; отрезок |
||
322 | mov ebx,5*65536+315 |
||
323 | mov ecx,222*65536+222 |
||
324 | mov edx,[sc.work_graph] |
||
325 | int 0x40 |
||
326 | |||
327 | movr eax,13 ; полоска |
||
328 | mov bx,310 |
||
329 | mov ecx,223*65536+12 |
||
330 | mov edx,[sc.work] |
||
331 | int 0x40 |
||
332 | |||
333 | mov edi,status |
||
334 | call draw_label |
||
335 | ret |
||
336 | |||
337 | ;--- процедура получения номера слота потока --- |
||
338 | ; вход ebx - буффер 1024 байт |
||
339 | ; выход ecx - номер слота |
||
340 | get_slot_n: |
||
341 | movr eax,9 |
||
342 | xor ecx,ecx |
||
343 | dec ecx |
||
344 | int 0x40 |
||
345 | |||
346 | mov edx,[app.pid] |
||
347 | xor ecx,ecx |
||
348 | @@: |
||
349 | movr eax,9 |
||
350 | inc ecx |
||
351 | int 0x40 |
||
352 | cmp [app.pid],edx |
||
353 | je @f |
||
354 | jmp @b |
||
355 | @@: |
||
356 | ret |
||
357 | |||
358 | one_shoot: |
||
359 | mov ecx,one_shoot_thread |
||
360 | mov edx,shoot_esp |
||
361 | jmp @f |
||
362 | save_shoot: |
||
363 | mov ecx,save_shoot_thread |
||
364 | mov edx,shoot_esp |
||
365 | @@: |
||
366 | bts dword [flags],2 |
||
367 | jc .running |
||
368 | bt dword [flags],1 |
||
369 | jc .running |
||
370 | |||
371 | movr eax,51 |
||
372 | ;mov ebx,1 |
||
373 | xor ebx,ebx |
||
374 | inc ebx |
||
375 | int 0x40 |
||
376 | .running: |
||
377 | ret |
||
378 | |||
379 | one_shoot_thread: |
||
380 | mov ecx,[slot_n] |
||
381 | activ_window |
||
382 | bt dword [ch1.flags],1 ; минимизировать окно ? |
||
383 | jnc @f |
||
384 | movr eax,60 |
||
385 | movr ebx,2 |
||
386 | mov ecx,[app.pid] |
||
387 | mov edx,messages.min_window |
||
388 | mov esi,2 |
||
389 | int 0x40 |
||
390 | @@: |
||
391 | call shoot |
||
392 | btr dword [flags],2 |
||
393 | jmp close |
||
394 | |||
395 | send_draw_status: |
||
396 | movr eax,60 |
||
397 | movr ebx,2 |
||
398 | mov ecx,[app.pid] |
||
399 | mov edx,messages.draw_status |
||
400 | mov esi,2 |
||
401 | int 0x40 |
||
402 | ret |
||
403 | |||
404 | save_shoot_thread: |
||
405 | mov ecx,[slot_n] |
||
406 | activ_window |
||
407 | call save_file |
||
408 | btr dword [flags],2 |
||
409 | jmp close |
||
410 | |||
411 | ;==================================================================== |
||
412 | ;=== данные программы =============================================== |
||
413 | ;==================================================================== |
||
414 | messages: |
||
415 | .draw_number dw 0 |
||
416 | .draw_status dw 1 |
||
417 | .min_window dw 2 |
||
418 | |||
419 | |||
420 | grab_text: |
||
421 | db title |
||
422 | grab_text_end: |
||
423 | labels: |
||
424 | label1 label 10,30,0,text.1 ; высота экрана |
||
425 | label2 label 10,40,0,text.2 ; ширина экрана |
||
426 | label3 label 10,50,0,text.3 ; введите имя файла |
||
427 | label4 label 150,30,0,text.4 ; бит на пиксель |
||
428 | label5 label 150,40,0,text.5 ; байт на строку |
||
429 | label6 label 120,163,0,text.6 |
||
430 | ;label7 label 10,190,0,text.7 |
||
431 | ;label8 label 10,225,0,text.8 |
||
432 | label9 label 10,78,0,text.9 ; текущий |
||
433 | label10 label 10,210,0,text.10 |
||
434 | status label 10,226,0,no_shoot |
||
435 | labels_end: |
||
436 | |||
437 | editboxes: |
||
438 | edit1 edit_box 300,10,60,cl_white,0,0,0,1024,ed_buffer.1,ed_focus |
||
439 | edit2 edit_box 35,80,159,cl_white,0,0,0,9,ed_buffer.2,ed_figure_only |
||
440 | edit3 edit_box 35,170,189,cl_white,0,0,0,9,ed_buffer.3,ed_figure_only |
||
441 | edit4 edit_box 16,170,206,cl_white,0,0,0,1,sign_n_input,ed_figure_only,1 |
||
442 | editboxes_end: |
||
443 | |||
444 | buttons: |
||
445 | but1 txt_button 150,10,15,90,2,0,0,but_text.1,one_shoot |
||
446 | but2 txt_button 145,165,15,90,3,0,0,but_text.2,save_shoot |
||
447 | but3 txt_button 140,120,12,145,4,0,0,but_text.3,show_scr_window |
||
448 | but4 txt_button 80,210,15,188,5,0,0,but_text.4,apply_number |
||
449 | but5 txt_button 150,10,15,110,6,0,0,but_text.5,start_autoshoot |
||
450 | but6 txt_button 145,165,15,110,7,0,0,but_text.6,stop_autoshoot |
||
451 | buttons_end: |
||
452 | |||
453 | check_boxes: |
||
454 | ch1 check_box 10,130,cl_white,0,0,ch_text.1,(ch_text.2-ch_text.1) |
||
455 | ch2 check_box 10,145,cl_white,0,0,ch_text.2,(ch_text.3-ch_text.2) |
||
456 | ch3 check_box 150,130,cl_white,0,0,ch_text.3,(ch_text.4-ch_text.3) |
||
457 | ch4 check_box 10,160,cl_white,0,0,ch_text.4,(ch_text.5-ch_text.4) |
||
458 | ch5 check_box 10,175,cl_white,0,0,ch_text.5,(ch_text.6-ch_text.5) |
||
459 | ch6 check_box 10,190,cl_white,0,0,ch_text.6,(ch_text.7-ch_text.6) |
||
460 | ; автонумерация |
||
461 | check_boxes_end: |
||
462 | |||
463 | if lang eq ru |
||
464 | text: |
||
465 | .2: db 'Высота экрана:',0 |
||
466 | .1: db 'Ширина экрана:',0 |
||
467 | .3: db 'Введите полный путь к файлу:',0 |
||
468 | .4: db 'Бит на пиксель:',0 |
||
469 | .5: db 'Байт на строку:',0 |
||
470 | .6: db '100 = 1 секунда',0 |
||
471 | ;.7: db 'Введите имя файла:',0 |
||
472 | ;.8: db 'Вместо "*" в имени файла будет вставляться номер.',0 |
||
473 | .9: db 'Текущий номер снимка:',0 |
||
474 | .10: db 'Количество знаков в номере:',0 |
||
475 | |||
476 | but_text: |
||
477 | .1: db 'Сделать снимок экрана',0 |
||
478 | .2: db 'Сохранить снимок экрана',0 |
||
479 | .3: db 'Показать снимок сейчас',0 |
||
480 | .4: db 'Применить',0 |
||
481 | .5: db 'Начать автосъемку',0 |
||
482 | .6: db 'Остановить автосъемку',0 |
||
483 | |||
484 | ch_text: |
||
485 | .1 db 'Свернуть окно';,0 |
||
486 | .2 db 'Показать снимок';,0 |
||
487 | .3 db 'затем сделать активным';,0 |
||
488 | .4: db 'Задержка:';,0 |
||
489 | .5: db 'Автосохранение';,0 |
||
490 | .6: db 'Автонумерация, начиная с';,0 |
||
491 | .7: |
||
492 | |||
493 | no_shoot db 'Снимок не сделан',0 |
||
494 | shooting db 'Фотографирование...',0 |
||
495 | shooted_ok db 'Снимок сделан',0 |
||
496 | saving db 'Сохранение...',0 |
||
497 | saved_ok db 'Снимок сохранен',0 |
||
498 | delay_now db 'Задержка...',0 |
||
499 | bad_file_name db 'Имя файла введено неверно',0 |
||
500 | disk_filled db 'Диск заполнен',0 |
||
501 | bad_fat_table db 'Таблица FAT разрушена',0 |
||
502 | ac_den db 'Доступ запрещен',0 |
||
503 | device_er db 'Ошибка устройства',0 |
||
504 | not_shooted db 'Сделайте снимок !!!',0 |
||
505 | no_file_name db 'Введите имя файла !!!',0 |
||
506 | end if |
||
507 | |||
508 | sign_n_input: |
||
509 | db '2',0 |
||
510 | |||
511 | app_ipc ipc_buffer 32 |
||
512 | |||
513 | cur_number dd ? |
||
514 | |||
515 | sign_n db ? |
||
516 | |||
517 | slot_n dd ? |
||
518 | |||
519 | flags dd ? |
||
520 | |||
521 | scr_buf: |
||
522 | .ptr dd ? |
||
523 | .end_ptr dd ? |
||
524 | .size: |
||
525 | .height dw ? |
||
526 | .width dw ? |
||
527 | |||
528 | fs_struc: |
||
529 | .funk_n dd ? |
||
530 | dd ? |
||
531 | dd ? |
||
532 | .bytes_to_write dd ? |
||
533 | .data_ptr dd ?,? |
||
534 | .fn_ptr dd ? |
||
535 | |||
536 | sf_buf: |
||
537 | .bmp_header dd ? |
||
538 | .bmp_area dd ? |
||
539 | .end dd ? |
||
540 | |||
541 | cmdstr rb 257 |
||
542 | |||
543 | ed_buffer: |
||
544 | .1: rb 1025 |
||
545 | .2: rb 10 |
||
546 | .3: rb 10 |
||
547 | |||
548 | file_name: |
||
549 | rb 1058 |
||
550 | |||
551 | scr screen_prop |
||
552 | sc sys_color_table |
||
553 | app procinfo |
||
554 | shoot_esp rb 512 |
||
555 | app_end ; конец программы |