• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Все о печати

  • Автор темы VitalyOne
  • Дата начала
V

VitalyOne

Здравствуйте!
Вкратце: пишу программу, необходимо прорисовывать канвасом на понели (или еще где-нить, если подскажете) простейшие фигуры (линии, прямоугольники), которые впоследствие надо будет сохранять в JPEG, и помимо того, выводить на бумагу в определенном месте листа.
Так же необходимо печатать в файл и на бумагу некоторые кусочки формы (лэйбелы и имейджи в большей степени), а так же и всю форму соответственно.

Может кто подскажет, как это реализовать? Буду всем за это благодарен, если начнем попунктно, с печати объектов канваса ;)
 
P

Poseidon

Почитай про TPrinter. Там есть свой Canvas, на который можно выводить все, что хочешь напечатать (или туда можно скопировать с канвы той же панели)

Код:
uses printers;

Procedure TForm1.Button1Click(Sender: TObject);
Begin
With Printer do 
Begin
BeginDoc; { Начало печати }
Canvas.Font:=label1.font; { Задали шрифт }
Canvas.TextOut(100,100,'Это тест принтера !!!'); { Печатаем текст }
EndDoc; { Конец печати }
end;
end;

Кусочки формы и т.д. тоже можно передать в Canvas с помощью CopyRect
 
V

VitalyOne

Poseidon
благодарствую!

Но, тут у меня есть еще пара вопросов. Дело в том, что прорисовывать и печатать на бумагу - это одно дело, а вот как можно прорисовать тот же канвас с панели в ДЖЕПЕЖКУ? Я предпологаю, что возможно как - то "сфоткать" определенную часть формы в буфер (ну так как фоткается экран по нажатию принт-скриин). Это реально? или может есть способы проще?
 
P

Poseidon

а вот как можно прорисовать тот же канвас с панели в ДЖЕПЕЖКУ?
Тут все просто. Создаешь TBitmap. У него есть свой Canvas. В этот Canvas копируешь конву формы (или что там тебе надо) и приобразуешь TBitMap в jpeg. Вот примерный набросок:

Код:
uses jpeg;

// В качестве параметров передаются:
// AHandle - хэндл окна, скриншот которого мы хочем получить
// CompressPercent - процент сжатия картинки
// AImage - картинка, в которую будет помещено изображение
// в случае успешного скриншота функция вернет True
{©Drkb v.3(2007): www.drkb.ru}

function GetScreenShot(const AHandle: THandle;
const CompressPercent: Byte;
var AImage: TJPEGImage): Boolean;
var
fBitmap: TBitmap;
DC: HDC;
Rect: TRect;
begin
Result := False;
if AImage = nil then Exit;
DC := GetDC(AHandle);
if DC <> 0 then
try
fBitmap := TBitmap.Create;
try
if not GetClientRect(AHandle, Rect) then Exit;
fBitmap.Width := Rect.Right - Rect.Left;
fBitmap.Height := Rect.Bottom - Rect.Top;
fBitmap.PixelFormat := pf32bit;
Result := BitBlt(fBitmap.Canvas.Handle,
0, 0, fBitmap.Width,
fBitmap.Height, DC,
0, 0, SRCCOPY);
if not Result then Exit;
AImage.Assign(fBitmap);
AImage.CompressionQuality := CompressPercent;
finally
fBitmap.Free;
end;
finally
ReleaseDC(AHandle, DC);
end;
end;

// Пример использования...
procedure TForm1.Button1Click(Sender: TObject);
var
Image: TJPEGImage;
begin
// Скриншот рабочего стола
Image := TJPEGImage.Create;
try
if GetScreenShot(GetDesktopWindow, 150, Image) then
Image.SaveToFile('C:/Screen.jpg');
finally
Image.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
// Скриншот нашей формы
var
Image :TJPEGImage;
begin
Image := TJPEGImage.Create;
try
if GetScreenShot(Handle, 150, Image) then
Image.SaveToFile('C:/Screen.jpg');
finally
Image.Free;
end;
end;
 
V

VitalyOne

Poseidon
Большое спасибо! Очень помогли! ;)

Вот такой у меня вопрос глуповатый наверное, да и не по теме, но все же, как можно програмно в мемо добавить переход на новую строку?
(ну, через например: memo.lines:=(memo.lines+???переход???+'kakoi-to-tekct')
 
V

VitalyOne

Poseidon
А в функции GetScreenShot в какой строке определяются параметры левого верхнего и правого нихнего краев создания изображения?
просто у меня в проге нужно печатать либо только панельку+пару пикс, либо всю форму...
 
P

Poseidon

ак можно програмно в мемо добавить переход на новую строку?
Memo.Lines.Add('Первая строка');
Memo.Lines.Add('Вторая строка');


А в функции GetScreenShot в какой строке определяются параметры левого верхнего и правого нихнего краев создания изображения?
в
Result := BitBlt(fBitmap.Canvas.Handle,
0, 0, fBitmap.Width,
fBitmap.Height, DC,
0, 0, SRCCOPY);
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!