600分一条简单的问题!想想每天5分,多长时间才有600分! (100分)

  • 主题发起人 主题发起人 zjok
  • 开始时间 开始时间
Z

zjok

Unregistered / Unconfirmed
GUEST, unregistred user!
如何打印窗体?
由于我的from很长,我用form.print 打印, 只可以打印看到的哪一部分
看不见的就打不出了,怎样全部打出来?
别外 相同的问题在http://www.delphibbs.com/delphibbs/dispq.asp?lid=730093
我可不太会delphi 这问题 了 希望你给我详细的答案 我会加400分 共600分
 
好﹐我幫你試試看﹐明天給你答復
 
FORM1.Align:=alclient;
form1.Print;
 
你可以先抓屏,然后把图象再打印出来!试试!
For Example:

Unit Printit;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Printers;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
dc: HDC;
isDcPalDevice: BOOL;
MemDc: HDC;
MemBitmap: hBitmap;
OldMemBitmap: hBitmap;
hDibHeader: THandle;
pDibHeader: pointer;
hBits: THandle;
pBits: pointer;
ScaleX:do
uble;
ScaleY:do
uble;
ppal: PLOGPALETTE;
pal: hPalette;
Oldpal: hPalette;
i: integer;
begin

dc := GetDc(0);
MemDc := CreateCompatibleDc(dc);
MemBitmap := CreateCompatibleBitmap(Dc, form1.width, form1.height);
OldMemBitmap := SelectObject(MemDc, MemBitmap);
isDcPalDevice := false;
if GetDeviceCaps(dc, RASTERCAPS) and RC_PALETTE = RC_PALETTE then

begin

