// Scintilla source code edit control /** @file PlatWin.h ** Implementation of platform facilities on Windows. **/ // Copyright 1998-2011 by Neil Hodgson // The License.txt file describes the conditions under which this software may be distributed. #ifndef PLATWIN_H #define PLATWIN_H namespace Scintilla { #ifndef USER_DEFAULT_SCREEN_DPI #define USER_DEFAULT_SCREEN_DPI 96 #endif extern void Platform_Initialise(void *hInstance) noexcept; extern void Platform_Finalise(bool fromDllMain) noexcept; constexpr RECT RectFromPRectangle(PRectangle prc) noexcept { RECT rc = { static_cast(prc.left), static_cast(prc.top), static_cast(prc.right), static_cast(prc.bottom) }; return rc; } constexpr POINT POINTFromPoint(Point pt) noexcept { return POINT{ static_cast(pt.x), static_cast(pt.y) }; } constexpr Point PointFromPOINT(POINT pt) noexcept { return Point::FromInts(pt.x, pt.y); } constexpr HWND HwndFromWindowID(WindowID wid) noexcept { return static_cast(wid); } inline HWND HwndFromWindow(const Window &w) noexcept { return HwndFromWindowID(w.GetID()); } void *PointerFromWindow(HWND hWnd) noexcept; void SetWindowPointer(HWND hWnd, void *ptr) noexcept; /// Find a function in a DLL and convert to a function pointer. /// This avoids undefined and conditionally defined behaviour. template T DLLFunction(HMODULE hModule, LPCSTR lpProcName) noexcept { if (!hModule) { return nullptr; } FARPROC function = ::GetProcAddress(hModule, lpProcName); static_assert(sizeof(T) == sizeof(function)); T fp; memcpy(&fp, &function, sizeof(T)); return fp; } // Release an IUnknown* and set to nullptr. // While IUnknown::Release must be noexcept, it isn't marked as such so produces // warnings which are avoided by the catch. template void ReleaseUnknown(T *&ppUnknown) noexcept { if (ppUnknown) { try { ppUnknown->Release(); } catch (...) { // Never occurs } ppUnknown = nullptr; } } UINT DpiForWindow(WindowID wid) noexcept; int SystemMetricsForDpi(int nIndex, UINT dpi) noexcept; HCURSOR LoadReverseArrowCursor(UINT dpi) noexcept; #if defined(USE_D2D) extern bool LoadD2D(); extern ID2D1Factory *pD2DFactory; extern IDWriteFactory *pIDWriteFactory; #endif } #endif