#include "wxinc.h" #include "oswin32.h" #define WIN32_LEAN_AND_MEAN #define WIN32_EXTRA_LEAN #define STRICT #include #include bool OsWin32_CheckPrinterInfo(const void* data) { bool ok = data != NULL; if (ok) { LPDEVMODE pdm = (LPDEVMODE)data; const int s = pdm->dmSize + pdm->dmDriverExtra; ok = s > 0; } return ok; } void* OsWin32_ConvertFromNativePrinterInfo(void* hGlobal) { void* data = new char[1024]; memset(data, 0, 1024); void* ptr = ::GlobalLock(hGlobal); PDEVMODE dm = (PDEVMODE)ptr; const int size = dm->dmSize+dm->dmDriverExtra; memcpy(data, ptr, size); ::GlobalUnlock(hGlobal); return data; } void* OsWin32_ConvertToNativePrinterInfo(void* data) { HGLOBAL hGlobal = ::GlobalAlloc(GHND, 1024); void* ptr = ::GlobalLock(hGlobal); memcpy(ptr, data, 1024); ::GlobalUnlock(hGlobal); return hGlobal; } #include struct XvtData { char** families; long* sizes; short* scalable; long max_count; long cur_count; XvtData() { memset(this, 0, sizeof(XvtData)); } }; int CALLBACK FamilyEnumerator( const LOGFONT *plf, // pointer to logical-font data const TEXTMETRIC *lpntme, // pointer to physical-font data unsigned long FontType, // type of font LPARAM lParam // application-defined data ) { XvtData* d = (XvtData*)lParam; d->families[d->cur_count++] = strdup(plf->lfFaceName); return d->cur_count < d->max_count; } int CALLBACK SizeEnumerator( const LOGFONT *plf, // pointer to logical-font data const TEXTMETRIC *lpntme, // pointer to physical-font data unsigned long FontType, // type of font LPARAM lParam // application-defined data ) { XvtData* d = (XvtData*)lParam; long& i = d->cur_count; const int size = (plf->lfHeight+5) / 10; if (i == 0 || size > d->sizes[i-1]) { d->sizes[i] = size; *d->scalable = (plf->lfPitchAndFamily & VARIABLE_PITCH) != 0; i++; } return i < d->max_count; } int FamilySorter(const void* p1,const void* p2) { const char* s1 = *(const char**)p1; const char* s2 = *(const char**)p2; return strcmp(s1, s2); } int OsWin32_EnumerateFamilies(unsigned int hDC, char** families, int max_count) { XvtData data; data.families = families; data.max_count = max_count; LOGFONT lf; memset(&lf, 0, sizeof(lf)); ::EnumFontFamiliesEx((HDC)hDC, &lf, FamilyEnumerator, (LPARAM)&data, 0); qsort(families, data.cur_count, sizeof(char*), FamilySorter); return data.cur_count; } int OsWin32_EnumerateSizes(unsigned int hDC, const char* name, long* sizes, short* scalable, int max_count) { XvtData data; data.sizes = sizes; data.scalable = scalable; data.max_count = max_count; LOGFONT lf; memset(&lf, 0, sizeof(lf)); strcpy(lf.lfFaceName, name); ::EnumFontFamiliesEx((HDC)hDC, &lf, SizeEnumerator, (LPARAM)&data, 0); return data.cur_count; } int OsWin32_GetDefaultPrinterInfo(void* data, int max_size) { char name[80]; if (GetProfileString ("windows", "device", ",,,", name, sizeof(name)) == 0) return 0; char* comma = strchr(name, ','); if (comma) *comma = '\0'; LPDEVMODE pdm = (LPDEVMODE)data; HANDLE hPrinter; if (::OpenPrinter(name, &hPrinter, NULL) == 0) return 0; ::DocumentProperties(0, hPrinter, name, pdm, NULL, DM_OUT_BUFFER); ::ClosePrinter(hPrinter); const int size = pdm->dmSize + pdm->dmDriverExtra; return size; } void OsWin32_SetCaptionStyle(unsigned int handle, bool set) { HWND hwnd = (HWND)handle; DWORD s = ::GetWindowLong(hwnd, GWL_STYLE); if (set) s |= WS_CAPTION; else s &= ~WS_CAPTION; #if !wxCHECK_VERSION(2,3,2) s |= WS_CLIPSIBLINGS; #endif ::SetWindowLong(hwnd, GWL_STYLE, s); } void OsWin32_SetClippingRect(unsigned int hDC, int x, int y, int w, int h) { HDC hdc = (HDC)hDC; if (w > 0 && h > 0) { HRGN hrgn = ::CreateRectRgn(x, y, x+w, y+h); ::SelectClipRgn(hdc, hrgn); ::DeleteObject(hrgn); } else ::SelectClipRgn(hdc, NULL); } void OsWin32_StretchBlt(unsigned int hDst, int xd, int yd, int wd, int hd, unsigned int hSrc, int xs, int ys, int ws, int hs) { ::StretchBlt((HDC)hDst, xd, yd, wd, hd, (HDC)hSrc, xs, ys, ws, hs, SRCCOPY); } void OsWin32_UpdateWindow(unsigned int handle) { HWND hwnd = (HWND)handle; ::UpdateWindow(hwnd); }