Jak widać rymujący się temat :D
Mój problem dotyczy tego:
Chciałbym, aby po kliknięciu na dany przycisk utworzyła mi się forma, która rozciągnie się na pełny ekran i nie będzie miała paska tytułowego czy obramowania. Po prostu pełny ekran. No może i z tym bym sobie poradził, ale chciałbym, żeby utworzył się w niej automatycznie rozciągnięty na całą szerokość komponent Flash, dzięki czemu będę mógł otworzyć animację na pełnym ekranie.
Druga rzecz - jak mogę wydrukować aktualnie wyświetlaną klatkę w komponencie Flash, skoro nie ma on funkcji Print?
- Pełny ekran:
http://4programmers.net/Forum/280967 - Flash na pełny ekran: http://www.actionscript.org/tutorials/beginner/Flash_Projectors_and_Crossplatform_CD_burning/
- Drukowanie: przewiń do klatki, zrób PrintScreena i go wydrukuj
Wielkie dzięki. Co do drukowania - nie chodzi mi tutaj o robienie screenów. Ma to działać tak - jest przycisk drukuj, otwiera się PrintDialog, Flash się zatrzymuje i aktualna klatka może zostać wydrukowana. Jest to możliwe, bo w normalnym odtwarzaczu Flasha jest taka opcja.
PS: Super, stworzyłem formę, na niej flash, zrobiłem na full ekran i gitara. Działa jak powinno. Tylko jedna rzecz mnie nie pokoi - czemu jak rozciągam Flasha, to animacja zostaje w wielkości takiej jak była, a rozciągnięta część jest jakby przezroczysta? Wygląda to tak, jakby tylko forma się rozciągała, a przecież flasha mam na alClient
Wielkie dzięki. Co do drukowania - nie chodzi mi tutaj o robienie screenów. Ma to działać tak - jest przycisk drukuj, otwiera się PrintDialog, Flash się zatrzymuje i aktualna klatka może zostać wydrukowana. Jest to możliwe, bo w normalnym odtwarzaczu Flasha jest taka opcja.
Nie wiadomo jak Flash to robi.. może też wali Print Screen`a :) .. oczywiście po uprzednim zatrzymaniu ..
Czemu komponent Flash nie ma funkcji Print? :]
No dobra - to może tak, zrobię:
flash.Pause;
i wtedy mam zatrzymaną klatkę. No to jak zrobić z niej teraz zrzut ekranu i go wydrukować? Gdyby był jakiś komponent w standardzie, gdzie da się wkleić rysunek, to można by było i tak zrobić, żeby potem z tego komponentu drukował, a on byłby ukryty. To jest myśl. Teraz tylko czy możecie mnie nakierować jak zrobić screena z samego komponentu Flash i potem zrobić taki trick z tym obrazkiem? Na tej funkcji najbardziej mi zależy - drukowanie.
Najogólniej tak:
var Canvas:TCanvas;
begin
Printer.Orientation:=poLandscape;
Printer.BeginDoc;
Canvas:=TCanvas.Create;
Canvas.Handle:=GetWindowDC(GetDesktopWindow());
Printer.Canvas.CopyRect(Rect(0,0, Printer.PageWidth, Printer.PageHeight), Canvas, Rect(0,0, Screen.Width, Screen.Height));
Canvas.Free;
end;
Rozumiem, ale co to Printer? No i z tego kodu wynika, że miałbym podać współrzędne do zrobienia screena, a nie da się jakoś tak, żeby z samego komponentu Flash o nazwie "flash" wycinało?</b>
To kod pozwalający drukować od razu zrobionego screena.
Nie o to mi chodziło. Pytam się co to jest "Printer", bo jego atrybuty nie pasują ani do PrintDialog ani do PrintSetupDialog. Dlatego mam pytanie co to jest i jak ten kod przystosować, żeby nie wywalało błędu tylko drukowało :)
PS: Udało zrobić mi się procedurę, która pobiera zrzut z komponentu Flash i wrzuca ją do obrazka, który jest ukryty. Teraz problem jest jedynie w tym, żeby ten obrazek wydrukować. Nie wiem czy procedura działa (program się odpala, niby wszystko OK), ale drukowanie obrazka coś mi nie wychodzi. Wszystko z powodu tego "Printer"
Ktoś mi wyjaśni CO TO JEST Printer i jego funkcje jak np. BeginDoc?
Jak to ma komukolwiek działać, skoro nigdzie, w żadnym artykule, nie jest napisane co to jest ten Printer. Wszechwiedzący nie jestem przecież.</b>
Przykład z Helpa:
This example uses a button and a memo on a form. When the user clicks the button, the content of the memo is printed, with a 200-pixel border around the page. To run this example successfully, you must add the Printers unit to the uses clause of your unit.
procedure TForm1.Button1Click(Sender: TObject);
begin
with Printer do
begin
BeginDoc;
Canvas.TextRect(Rect(200,200,PageWidth-200,PageHeight-200),
200, 200, Memo1.Lines.Text);
EndDoc;
end;
end;
Printer w module Printers to funkcja zwracająca instancję klasy TPrinter. Jeżeli chcesz używać Printer to do sekcji uses dodaj "Printers".
Dzięki za konkretną odpowiedź :) W końcu mogę używać Printer. No i w rezultacie mi nie drukuje. Oto co zrobiłem:
// oto procedura SpapShot
{ ... }SnapShot(var Img : TImage; L,G,P,D : integer);
var ScreenDC : HDC;
ImageDC : HDC;
begin
{ tutaj procedura, która otwiera mi flasha na pełny ekran i zatrzymuje go }
ScreenDC := GetWindowDC(0);
Img.Picture.Bitmap.Height := D-G;
Img.Picture.Bitmap.Width := P-L;
ImageDC := Img.Picture.Bitmap.Canvas.Handle;
{ tutaj zamknięcie flasha }
BitBlt(ImageDC, 0, 0,P-L, D-G , ScreenDC, 0, 0, SrcCopy);
zrzut.Refresh; // zrzut to nazwa mojego Image
end;
// poniżej procedura DrawImage
procedure DrawImage(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
var
Header, Bits: Pointer;
HeaderSize: DWORD;
BitsSize: DWORD;
begin
GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
Header := AllocMem(HeaderSize);
Bits := AllocMem(BitsSize);
try
GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
DestRect.Right, DestRect.Bottom,
0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),
DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Header, HeaderSize);
FreeMem(Bits, BitsSize);
end;
end;
// procedura drukowania
procedure PrintImage(Image: TImage; ZoomPercent: Integer);
var
relHeight, relWidth: integer;
begin
Screen.Cursor := crHourglass;
Printer.BeginDoc;
with Image.Picture.Bitmap do
begin
if ((Width / Height) > (Printer.PageWidth / Printer.PageHeight)) then
begin
relWidth := Printer.PageWidth;
relHeight := MulDiv(Height, Printer.PageWidth, Width);
end
else
begin
relWidth := MulDiv(Width, Printer.PageHeight, Height);
relHeight := Printer.PageHeight;
end;
relWidth := Round(relWidth * ZoomPercent / 100);
relHeight := Round(relHeight * ZoomPercent / 100);
DrawImage(Printer.Canvas, Rect(0, 0, relWidth, relHeight), Image.Picture.Bitmap);
end;
Printer.EndDoc;
Screen.cursor := crDefault;
end;
// procedura przycisku drukuj
{ ... }
begin
if { jeden warunek } then
begin
{ jedna instrukcja }
end
else
begin
{ nazwa formy }.SnapShot(zrzut,0,0,0,0); // gdzie zrzut to mój Image
if print.Execute then
begin
PrintImage(zrzut, 50); // Drukowanie w wielkości 50% z mojego zrzut
end;
end;
end;
Nie jestem do końca przekonany co do SnapShot(zrzut,0,0,0,0);
Może ktoś mnie oświecić co mam zrobione źle?
PS: Pozwoliłem sobie zakomentować ( { ... } ) fragmenty kodu, które nie dotyczą problemu :P
Hmm - ktoś mi powie co robię źle? ;)