Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать формы, которой не видно на экране, печать 
:(
    Опции темы
MacTep
Дата 26.6.2004, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Как распечатать форму, которую в данный момент нельзя отобразить на экране. Например, есть форма, на которой лежит кнопка ПЕЧАТЬ. Нажатие по этой кнопке означает, что нужно распечатать содержимое формы (уже другой, которую не видно на экране). Как распечатать так, чтобы лишний раз не отображать форму номер 2 на экране. Если отображать, то так у меня получается, а вот без этого никак. Может можно как-то фокус что ли передать второй форме? Вообще, проблема состоит именно в том, как правильно перерисовать изображение формы на канву принтера. Этого я сделать как раз и не могу! Помогите!!


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
youri
Дата 27.6.2004, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



to Мастер
Цитата
Если отображать, то так у меня получается, а вот без этого никак.

Если не отображать, то у меня кнопки не рисуются (TButton и его наследники), а все остальное рисуется.
to All
Я тут пытался разобраться в этой штуке:
TCustomForm.Print - распечатывает клиентскую область формы, для этого использует TCustomForm.GetFormImagе
TCustomForm.GetFormImagе - возвращает изображение формы, для этого он создает канву и вызывает TWinControl.PaintTo, передавая ему handle контекста канвы
TWinControl.PaintTo - рисует на канве форму, а потом вызывает PaintTo для всех своих наследников; для рисования с помощью Perform передает сообщение WM_PAINT в WndProc
TButtonControl.WndProc на WM_PAINT не реагирует
TWinControl.WndProc на WM_PAINT не реагирует
TControl.WndProc на WM_PAINT не реагирует и вызывает Dispatch
обработчик WM_PAINT есть в TWinControl и, насколько я понимаю, рисование происходит здесь
Код
procedure TWinControl.WMPaint(var Message: TWMPaint);
...
begin
 if not FDoubleBuffered or (Message. DC <> 0) then
 begin
   if not (csCustomPaint in ControlState) and (ControlCount = 0) then
      INHERITED
   else
     PaintHandler(Message);
 end
 else
...

Мне не совсем понятно, inherited - это вызов WMPaint ближайшего родителя TWinControl? Если так, то у всех родителей TWinControl нет WMPaint? Значит ли это, что обрабатывает событие Windows'овский обработчик, или где этот TButton вообще рисуется?

Вот обработчик двойного щелчка на форме (кнопка отображается в TImage):
Код
Form1.Hide;

tBitmap_ := TBitmap.Create;
// ---- GetFormImage
try
 tBitmap_.Width := Button1.Width;
 tBitmap_.Height := Button1.Height;
 tBitmap_.Canvas.Brush := Button1.Brush;
 tBitmap_.Canvas.FillRect(Button1.ClientRect);
 tBitmap_.Canvas.Lock;
 try
//   Button1.PaintTo(tBitmap_.Canvas.Handle, 0, 0);
//   Perform(WM_Paint,tBitmap_.Canvas.Handle,0);
// ---- PaintTo
// ---- Perform
  Message.Msg := WM_PAINT;
  Message.WParam := tBitmap_.Canvas.Handle;
  Message.LParam := 0;
  Message.Result := 0;
  if Self <> nil then Button1.WindowProc(Message);
// ---- Perform
// ---- PaintTo
 finally
  tBitmap_.Canvas.Unlock;
 end;
except
 tBitmap_.Free;
 raise;
end;
// ---- GetFormImage

Image1.Picture.Bitmap := tBitmap_;

   Form1.Show;

Если закомментировать в начале Hide, то не работает
PM   Вверх
MacTep
Дата 27.6.2004, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Я так и не понял, что это все было в предыдущем сообщении. По-моему, никакого ответа на свой вопрос я даже и не увидел. Кто-нибудь подскажет. У меня там панельки (3 штуки) и их надо вырисоватьна канве принтера, а потом все это вывести на печать. Так вот без показа формы на экране ничего не получается... Беда...


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
youri
Дата 27.6.2004, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



В, принципе, ответа я не дал, но у меня все печатается, кроме TButton, а у тебя
Цитата
Если отображать, то так у меня получается, а вот без этого никак

Так ты скажи: у тебя ничего не печатается, или все же что-то печатается? Если что-то печатается, то скажи какие компоненты не печатаются. Можешь послать мне на email свой проект ([email protected]), посмотрю, что там у тебя.
PM   Вверх
z-END
Дата 27.6.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



MacTep а как ты хочешь напечатать то что не ненарисовано?! т.к. пока форма непоказывается то на ней соответсвенно ничего и не рисуется...
хотя возможно это и реально, например пр рисовании формы делать через GetDC, тогда (ИМХО) форма не будет отображаться на экране а будет рисоваться например в TImage.Bitmap находящегося на форме где кнопка печать... и уже Timage пускать на принтер, прада незнаю реально это или нет. hehe.gif


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
<Spawn>
Дата 27.6.2004, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Посмотри функцию GetDIBits и другие связаные с ней - может чего и получится.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
MacTep
Дата 27.6.2004, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



nJIaKca.spb, дело в том, что на канве принтера я уже рисую то, что мне надо, вот только не печатает от это и все. А не печатает потому, что форма на экране не отображается. А как только я ее покажу (Form1.Show), то сразу печатать начинает. А Delphi разве не видит то, что на скрытой форме расположено? Как ей это "показать", сказать, что там именно то-то и то-то есть?

Добавлено @ 22:15
<Spawn> что-то я про такое и не слышал и не видел нигде. В справке Delphi тоже вроде не нашел. Подскажи, что это такое и с чем это едят!? smile.gif



--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
youri
Дата 28.6.2004, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Мастер, ты вообще ответы читаешь? У тебя что-нибудь печатается? Если ты не знаешь как печатать, то ты пробовал Form2.Print. Если знаешь, то как ты печатаешь (исходник).
PM   Вверх
MacTep
Дата 30.6.2004, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



У меня все нормально печатается. А точнее у меня все нормально отображается в Microsoft Document Imaging, а вот на принтер почему-то ничего не выводится. Я делаю так: рисую на канве принтера (создаю битмап), а потом просто все это дело вывожу на печать. В этой проге у меня все отображается на экране, а вот печатать не хочет. Как поступать - не знаю! Теперь доходчиво объяснил?
Код

 j:=0;
 RowUp:=StringGrid1.Selection.Top;
 RowDown:=StringGrid1.Selection.Bottom;
 {Открытие и закрытие формы для ее отобажения}
 Form4.Visible:=True;
 Form4.Visible:=False;
 {создание картинки, которую будем выводит на принтер}
 bm:=Tbitmap.Create;
 bm.Width:=Form4.Panel1.Width+50;
 {печать картинки}
 with Printer do
   begin
    ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
    ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
    BeginDoc;
       if RowDown-RowUp>2 then
         begin
           repeat
             i:=0;
             if j<>(RowDown-RowUp+1) then begin Convert(1,RowUp+j); inc(j); inc(i); end;
             if j<>(RowDown-RowUp+1) then begin Convert(2,RowUp+j); inc(j); inc(i); end;
             if j<>(RowDown-RowUp+1) then begin Convert(3,RowUp+j); inc(j); inc(i); end;
             if i=1 then
               begin
                 bm.Height:=Form4.Panel1.Height+50;
                 Form4.Panel1.PaintTo(bm.Canvas.Handle,50,30);
                 Form4.Panel1.Repaint;
               end;
             if i=2 then
               begin
                 bm.Height:=Form4.Panel1.Height+Form4.Panel2.Height+60;
                 Form4.Panel1.PaintTo(bm.Canvas.Handle,50,30);
                 Form4.Panel1.Repaint;
                 Form4.Panel2.PaintTo(bm.Canvas.Handle,50,371);
                 Form4.Panel2.Repaint;
               end;
             if i=3 then
               begin
                 bm.Height:=Form4.Panel1.Height+Form4.Panel2.Height+Form4.Panel3.Height+70;
                 Form4.Panel1.PaintTo(bm.Canvas.Handle,50,30);
                 Form4.Panel1.Repaint;
                 Form4.Panel2.PaintTo(bm.Canvas.Handle,50,371);
                 Form4.Panel2.Repaint;
                 Form4.Panel3.PaintTo(bm.Canvas.Handle,50,712);
                 Form4.Panel3.Repaint;
               end;
             Canvas.StretchDraw(Rect(10,10,bm.Width*ScaleX,bm.Height*ScaleY),bm);
             if j<>(RowDown-RowUp+1) then Printer.NewPage;
           until (j=(RowDown-RowUp+1));
         end
       else
         Canvas.StretchDraw(Rect(10,10,bm.Width*ScaleX,bm.Height*ScaleY),bm);
    EndDoc;
   end;
 bm.Free;

Посмотрите... если что-то понятно! Как бороться с тем, что не печатает это дело на принтере? hmmm.gif


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Girder
Дата 30.6.2004, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Это не множко не так делается.
К примеру: печатаем видимую(не обезательно отображаемою на мониторе) область Form4
Код
procedure TForm1.Button1Click(Sender: TObject);
var t:TMetafileCanvas;
  v:TMetafile;
  i,j:TRect;
  X,Y,m:integer;
begin
if Printer.Printers.Count>0 then
begin
 v:=TMetafile.Create;
 t:=TMetafileCanvas.Create(v,0);
 Form4.PaintTo(t,0,0);
 i:=t.ClipRect;
 t.Free; //не перемещать эту строку
 Printer.PrinterIndex:=-1;  //Принтер по умолчанию
 j:=Printer.Canvas.ClipRect;
 X:=j.BottomRight.X-j.TopLeft.X;
 Y:=j.BottomRight.Y-j.TopLeft.Y;
 X:=X div (i.BottomRight.X-i.TopLeft.X);
 Y:=Y div (i.BottomRight.Y-i.TopLeft.Y);
 if X<Y then m:=X else m:=Y;
 if m>0 then
  begin
   i.BottomRight.X:=i.TopLeft.X+(i.BottomRight.X-i.TopLeft.X)*m;
   i.BottomRight.Y:=i.TopLeft.Y+(i.BottomRight.Y-i.TopLeft.Y)*m;
  end;
 try
  Printer.BeginDoc;
  printer.Title:='Girder';
  Printer.Canvas.StretchDraw(i,v);
  Printer.EndDoc;
 finally
  v.Free;
 end;
end;
end;


Это сообщение отредактировал(а) Girder - 30.6.2004, 16:44


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
MacTep
Дата 3.7.2004, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Отличие в том, что мы вместо простого битмапа создаем специальный метафайл для канвы принтера? Я правильно понял! Очень похоже на мое! Благодарю за ответ. Очень помогло!


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.