Last active
May 4, 2024 03:17
-
-
Save opsJson/c2c28a8460c3a09621dd5ba37fcd17f3 to your computer and use it in GitHub Desktop.
Easy win32 GDI Print API interface with callbacks.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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