Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.04.2014, 11:54
aqula aqula вне форума
Новичок
 
Регистрация: 19.10.2012
Сообщения: 95
Репутация: 10
По умолчанию Надо непечатать форму в пдф

Нашел в нете модуль который сохраняет bmp в pdf
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 Bm:TBitmap;
 hWinDC:THandle;
begin
  Bm:=TBitmap.Create;
  Bm.Width:=Self.Width;
  Bm.Height:=Self.Height;
  hWinDC:=GetWindowDC(Self.Handle);
  BitBlt(Bm.Canvas.Handle,0,0,Bm.Width, Bm.Height, hWinDC,0,0,SRCCOPY);
  ReleaseDC(Self.Handle,hWinDC);
  if SaveDialog1.Execute then
    bmp2pdf.BMPtoPDF(Bm,SaveDialog1.FileName);
  Bm.Free;
Но в маленьком ноуте форма вся не влезает. появляется скроллинг. И печатает урезанную форму. Как сделать чтоб вся форма влезала в файл (без скроллбара)?
Ответить с цитированием
  #2  
Старый 25.04.2014, 12:45
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

а если вместо этого
Код:
hWinDC:=GetWindowDC(Self.Handle);   
BitBlt(Bm.Canvas.Handle,0,0,Bm.Width, Bm.Height, hWinDC,0,0,SRCCOPY); 
использовать
Код:
Self.PaintTo(Bm.Canvas,0,0);
Ответить с цитированием
  #3  
Старый 25.04.2014, 13:24
aqula aqula вне форума
Новичок
 
Регистрация: 19.10.2012
Сообщения: 95
Репутация: 10
По умолчанию

Скроллы не печатаются это плюс, но саму форму как и прежде не расстягивает на полную... как видит так и печатает.
Ответить с цитированием
  #4  
Старый 25.04.2014, 14:25
aqula aqula вне форума
Новичок
 
Регистрация: 19.10.2012
Сообщения: 95
Репутация: 10
По умолчанию

проблему решил
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 Bm:TBitmap;
 hWinDC:THandle;
 w,h:Integer;
begin
  w:=Self.Width;
  h:=Self.Height;
  //Self.Left:=0;
  //Self.Top:=0;
  Self.Width:=1285;
  Self.Height:=935;
  Bm:=TBitmap.Create;
  Bm.Width:=Self.Width-5;
  Bm.Height:=Self.Height-30;

//  hWinDC:=GetWindowDC(Self.Handle);
//  hWinDC:=GetDC(Self.Handle);
//  BitBlt(Bm.Canvas.Handle,0,0,Bm.Width, Bm.Height, hWinDC,0,0,SRCCOPY);
  Self.PaintTo(Bm.Canvas,0,0);
  ReleaseDC(Self.Handle,hWinDC);
  Self.Width:=w;
  Self.Height:=h;
  if SaveDialog1.Execute then
    bmp2pdf.BMPtoPDF(Bm,SaveDialog1.FileName);
  Bm.Free;
Спасибо Васе.
Ответить с цитированием
  #5  
Старый 16.06.2014, 21:44
aqula aqula вне форума
Новичок
 
Регистрация: 19.10.2012
Сообщения: 95
Репутация: 10
По умолчанию

Тему продолжу. Помогите пожалуйста.
Теперь мне нужно этот битмап вывести на принтер. Картинка создается но на принтер не вылазит - печатает пустую. Вот код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bm:TBitmap;
  X1,X2,Y1,Y2,w,h:Integer;
  PrintDlg:TPrintDialog;
  hWinDC:THandle;
  Image1: TImage;
begin

  Image1:=TImage.Create(self);

  w:=Self.Width;
  h:=Self.Height;
  Self.Width:=1285;   // чтоб все элементы поместились на страницу независимо от разрешения экрана.
  Self.Height:=935;

  Bm:=TBitmap.Create;
  Bm.Width:=Self.Width-5;
  Bm.Height:=Self.Height-30;

  //hWinDC:=GetWindowDC(Self.Handle);
  hWinDC:=GetDC(Self.Handle);
  //BitBlt(Bm.Canvas.Handle,0,0,Bm.Width, Bm.Height, hWinDC,0,0,SRCCOPY);
  Self.PaintTo(Bm.Canvas,0,0);
  ReleaseDC(Self.Handle,hWinDC);
  Self.Width:=w;
  Self.Height:=h;


   // Clipboard.Assign(Bm);
    Image1.Picture.Bitmap.Assign(Bm);
    Clipboard.Assign(Image1.Picture);  /// картинка в буфере есть!!!
	// значит до этого все ОК, но потом....

