![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поясните строку в коде... [D7, XP]
Семенов. Н © (2008-09-25 15:54:00)Здравствуйте! Нашел на каком-то форуме код, делающий скриншот экрана средствами WinApi.
Код рабочий, все предельно ясно, кроме 1 строки в коде (см. коментарий).
program ScreenShot;
uses
Windows;
procedure ApiScrCapture(const FileName: String);
type
TScr = array [0..1] of Byte;
PScr = ^TScr;
var
hBmp: hBitmap;
DeskDC: hDC;
DC: hDC;
BFH: BITMAPFILEHEADER;
BIH: tagBITMAPINFO;
ScrX, ScrY: Integer;
F: File;
ScrSize: Cardinal;
Bits: PScr;
begin
SCRX:= GetSystemMetrics(SM_CXSCREEN);
SCRY:= GetSystemMetrics(SM_CYSCREEN);
ScrSize:= ScrX * ScrY * 3; // ----------- Для чего умножение на 3???
GetMem(Bits, ScrSize);
DeskDC:= GetDC(0);
hBmp:= CreateCompatibleBitmap(DeskDC, ScrX, ScrY);
DC:= CreateCompatibleDC(DeskDC);
SelectObject(DC, hbmp);
BitBlt(DC, 0, 0, SCRX, SCRY, DeskDC, 0, 0, SRCCOPY);
with BFH do
begin
BI_RGB
bfType:= $4D42;
bfSize:= SCRX * SCRY * 3 + SizeOf(BFH) + SizeOf(BIH);
bfReserved1 := 0;
bfReserved2 := 0;
bfOffBits:= SizeOf(BFH) + SizeOf(BIH);
end;
with BIH.bmiHeader do
begin
biSize:= sizeof(BIH);
biWidth:= SCRX;
biHeight:= SCRY;
biPlanes:= 1;
biBitCount:= 24;
biCompression:= BI_RGB;
biSizeImage:= ScrSize;
biClrImportant:= 0;
end;
GetDiBits(DC, hbmp, 0, SCRY, Bits, BIH, DIB_RGB_COLORS);
DeleteObject(hbmp);
AssignFile(F, FileName);
Rewrite(F, 1);
Blockwrite(F, BFH, SizeOf(BFH));
Blockwrite(F, BIH, SizeOf(BIH));
Blockwrite(F, bits^, ScrSize);
CloseFile(F);
FreeMem(Bits);
end;
begin
ApiScrCapture('ScreenShot.bmp');
end.
Насчет "нет проверок e.t.c" - код не мой, я бы такого не допустил :)
Семенов. Н (2008-09-25 16:22:00) [1]Спасибо!
Vlad Oshin (2008-09-25 16:01:00) [2]точно..
Palladin (2008-09-25 15:58:00) [3]цвет 24бита - 3 байта, размер получается x*y*3
Vlad Oshin (2008-09-25 15:56:00) [4]RGB