GetMem(pPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
FillChar(pPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
pPal^.palVersion := $300;
pPal^.palNumEntries := GetSystemPaletteEntries(dc, 0, 256, pPal^.palPalEntry);
if pPal^.PalNumEntries < > 0 then

begin

pal := CreatePalette(pPal^);
oldPal := SelectPalette(MemDc, Pal, false);
isDcPalDevice := true
end
else

FreeMem(pPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
end;

BitBlt(MemDc, 0, 0, form1.width, form1.height, Dc, form1.left, form1.top, SrcCopy);
if isDcPalDevice = true then

begin

SelectPalette(MemDc, OldPal, false);
DeleteObject(Pal);
end;

SelectObject(MemDc, OldMemBitmap);
DeleteDc(MemDc);
hDibHeader := GlobalAlloc(GHND, sizeof(TBITMAPINFO) + (sizeof(TRGBQUAD) * 256));
pDibHeader := GlobalLock(hDibHeader);
FillChar(pDibHeader^, sizeof(TBITMAPINFO) + (sizeof(TRGBQUAD) * 256), #0);
PBITMAPINFOHEADER(pDibHeader)^.biSize := sizeof(TBITMAPINFOHEADER);
PBITMAPINFOHEADER(pDibHeader)^.biPlanes := 1;
PBITMAPINFOHEADER(pDibHeader)^.biBitCount := 8;
PBITMAPINFOHEADER(pDibHeader)^.biWidth := form1.width;
PBITMAPINFOHEADER(pDibHeader)^.biHeight := form1.height;
PBITMAPINFOHEADER(pDibHeader)^.biCompression := BI_RGB;
{find out how much memory for the bits}
GetDIBits(dc, MemBitmap, 0, form1.height, nil, TBitmapInfo(pDibHeader^),
DIB_RGB_COLORS);
hBits := GlobalAlloc(GHND, PBitmapInfoHeader(pDibHeader)^.BiSizeImage);
pBits := GlobalLock(hBits);
GetDIBits(dc, MemBitmap, 0, form1.height, pBits, PBitmapInfo (pDibHeader)^, DIB_RGB_COLORS);
if isDcPalDevice = true then

begin

for i := 0 to (pPal^.PalNumEntries - 1)do

begin

PBitmapInfo(pDibHeader)^.bmiColors.rgbRed := pPal^.palPalEntry.peRed;
PBitmapInfo(pDibHeader)^.bmiColors.rgbGreen := pPal^.palPalEntry.peGreen;
PBitmapInfo(pDibHeader)^.bmiColors.rgbBlue := pPal^.palPalEntry.peBlue;
end;

FreeMem(pPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
end;

ReleaseDc(0, dc);
DeleteObject(MemBitmap);
Printer.begin
Doc;
if Printer.PageWidth < Printer.PageHeight then

begin

ScaleX := Printer.PageWidth;
ScaleY := Form1.Height * (Printer.PageWidth / Form1.Width);
end
else

begin

ScaleX := Form1.Width * (Printer.PageHeight / Form1.Height);
ScaleY := Printer.PageHeight;
end;

isDcPalDevice := false;
if GetDeviceCaps(Printer.Canvas.Handle, RASTERCAPS) and
RC_PALETTE = RC_PALETTE then

begin

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.peRed := PBitmapInfo(pDibHeader)^.bmiColors.rgbRed;
pPal^.palPalEntry.peGreen := PBitmapInfo(pDibHeader)^.bmiColors.rgbGreen;
pPal^.palPalEntry.peBlue := PBitmapInfo(pDibHeader)^.bmiColors.rgbBlue;
end;

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

StretchDiBits(Printer.Canvas.Handle, 0, 0, Round(scaleX), Round(scaleY), 0, 0,
Form1.Width, Form1.Height, pBits, PBitmapInfo(pDibHeader)^,
DIB_RGB_COLORS, SRCCOPY);
if isDcPalDevice = true then

begin

SelectPalette(Printer.Canvas.Handle, oldPal, false);
DeleteObject(Pal);
end;

GlobalUnlock(hBits);
GlobalFree(hBits);
GlobalUnlock(hDibHeader);
GlobalFree(hDibHeader);
Printer.EndDoc;
end;




 
printer.begin
doc;
printer.canvas.copyrect(self.canvas,xxxx,xxx,x,x,);
printer.enddoc;
 
你可以在Form上放一个ScrollBox控件,让它布满整个Form,再在ScrollBox上放一Image控件,
建议在Image控件进行绘图,这样对Image进行打印时,所见即所得。而且不会因滚动而清除部分内容。
 
更好的办法是将Form的图先拷贝到一个图像,然后打印这个图像.
 
在OnPaint事件里把他画到另一个画布上, 然后把画布输出到打印机上。[:D][:D]
 

我有問題﹐你說你的Form很長﹐是代碼更改的嗎? 不然你如何做這么長﹐
同意用 btxiaoyao 的方法, 放一個 ScrollBox 控件,

同意tseug,在 OnPaint事件中打印畫布


 
在此,谢谢各位!
我在按各位的方法在试,这个问题开始我以为很容易,但写起上来还真有难度(对我来说)
由于我在这方面不熟,希望能给我答案时,各位也试试,给出你们的代码,
象YB_unique写的哪样最好了!

to :YB_unique,wenyue
这是一个很好的抓屏例子,结果和
printer.begin
Doc ;
printer.canvas.CopyRect(printer.canvas.cliprect,canvas,canvas.cliprect);
printer.EndDoc;
一样的 都不适合用,看不到的还是没有办法打出来

to:btxiaoyao,1Fuyi,tseug
我在试你样所说
但各位也试试,能给出你们的代码吗?这样我看起来明白点,我可不是高手啊!
to:WilliamGui
我的form 是放了很多控件在上面,有RadioGroup,CheckBox,Label,Shape,Panel
这此东西,一个屏幕是看不完的,不是通过代码实现的。如何做出来 当你把panel放置
到form的下面时,看不完panel时 ,from就会滚动,哪就可以放控件上去,可以做得很长的。
但总不能完全打印出来,帮我想想吧!
 
你用的d5 还是d6
在d6中有一个printscale 属性
printscale:=poPrintToFit ;就可以了

不知d5有没有
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=314521
http://www.delphibbs.com/delphibbs/dispq.asp?lid=302385
http://www.delphibbs.com/delphibbs/dispq.asp?lid=525571
http://www.delphibbs.com/delphibbs/dispq.asp?lid=285614
http://www.delphibbs.com/delphibbs/dispq.asp?lid=94689
 
[green]同意HTW去下面看看吧。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=314521
http://www.delphibbs.com/delphibbs/dispq.asp?lid=302385
http://www.delphibbs.com/delphibbs/dispq.asp?lid=525571
http://www.delphibbs.com/delphibbs/dispq.asp?lid=285614
http://www.delphibbs.com/delphibbs/dispq.asp?lid=94689[/green]
 
to:htw,酷尔贝塔
我早就看过了
我的问题还是没有得到解决
 
窗体上都什么东西呀,能不能用其他办法呢
 
to:robertcool
我的form 是放了很多控件在上面,有RadioGroup,CheckBox,Label,Shape,Panel
这此东西,一个屏幕是看不完的,from会滚动,做得很长的。但不能完全打印出来,
帮我想想吧!
 
费事,去下载ReportMachine这个控件吧。这个控件里面新增加了打印FORM的功能。
下载地址http://rmachine.yeah.net
 
如果全是标准控件(PaintTo方法正常可用)则可以
调用每一个TWinControl的PainTo方法画到打印机上试试。
 
你可以,先把窗体最大化,然后按键盘上的Print Screen键,然后找一个图象软件,把图象粘贴即
可!
 
procedure TForm1.FormClick(Sender: TObject);
begin

form1.PrintScale :=poPrintToFit;
form1.print;
end;

end.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部