Skip to content

Instantly share code, notes, and snippets.

@opsJson
Last active May 4, 2024 03:17
Show Gist options
  • Save opsJson/c2c28a8460c3a09621dd5ba37fcd17f3 to your computer and use it in GitHub Desktop.
Save opsJson/c2c28a8460c3a09621dd5ba37fcd17f3 to your computer and use it in GitHub Desktop.
Easy win32 GDI Print API interface with callbacks.
#ifndef _PRINTER_PAGE_H_
#define _PRINTER_PAGE_H_
#include <windows.h>
/* compile with flags -lgdi32 and -lwinspool */
int PrintPage(wchar_t *printer_name, void (*callback)(HDC printer, void *userdata), void *userdata) {
HDC printer;
DOCINFOA docinfo;
if (callback == NULL) return 0;
if (printer_name == NULL || *printer_name == '\0') {
unsigned long size;
GetDefaultPrinterW(NULL, &size);
printer_name = (wchar_t*) malloc(size * sizeof(wchar_t));
if (printer_name == NULL) return 0;
if (GetDefaultPrinterW(printer_name, &size) == 0) {
free(printer_name);
return 0;
}
printer = CreateDCW(L"WINSPOOL", printer_name, NULL, NULL);
free(printer_name);
}
else {
printer = CreateDCW(L"WINSPOOL", printer_name, NULL, NULL);
}
if (printer == NULL) return 0;
memset(&docinfo, 0, sizeof(docinfo));
docinfo.cbSize = sizeof(docinfo);
if (StartDoc(printer, (const DOCINFO*)&docinfo) <= 0) goto error;
if (StartPage(printer) <= 0) goto error;
callback(printer, userdata);
if (EndPage(printer) <= 0) goto error;
if (EndDoc(printer) <= 0) goto error;
DeleteDC(printer);
return 1;
error:
DeleteDC(printer);
return 0;
}
#endif /* _PRINTER_PAGE_H_ */
/*///////////////////////////////////
Testing:
///////////////////////////////////*/
#include <stdio.h>
#include <stdlib.h>
void ScreenshotOut(HDC printer, int x, int y) {
int *pixels;
BITMAPINFO bitmapinfo;
HDC screen = GetDC(0);
int width = GetSystemMetrics(SM_CXSCREEN);
int height = GetSystemMetrics(SM_CYSCREEN);
HDC memoryDC = CreateCompatibleDC(screen);
HBITMAP memoryBMP = CreateCompatibleBitmap(screen, width, height);
SelectObject(memoryDC, memoryBMP);
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biWidth = width;
bitmapinfo.bmiHeader.biHeight = height;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biBitCount = 32;
bitmapinfo.bmiHeader.biCompression = BI_RGB;
pixels = (int*)malloc(sizeof(int) * width * height);
if (pixels == NULL) {
DeleteObject(memoryBMP);
DeleteDC(memoryDC);
return;
}
BitBlt(memoryDC, 0, 0, width, height, screen, x, y, SRCCOPY);
GetDIBits(memoryDC, memoryBMP, 0, height, pixels, &bitmapinfo, DIB_RGB_COLORS);
StretchDIBits(printer, x, y, width, height, 0, 0, width, height, pixels, &bitmapinfo, DIB_RGB_COLORS, SRCCOPY);
free(pixels);
DeleteObject(memoryBMP);
DeleteDC(memoryDC);
}
void callback(HDC printer, void *userdata) {
(void)userdata;
{
wchar_t *msg = L"SCREENSHOT:";
TextOutW(printer, 0, 0, msg, wcslen(msg));
}
{
ScreenshotOut(printer, 0, 150);
}
}
int main(void) {
PrintPage(NULL, callback, NULL);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment