diff --git a/reference/CaptureScreenDll/CaptureScreenDll.upp b/reference/CaptureScreenDll/CaptureScreenDll.upp new file mode 100644 index 000000000..84716b20e --- /dev/null +++ b/reference/CaptureScreenDll/CaptureScreenDll.upp @@ -0,0 +1,14 @@ +description "Demonstrates .dll in Win32 with single capture_screen function\377"; + +uses + CtrlLib, + plugin\jpg, + plugin\gif, + plugin\tif; + +file + main.cpp; + +mainconfig + "" = "GUI DLL"; + diff --git a/reference/CaptureScreenDll/init b/reference/CaptureScreenDll/init new file mode 100644 index 000000000..336830065 --- /dev/null +++ b/reference/CaptureScreenDll/init @@ -0,0 +1,8 @@ +#ifndef _ScreenShotter_icpp_init_stub +#define _ScreenShotter_icpp_init_stub +#include "CtrlLib/init" +#include "plugin\jpg/init" +#include "plugin\gif/init" +#include "plugin\tif/init" +#include "plugin\pcx/init" +#endif diff --git a/reference/CaptureScreenDll/main.cpp b/reference/CaptureScreenDll/main.cpp new file mode 100644 index 000000000..b234ba864 --- /dev/null +++ b/reference/CaptureScreenDll/main.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include + +using namespace Upp; + +Image ScreenShot(int x, int y, int cx, int cy) +{ + HDC dcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); + + RGBA *pixels; + + Buffer data; + data.Alloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256); + BITMAPINFOHEADER *hi = (BITMAPINFOHEADER *) ~data;; + memset(hi, 0, sizeof(BITMAPINFOHEADER)); + hi->biSize = sizeof(BITMAPINFOHEADER); + hi->biPlanes = 1; + hi->biBitCount = 32; + hi->biCompression = BI_RGB; + hi->biSizeImage = 0; + hi->biClrUsed = 0; + hi->biClrImportant = 0; + hi->biWidth = cx; + hi->biHeight = -cy; + + HBITMAP hbmp = CreateDIBSection(dcScreen, (BITMAPINFO *)hi, DIB_RGB_COLORS, (void **)&pixels, NULL, 0); + HDC dcMem = ::CreateCompatibleDC(dcScreen); + HBITMAP hbmpOld = (HBITMAP) ::SelectObject(dcMem, hbmp); + HDC hdcCompatible = CreateCompatibleDC(dcScreen); + ::BitBlt(dcMem, 0, 0, cx, cy, dcScreen, x, y, SRCCOPY); + + ImageBuffer ib(cx, cy); + memcpy(~ib, pixels, cx * cy * sizeof(RGBA)); + + ::DeleteObject(::SelectObject(dcMem, hbmpOld)); + ::DeleteDC(dcMem); + ::DeleteDC(dcScreen); + + return ib; +}; + +extern "C" __declspec(dllexport) int capture_screen(int x, int y, int cx, int cy, char *filename) { + Image m = ScreenShot(x, y, cx, cy); + String ext = ToLower(GetFileExt(filename)); + if(ext == ".png") + PNGEncoder().SaveFile(filename, m); + if(ext == ".bmp") + BMPEncoder().Bpp(32).SaveFile(filename, m); + if(ext == ".jpg") + JPGEncoder().SaveFile(filename, m); + if(ext == ".gif") + GIFEncoder().SaveFile(filename, m); + if(ext == ".tif" || ext == ".tiff") + TIFEncoder().SaveFile(filename, m); + return 0; +} + +DLL_APP_MAIN { +}