mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 22:02:58 -06:00
146 lines
No EOL
3.5 KiB
C++
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?
|
|
*/ |