#include "alfpriv.h" #include static DWORD ALF_DllGetVersion(const char *dll) { HMODULE hDll = GetModuleHandleA(dll); if (hDll) { DLLGETVERSIONPROC pDllGetVersion; pDllGetVersion = (DLLGETVERSIONPROC)(void*)GetProcAddress(hDll, "DllGetVersion"); if (pDllGetVersion) { DLLVERSIONINFO dvi; HRESULT hr; ZeroMemory(&dvi, sizeof(dvi)); dvi.cbSize = sizeof(dvi); hr = (*pDllGetVersion)(&dvi); if (SUCCEEDED(hr)) { return MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion); } } } return 0; } static int WINAPI fallbackGetSystemMetricsForDpi(int nIndex, UINT dpi) { (void)dpi; return GetSystemMetrics(nIndex); } static BOOL WINAPI fallbackIsAppThemed(void) { return FALSE; } static UINT WINAPI fallbackGetDpiForWindow(HWND win) { (void)win; UINT dpi = 0; HDC hdcScreen = GetDC(NULL); if (hdcScreen) { dpi = GetDeviceCaps(hdcScreen, LOGPIXELSY); ReleaseDC(NULL, hdcScreen); } if (!dpi) { dpi = 96; // FIXME! fallback to default DPI } return dpi; } static BOOL WINAPI fallbackSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, UINT dpi) { (void)dpi; return SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); } static BOOL WINAPI fallbackAdjustWindowRectExForDpi(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle, UINT dpi) { (void)dpi; return AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle); } ALFCompatFunctions * ALF_CreateCompatFuncTable(void) { ALFCompatFunctions *compatfn = (ALFCompatFunctions*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, sizeof(ALFCompatFunctions)); #define COMPAT(dll, entrypoint, ordinal, fallback) \ do { \ FARPROC p = GetProcAddress(GetModuleHandleA(#dll), #entrypoint); \ if (!p && ordinal) \ p = GetProcAddress(GetModuleHandleA(#dll), (char*)ordinal); \ CopyMemory(&compatfn->entrypoint, &p, sizeof(void*)); \ \ if (!compatfn->entrypoint) \ compatfn->entrypoint = fallback; \ } while (0) COMPAT(comctl32.dll, SetWindowSubclass, 410, NULL); COMPAT(comctl32.dll, DefSubclassProc, 413, NULL); COMPAT(comctl32.dll, RemoveWindowSubclass, 412, NULL); COMPAT(user32.dll, GetSystemMetricsForDpi, 0, fallbackGetSystemMetricsForDpi); COMPAT(user32.dll, GetDpiForWindow, 0, fallbackGetDpiForWindow); // FIXME: SystemParametersInfoForDpi is Unicode-Only. // Writing a wrapper function would have been The Right Way, but such a function // is yet to be written. So the current practical recommendation is to make // ANSI builds System DPI aware only. #ifdef UNICODE COMPAT(user32.dll, SystemParametersInfoForDpi, 0, fallbackSystemParametersInfoForDpi); #else compatfn->SystemParametersInfoForDpi = fallbackSystemParametersInfoForDpi; #endif COMPAT(user32.dll, AdjustWindowRectExForDpi, 0, fallbackAdjustWindowRectExForDpi); // IsAppThemed would return TRUE even when we're linked against comctl32 v5 if (ALF_DllGetVersion("comctl32.dll") >= 0x60000) { LoadLibraryA("uxtheme.dll"); COMPAT(uxtheme.dll, IsAppThemed, 0, fallbackIsAppThemed); } else { compatfn->IsAppThemed = fallbackIsAppThemed; } #undef COMPAT return compatfn; } long ALF_GetAveCharWidth(HDC hdc) { // see: HOWTO: Calculate Dialog Units When Not Using the System Font SIZE s; GetTextExtentPoint32A(hdc, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52, &s); return (s.cx / 26 + 1) / 2; }