Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > WinAPI и печать изображений


Автор: Limonchik 9.11.2008, 17:47
Привет всем!Помогите решить одну проблемку.Необходимо осуществить вывод на печать изображения при помощи только WinAPI, не используя никаких стандартных дельфовских компонентов(PrintDialog,PrintSetupPage) и классов TPrinter и TPrintDlg

Автор: Веталька 9.11.2008, 21:45
1) тинц сюди =>>>  http://sources.ru/delphi/delphi_print.shtml =>>>
Код

uses CommDlg;

{$IFNDEF WIN32}
 const MAX_PATH = 144;
{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
var
  Pd : TPrintDlg;
  DocInfo: TDocInfo;
begin
  FillChar(Pd, sizeof(Pd), #0); 
  Pd.lStructSize := sizeof(Pd);
  Pd.hWndOwner := Form1.Handle;
  Pd.Flags := PD_RETURNDC;
  if PrintDlg(pd) then begin
    FillChar(DocInfo, sizeof(DocInfo), #0);
    DocInfo.cbSize := SizeOf(DocInfo);
    GetMem(DocInfo.lpszDocName, 32);
    GetMem(DocInfo.lpszOutput, MAX_PATH);
    lStrCpy(DocInfo.lpszDocName, 'My Document');
   {Следующая строка указывает на файл, который надо распечатать }
    lStrCpy(DocInfo.lpszOutput, 'C:\Download\Test.doc');
    StartDoc(Pd.hDc, DocInfo);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 1', 6);
    EndPage(Pd.hDc);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 2', 6);
    EndPage(Pd.hDc);
    EndDoc(Pd.hDc);
    FreeMem(DocInfo.lpszDocName, 32);
    FreeMem(DocInfo.lpszOutput, MAX_PATH);
  end;
end;



2)ище есть такое:
Код

// Инициализируем поля структуры TPrintDlg
    FillChar(pd, SizeOf(pd), 0);
    pd.lStructSize := SizeOf(pd);
    pd.hwndOwner   := hRichEdit;
    pd.hInstance   := hInstance;
    pd.Flags       := PD_RETURNDC or PD_NOPAGENUMS or PD_NOSELECTION or PD_PRINTSETUP or PD_ALLPAGES;
    pd.nFromPage   := $ffff;
    pd.nToPage     := $ffff;
    pd.nMinPage    := 0;
    pd.nMaxPage    := $ffff;
    pd.nCopies     := 1;

    // Выводим на экран диалоговую панель, предназначенную
    // для печати документа
    if PrintDlg(pd) = True then
    begin
      PrintDC := pd.hDC;

      // Инициализируем поля структуры TFormatRange
      FillChar(fr, SizeOf(fr), 0);
  
      // Будем печатать с использованием контекста
      // принтера, полученного от функции PrintDlg
      fr.hdc       := PrintDC;
      fr.hdcTarget := PrintDC;

      // Печатаем весь документ
      fr.chrg.cpMin := 0;
      fr.chrg.cpMax := -1;
  
      // Устанавливаем размеры страницы в TWIPS-ах
      with fr.rcPage do
      begin
    Top    := 0;
        Left   := 0;
        Right  := MulDiv(GetDeviceCaps(PrintDC, PHYSICALWIDTH),  1440, GetDeviceCaps(PrintDC, LOGPIXELSX));
        bottom := MulDiv(GetDeviceCaps(PrintDC, PHYSICALHEIGHT), 1440, GetDeviceCaps(PrintDC, LOGPIXELSY));
      end;
      fr.rc := fr.rcPage;

      // Оставляем поля
      if (fr.rcPage.Right > 2 * 3 * 1440 / 4 + 1440) then
      begin
    fr.rc.Left := 3 * 1440 div 4;
    dec(fr.rc.Right, fr.rc.Left);
      end;
      if (fr.rcPage.Bottom > 3 * 1440) then
      begin
        fr.rc.top := 1440;
        dec(fr.rc.Bottom, fr.rc.top);
      end;
    
      // Заполняем поля структуры DOCINFO
      FillChar(DocInfo, SizeOf(DocInfo), 0);
      with DocInfo do
      begin
    cbSize      := SizeOf(DocInfo);
    lpszOutput  := '';
    lpszDocName := 'DIMTable document';
      end;

      // Начинаем печать документа
      nRc := StartDoc(PrintDC, DocInfo);
    
      // Если произошла ошибка, получаем и выводим на экран код ошибки
      if (nRc < 0) then
      begin
        dwErr := GetLastError;
        MessageBox(0, PChar(Format('Ошибка печати = %ld', [dwErr])), AppName, MB_OK or MB_ICONEXCLAMATION);
      
    DeleteDC(PrintDC);
    Exit;
      end;

      // Начинаем печать страницы
      StartPage(PrintDC);
      lLastChar := 0;

      // Определяем длину текста в байтах
      lTextSize := SendMessage(hRichEdit, WM_GETTEXTLENGTH, 0, 0);

      // Цикл по всем страницам документа
//====================================    
      // этот цткл и клинит, а почему не понял
//====================================
      while (lLastChar < lTextSize) do
      begin
    // Форматируем данные для принтера и печатаем их
        lLastChar := SendMessage(hRichEdit, EM_FORMATRANGE, 1, Longint(@fr));
        
    if (lLastChar < lTextSize) then
        begin
      // Завершаем печать очередной страницы
          EndPage(PrintDC);
        
      // Начинаем новую страницу
      StartPage(PrintDC);    
          fr.chrg.cpMin := lLastChar;
          fr.chrg.cpMax := -1;
    end;
      end;

      // Удаляем информацию, которая хранится в 
      // органе управления Rich Edit
      SendMessage(hRichEdit, EM_FORMATRANGE, 1, 0);

      // Завершаем печать страницы
      EndPage(PrintDC);

      // Завершаем печать документа
      EndDoc(PrintDC);

      // Удаляем контекст принтера
      DeleteDC(PrintDC);
    end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)