Все о печати

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем VitalyOne, 23 фев 2009.

  1. VitalyOne

    VitalyOne Гость

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

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

    Poseidon Гость

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

    Код (Text):
    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
     
  3. VitalyOne

    VitalyOne Гость

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

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

    Poseidon Гость

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

    Код (Text):
    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;
     
  5. VitalyOne

    VitalyOne Гость

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

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

    VitalyOne Гость

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

    Poseidon Гость

    Memo.Lines.Add('Первая строка');
    Memo.Lines.Add('Вторая строка');


    в
    Result := BitBlt(fBitmap.Canvas.Handle,
    0, 0, fBitmap.Width,
    fBitmap.Height, DC,
    0, 0, SRCCOPY);
     
Загрузка...

Поделиться этой страницей