Subversion Repositories Kolibri OS

Rev

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    ; конец программы