summaryrefslogtreecommitdiff
path: root/src/nigui/private/windows
diff options
context:
space:
mode:
authorSimon Krauter <simon.krauter@dbaudio.com>2019-07-26 10:27:00 +0200
committerSimon Krauter <simon.krauter@dbaudio.com>2019-07-26 10:27:00 +0200
commit6a39cee5037f0ca7ceaea499967efa456fb8f4b1 (patch)
treeda1a2da4c19545c9328a2fabcf5b84a5157831c4 /src/nigui/private/windows
parentbb09bfa401fd8bf435ebbde844a3ba765b153a05 (diff)
downloadNiGui-6a39cee5037f0ca7ceaea499967efa456fb8f4b1.tar.gz
NiGui-6a39cee5037f0ca7ceaea499967efa456fb8f4b1.zip
Implemented High-DPI support for Windows.
Applications should use ``scaleToDpi()`` to convert pixel numbers from 96 DPI to system DPI.
Diffstat (limited to 'src/nigui/private/windows')
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim7
-rwxr-xr-xsrc/nigui/private/windows/windows.nim13
2 files changed, 17 insertions, 3 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index a84ffbd..6a04c46 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -17,7 +17,6 @@ import tables
const pTopLevelWindowClass = "1"
const pContainerWindowClass = "2"
const pCustomControlWindowClass = "3"
-
var pDefaultParentWindow: pointer
var pKeyState: KeyState
var pKeyDownKey: Key
@@ -37,7 +36,7 @@ proc pCheckGdiplusStatus(status: int32, showAlert = true) =
pRaiseLastOSError(showAlert)
else:
raiseError("A GDI+ error occured. (Status: " & $status & ")", showAlert)
-
+
proc pColorToRGB32(color: Color): RGB32 =
result.red = color.red
result.green = color.green
@@ -379,6 +378,10 @@ proc init(app: App) =
app.defaultBackgroundColor = GetSysColor(COLOR_BTNFACE).pRgb32ToColor()
app.defaultFontFamily = "Arial"
fScrollbarSize = GetSystemMetrics(SM_CXVSCROLL)
+ # High DPI support:
+ discard SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE)
+ fSystemDpi = GetDpiForWindow(pDefaultParentWindow)
+ fDefaultFontSize = defaultFontSizeForDefaultDpi.scaleToDpi
proc runMainLoop() =
var msg: Msg
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index f35e603..e43bc56 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -24,6 +24,7 @@
{.pragma: libShell32, stdcall, dynlib: "Shell32.dll".}
{.pragma: libGdiplus, stdcall, dynlib: "Gdiplus.dll".}
{.pragma: libComdlg32, stdcall, dynlib: "Comdlg32.dll".}
+{.pragma: libShcore, stdcall, dynlib: "Shcore.dll".}
# ----------------------------------------------------------------------------------------
@@ -190,7 +191,9 @@ const
PixelFormat32bppARGB* = 2498570
ImageLockModeWrite* = 2
MAPVK_VSC_TO_VK_EX* = 3
-
+ PROCESS_DPI_UNAWARE* = 0
+ PROCESS_SYSTEM_DPI_AWARE* = 1
+ PROCESS_PER_MONITOR_DPI_AWARE* = 2
# ----------------------------------------------------------------------------------------
@@ -428,6 +431,7 @@ proc GetClipboardData*(uFormat: int32): pointer {.importc: "GetClipboardData", l
proc SetClipboardData*(uFormat: int32, hMem: pointer): pointer {.importc: "SetClipboardData", libUser32.}
proc EmptyClipboard*(): bool {.importc: "EmptyClipboard", libUser32.}
proc MapVirtualKeyW*(uCode, uMapType: int32): int32 {.importc: "MapVirtualKeyW", libUser32.}
+proc GetDpiForWindow*(hWnd: pointer): int32 {.importc: "GetDpiForWindow", libUser32.}
when defined(cpu64):
# Only available on 64-bit Windows:
@@ -523,3 +527,10 @@ proc CommDlgExtendedError*(): int32 {.importc: "CommDlgExtendedError", libComdlg
proc GetOpenFileNameW*(lpofn: var OpenFileName): bool {.importc: "GetOpenFileNameW", libComdlg32.}
proc GetSaveFileNameW*(lpofn: var OpenFileName): bool {.importc: "GetSaveFileNameW", libComdlg32.}
+
+# ----------------------------------------------------------------------------------------
+# Comdlg32 Procs
+# ----------------------------------------------------------------------------------------
+
+proc SetProcessDpiAwareness*(value: int32): int32 {.importc: "SetProcessDpiAwareness", libShcore.}
+