// Создаю и отображаю на экране стандартное окно печати
  PrintDlg:=TPrintDialog.Create(Self);

  if PrintDlg.Execute then
  begin
  // Начинаю новый документ
  Printer.Orientation:=poLandScape; // делаю книжную ориентацию
  Printer.BeginDoc;
  Printer.Canvas.Refresh;

  //Рассчитываю размеры изображения
  X1:=0;
  Y1:=0;
  X2:=round(Printer.PageWidth);
  Y2:=round(Printer.PageHeight);
 
 //Вывод изображения на печать

  // сначала пробовал так
  with  Image1.Picture do
  	 Printer.Canvas.CopyRect(Rect(X1,Y1,X2,Y2),Bitmap.Canvas,Rect(0,0,Width,Height));
  // потом так c bitmap
  //Printer.Canvas.CopyRect(Rect(X1,Y1,X2,Y2),Bm.Canvas,Rect(0,0,Bm.Width,Bm.Height));
  // думал может надо с StretchDraw
  //Printer.Canvas.StretchDraw(Rect(X1,Y1,X2,Y2), Image1.Picture.Graphic);
  // но все равно печатает пустую страницу

  Printer.EndDoc;
  end;
  //Уничтожаю созданное окно печати
  Bm.Free;
  PrintDlg.Free;
end;
Ответить с цитированием
  #6  
Старый 17.06.2014, 17:46
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как распечатать битмап, пример из DRKB
Код:
procedure StretchPrint(R: TRect; ABitmap: Graphics.TBitmap);
var
dc: HDC;
isDcPalDevice: Bool;
hDibHeader: THandle;
pDibHeader: pointer;
hBits: THandle;
pBits: pointer;
ppal: PLOGPALETTE;
pal: hPalette;
Oldpal: hPalette;
i: integer;
begin
pal := 0;
OldPal := 0;

{Get the screen dc}
dc := GetDc(0);

{Allocate memory for a DIB structure}
hDibHeader := GlobalAlloc(GHND, sizeof(TBITMAPINFO) + (sizeof(TRGBQUAD) * 256));

{get a pointer to the alloced memory}
pDibHeader := GlobalLock(hDibHeader);

{fill in the dib structure with info on the way we want the DIB}
FillChar(pDibHeader^, sizeof(TBITMAPINFO) + (sizeof(TRGBQUAD) * 256), #0);

PBITMAPINFOHEADER(pDibHeader)^.biSize := sizeof(TBITMAPINFOHEADER);
PBITMAPINFOHEADER(pDibHeader)^.biPlanes := 1;
PBITMAPINFOHEADER(pDibHeader)^.biBitCount := 8;
PBITMAPINFOHEADER(pDibHeader)^.biWidth := ABitmap.width;
PBITMAPINFOHEADER(pDibHeader)^.biHeight := ABitmap.height;
PBITMAPINFOHEADER(pDibHeader)^.biCompression := BI_RGB;

{find out how much memory for the bits}
GetDIBits(dc, ABitmap.Handle, 0, ABitmap.height, nil, TBitmapInfo(pDibHeader^), DIB_RGB_COLORS);

{Alloc memory for the bits}
hBits := GlobalAlloc(GHND, PBitmapInfoHeader(pDibHeader)^.BiSizeImage);

{Get a pointer to the bits}
pBits := GlobalLock(hBits);

{Call fn again, but this time give us the bits!}
GetDIBits(dc, ABitmap.Handle, 0, ABitmap.height, pBits, PBitmapInfo(pDibHeader)^,  DIB_RGB_COLORS);

{Release the screen dc}
ReleaseDc(0, dc);

{Just incase the printer drver is a palette device}
isDcPalDevice := false;

if GetDeviceCaps(Printer.Canvas.Handle, RASTERCAPS) and RC_PALETTE = RC_PALETTE then
begin

   {Create palette from dib}
   GetMem(pPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
   FillChar(pPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
   pPal^.palVersion := $300;
   pPal^.palNumEntries := 256;
   for i := 0 to (pPal^.PalNumEntries - 1) do
   begin
     pPal^.palPalEntry[i].peRed := PBitmapInfo(pDibHeader)^.bmiColors[i].rgbRed;
     pPal^.palPalEntry[i].peGreen := PBitmapInfo(pDibHeader)^.bmiColors[i].rgbGreen;
     pPal^.palPalEntry[i].peBlue := PBitmapInfo(pDibHeader)^.bmiColors[i].rgbBlue;
   end;

   pal := CreatePalette(pPal^);
   FreeMem(pPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
   oldPal := SelectPalette(Printer.Canvas.Handle, Pal, false);
   isDcPalDevice := true
end;

{send the bits to the printer}
StretchDiBits(Printer.Canvas.Handle, R.Left, R.Top, R.Right - R.Left,
   R.Bottom - R.Top, 0, 0, ABitmap.Width, ABitmap.Height, pBits,
   PBitmapInfo(pDibHeader)^, DIB_RGB_COLORS, SRCCOPY);

{Just incase you printer drver is a palette device}
if isDcPalDevice = true then
begin
   SelectPalette(Printer.Canvas.Handle, oldPal, false);
   DeleteObject(Pal);
end;

{Clean up allocated memory}
GlobalUnlock(hBits);
GlobalFree(hBits);
GlobalUnlock(hDibHeader);
GlobalFree(hDibHeader);
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter