Subversion Repositories Kolibri OS

Rev

Rev 205 | Rev 310 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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