ultimatepp/bazaar/GrabYourScreen/GrabBook.cpp
koldo 09780dd2ef GrabYourScreen: Improved and included basic doc
git-svn-id: svn://ultimatepp.org/upp/trunk@9325 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2015-12-23 15:29:08 +00:00

146 lines
No EOL
3.5 KiB
C++

#include "GrabYourScreen.h"
GrabBook::GrabBook() {
CtrlLayout(*this);
}
void GrabBook::Init() {
initialPage = 0;
actualPage = 0;
left <<= 100;
right <<= 1200;
up <<= 100;
down <<= 900;
split = true;
folder = AppendFileName(GetDesktopFolder(), t_("Book"));
canvas.SetShowWindow(false);
canvas.WhenPaint = THISBACK(OnPaint);
reset.WhenAction = THISBACK(OnReset);
capture.WhenAction = THISBACK(OnCapture);
savePDF.WhenAction = THISBACK(OnSavePDF);
SetTimeCallback(-1000, THISBACK(Timer));
keyId = Ctrl::RegisterSystemHotKey(K_CTRL | K_F10, THISBACK(OnCapture));
}
GrabBook::~GrabBook() {
Ctrl::UnregisterSystemHotKey(keyId);
}
void GrabBook::OnPaint(Painter &painter) {
painter.Move(left, up).Line(right, up).Line(right, down).
Line(left, down).Line(left, up).Stroke(2, Black());
painter.Move(left, up).Line(right, down).Stroke(2, Black());
painter.Move(right, up).Line(left, down).Stroke(2, Black());
}
void GrabBook::OnReset() {
actualPage = 0;
initialPage = 0;
}
void GrabBook::OnCapture() {
Rect rPdf(left, up, right, down);
Rect screenRect;
::GetWindowRect(GetHWND(), screenRect);
if (rPdf.Intersects(screenRect)) {
Exclamation(t_("Program window interferes with image"));
return;
}
Timer();
if (!DirectoryExists(folder))
RealizeDirectory(folder);
Image img = ::GetRect(canvas.GetBackground(), Rect(left, up, right, down));
if (!SaveImage(img, 100, AppendFileName(folder, Format("%s.jpg", Format(t_("Pag%04d"), int(actualPage))))))
Exclamation(t_("Error saving image"));
actualPage = actualPage + 1;
}
void GrabBook::OnSavePDF() {
Report r;
int width, height;
if (split) {
width = 210;
height = 297;
} else {
width = 297;
height = 210;
}
r.SetPageSize((width-5-5)*6000/254, (height-5-5)*6000/254);
r.Margins(5*6000/254, 5*6000/254);
String fileName;
FileSel fs;
fs.ActiveDir(GetDesktopFolder());
fs.Type(t_("PDF files"), ".pdf");
if (fs.ExecuteSaveAs(t_("Saving file")))
fileName = ~fs;
else
return;
WaitCursor wait;
ForceExt(fileName, ".pdf");
Size psz = r.GetPageSize();
for(int i = initialPage; i < actualPage; ++i) {
if (i > 0)
r.NewPage();
String fileName = AppendFileName(folder, Format("%s.jpg", Format(t_("Pag%04d"), i)));
Image img = StreamRaster::LoadFileAny(fileName);
Image imgIzq, imgDer;
if (split) {
imgIzq = ::GetRect(img, Rect(0, 0, img.GetWidth()/2, img.GetHeight()));
imgDer = ::GetRect(img, Rect(img.GetWidth()/2 + 1, 0, img.GetWidth(), img.GetHeight()));
} else
imgIzq = img;
DrawingDraw dw(psz.cx, psz.cy);
Rect rect = FitInFrame(psz, imgIzq.GetSize());
dw.DrawImage(rect, imgIzq);
QtfRichObject qrob(CreateDrawingObject(dw, psz.cx, psz.cy));
String qtf;
qtf << qrob;
r << qtf;
if (split) {
r.NewPage();
DrawingDraw dw(psz.cx, psz.cy);
Rect rect = FitInFrame(psz, imgDer.GetSize());
dw.DrawImage(rect, imgDer);
QtfRichObject qrob(CreateDrawingObject(dw, psz.cx, psz.cy));
String qtf;
qtf << qrob;
r << qtf;
}
}
if (!SaveFile(fileName, UPP::Pdf(r))) {
Exclamation(t_("It is not possible to save file.&Posibly .pdf file is already opened."));
return;
}
LaunchFile(fileName);
}
void GrabBook::Timer() {
NON_REENTRANT_V;
canvas.SetBackground(Snap_Desktop());
}
/*
A añadir:
- Seleccion manual de ventana (usando lo de Screen)
- Paso automático de páginas
- Barrido con zoom?
*/