diff options
| author | trustable-code <krauter.simon@arcor.de> | 2019-09-24 23:16:30 +0200 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2019-09-24 23:16:30 +0200 |
| commit | f2b9ff937dc95590823e604b293240a0f8caefd3 (patch) | |
| tree | 398226d73cda0dd5e56b32716dba99b418625ace /src/nigui | |
| parent | a6fddee74829556453b7df6a47ae50a18ac7c368 (diff) | |
| download | NiGui-f2b9ff937dc95590823e604b293240a0f8caefd3.tar.gz NiGui-f2b9ff937dc95590823e604b293240a0f8caefd3.zip | |
Windows: Use more Unicode functions instead ANSI functions
Probably fixes #59
Diffstat (limited to 'src/nigui')
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 31 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 23 |
2 files changed, 23 insertions, 31 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index 3fcfc0e..1d1173d 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -118,8 +118,8 @@ proc pGetClientRect(wnd: pointer): Rect = proc pGetWindowRect(wnd: pointer): Rect = if not GetWindowRect(wnd, result): pRaiseLastOSError() -proc pCreateWindowEx(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer = - result = CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) +proc pCreateWindowEx(dwExStyle: int32, lpClassName: string, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer = + result = CreateWindowExW(dwExStyle, lpClassName.pUtf8ToUtf16, nil, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) if result == nil: pRaiseLastOSError() proc pGetWindowLongPtr(hWnd: pointer, nIndex: int32): pointer = @@ -138,8 +138,8 @@ proc pSetWindowLongPtr(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointe # result = GetStockObject(fnObject) # if result == nil: pRaiseLastOSError() -proc pCreateWindowExWithUserdata(lpClassName: cstring, dwStyle, dwExStyle: int32, hWndParent, userdata: pointer = nil): pointer = - result = pCreateWindowEx(dwExStyle, lpClassName, nil, dwStyle, 0, 0, 0, 0, hWndParent, nil, nil, nil) +proc pCreateWindowExWithUserdata(lpClassName: string, dwStyle, dwExStyle: int32, hWndParent, userdata: pointer = nil): pointer = + result = pCreateWindowEx(dwExStyle, lpClassName, dwStyle, 0, 0, 0, 0, hWndParent, nil, nil, nil) if userdata != nil: discard pSetWindowLongPtr(result, GWLP_USERDATA, userdata) # Set default font: @@ -164,15 +164,15 @@ proc pEnableVisualStyles() = # var ulpActivationCookie = false # if not ActivateActCtx(context, ulpActivationCookie.addr): pRaiseLastOSError() -proc pRegisterWindowClass(className: cstring, wndProc: pointer, style: int32 = 0) = +proc pRegisterWindowClass(className: string, wndProc: pointer, style: int32 = 0) = var class: WndClassEx class.cbSize = WndClassEx.sizeof.int32 - class.lpszClassName = className + class.lpszClassName = className.pUtf8ToUtf16 class.lpfnWndProc = wndProc class.style = style class.hCursor = LoadCursorA(nil, cast[cstring](IDC_ARROW)) class.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)) # default background - if RegisterClassExA(class) == 0: pRaiseLastOSError() + if RegisterClassExW(class) == 0: pRaiseLastOSError() proc pCommonWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.} = case uMsg @@ -189,7 +189,7 @@ proc pCommonWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe return CreateSolidBrush(control.backgroundColor.pColorToRGB32) else: discard - result = DefWindowProcA(hWnd, uMsg, wParam, lParam) + result = DefWindowProcW(hWnd, uMsg, wParam, lParam) proc pWMParamsToKey(wParam, lParam: pointer): Key = case cast[int32](wParam) @@ -406,7 +406,7 @@ proc init(app: App) = pRegisterWindowClass(pTopLevelWindowClass, pWindowWndProc) pRegisterWindowClass(pCustomControlWindowClass, pCustomControlWndProc, CS_HREDRAW or CS_VREDRAW) pRegisterWindowClass(pContainerWindowClass, pContainerWndProc) - pDefaultParentWindow = pCreateWindowEx(0, pTopLevelWindowClass, nil, 0, 0, 0, 0, 0, nil, nil, nil, nil) + pDefaultParentWindow = pCreateWindowEx(0, pTopLevelWindowClass, 0, 0, 0, 0, 0, nil, nil, nil, nil) app.defaultTextColor = GetSysColor(COLOR_WINDOWTEXT).pRgb32ToColor() app.defaultBackgroundColor = GetSysColor(COLOR_BTNFACE).pRgb32ToColor() app.defaultFontFamily = "Arial" @@ -415,15 +415,15 @@ proc init(app: App) = proc runMainLoop() = var msg: Msg - while GetMessageA(msg.addr, nil, 0, 0): + while GetMessageW(msg.addr, nil, 0, 0): discard TranslateMessage(msg.addr) - discard DispatchMessageA(msg.addr) + discard DispatchMessageW(msg.addr) proc processEvents(app: App) = var msg: Msg - while PeekMessageA(msg.addr, nil, 0, 0, PM_REMOVE): + while PeekMessageW(msg.addr, nil, 0, 0, PM_REMOVE): discard TranslateMessage(msg.addr) - discard DispatchMessageA(msg.addr) + discard DispatchMessageW(msg.addr) proc clipboardText(app: App): string = if not OpenClipboard(nil): @@ -892,7 +892,7 @@ method `y=`(window: WindowImpl, y: int) = method centerOnScreen(window: WindowImpl) = let desktop = GetDesktopWindow() var rect: Rect - discard SystemParametersInfoA(SPI_GETWORKAREA, 0, rect.addr, 0) + discard SystemParametersInfoW(SPI_GETWORKAREA, 0, rect.addr, 0) window.fX = rect.left + (rect.right - window.width) div 2 window.fY = rect.top + (rect.bottom - window.height) div 2 window.pUpdatePosition() @@ -1054,7 +1054,7 @@ proc pUpdateFont(control: ControlImpl) = 700 else: 400 - control.fFont = CreateFontA(control.fontSize.int32, 0, 0, 0, fontWeight, 0, 0, 0, 0, 0, 0, 0, 0, control.fontFamily) + control.fFont = CreateFontW(control.fontSize.int32, 0, 0, 0, fontWeight, 0, 0, 0, 0, 0, 0, 0, 0, control.fontFamily.pUtf8ToUtf16) discard SendMessageA(control.fHandle, WM_SETFONT, control.fFont, cast[pointer](true)) method setFontFamily(control: ControlImpl, fontFamily: string) = @@ -1449,7 +1449,6 @@ method `checked=`(checkbox: NativeCheckbox, checked: bool) = discard SendMessageA(checkbox.fHandle, BM_SETCHECK, cast[pointer](BST_CHECKED), nil) else: discard SendMessageA(checkbox.fHandle, BM_SETCHECK, cast[pointer](BST_UNCHECKED), nil) - # app.processEvents # ---------------------------------------------------------------------------------------- diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim index df9e75a..7c2a76a 100755 --- a/src/nigui/private/windows/windows.nim +++ b/src/nigui/private/windows/windows.nim @@ -383,26 +383,22 @@ proc GlobalAlloc*(uFlags, dwBytes: int32): pointer {.importc: "GlobalAlloc", lib # User32 Procs # ---------------------------------------------------------------------------------------- -proc MessageBoxA*(hWnd: pointer, lpText, lpCaption: cstring, uType: int) {.importc: "MessageBoxA", libUser32.} proc MessageBoxW*(hWnd: pointer, lpText, lpCaption: cstring, uType: int) {.importc: "MessageBoxW", libUser32.} -proc RegisterClassExA*(lpwcx: var WndClassEx): int16 {.importc: "RegisterClassExA", libUser32.} -proc CreateWindowExA*(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer {.importc: "CreateWindowExA", libUser32.} +proc RegisterClassExW*(lpwcx: var WndClassEx): int16 {.importc: "RegisterClassExW", libUser32.} +proc CreateWindowExW*(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer {.importc: "CreateWindowExW", libUser32.} proc DestroyWindow*(hWnd: pointer): bool {.importc: "DestroyWindow", libUser32.} proc ShowWindow*(hWnd: pointer, nCmdShow: int32): bool {.importc: "ShowWindow", libUser32.} proc EnableWindow*(hWnd: pointer, bEnable: bool): bool {.importc: "EnableWindow", libUser32.} -proc DefWindowProcA*(hWnd: pointer, uMsg: int, wParam, lParam: pointer): pointer {.importc: "DefWindowProcA", libUser32.} -proc GetMessageA*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax: int32): bool {.importc: "GetMessageA", libUser32.} -proc PeekMessageA*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax, wRemoveMsg: int32): bool {.importc: "PeekMessageA", libUser32.} +proc DefWindowProcW*(hWnd: pointer, uMsg: int, wParam, lParam: pointer): pointer {.importc: "DefWindowProcW", libUser32.} +proc GetMessageW*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax: int32): bool {.importc: "GetMessageW", libUser32.} +proc PeekMessageW*(lpMsg, hWnd: pointer, wMsgFilterMin, wMsgFilterMax, wRemoveMsg: int32): bool {.importc: "PeekMessageW", libUser32.} proc TranslateMessage*(lpMsg: pointer): bool {.importc: "TranslateMessage", libUser32.} -proc DispatchMessageA*(lpMsg: pointer): pointer {.importc: "DispatchMessageA", libUser32.} +proc DispatchMessageW*(lpMsg: pointer): pointer {.importc: "DispatchMessageW", libUser32.} proc SetParent*(hWndChild, hWndNewParent: pointer): pointer {.importc: "SetParent", libUser32.} proc SetWindowLongA*(hWnd: pointer, nIndex, dwNewLong: int32): int32 {.importc: "SetWindowLongA", libUser32.} proc GetWindowLongA*(hWnd: pointer, nIndex: int32): int32 {.importc: "GetWindowLongA", libUser32.} -proc SetWindowTextA*(hWnd: pointer, lpString: cstring): bool {.importc: "SetWindowTextA", libUser32.} proc SetWindowTextW*(hWnd: pointer, lpString: cstring): bool {.importc: "SetWindowTextW", libUser32.} -# proc GetWindowTextA*(hWnd: pointer, lpString: cstring, nMaxCount: int32): int32 {.importc: "GetWindowTextA", libUser32.} proc GetWindowTextW*(hWnd: pointer, lpString: cstring, nMaxCount: int32): int32 {.importc: "GetWindowTextW", libUser32.} -# proc GetWindowTextLengthA*(hWnd: pointer): int32 {.importc: "GetWindowTextLengthA", libUser32.} proc GetWindowTextLengthW*(hWnd: pointer): int32 {.importc: "GetWindowTextLengthW", libUser32.} proc UpdateWindow*(hWnd: pointer): bool {.importc: "UpdateWindow", libUser32.} proc SetWindowPos*(wnd, hWndInsertAfter: pointer, x, y, cx, cy: int32, uFlags: int): bool {.importc: "SetWindowPos", libUser32.} @@ -413,13 +409,12 @@ proc GetClientRect*(wnd: pointer, lpRect: var Rect): bool {.importc: "GetClientR proc BeginPaint*(hWnd: pointer, lpPaint: var PaintStruct): pointer {.importc: "BeginPaint", libUser32.} proc EndPaint*(hWnd: pointer, lpPaint: var PaintStruct): bool {.importc: "EndPaint", libUser32.} proc SendMessageA*(hWnd: pointer, msg: int32, wParam, lParam: pointer): pointer {.importc: "SendMessageA", libUser32.} -# proc SendMessageW*(hWnd: pointer, msg: int32, wParam, lParam: pointer): pointer {.importc: "SendMessageW", libUser32.} proc PostMessageA*(hWnd: pointer, msg: int32, wParam, lParam: pointer): pointer {.importc: "PostMessageA", libUser32.} proc GetSysColor*(nIndex: int32): RGB32 {.importc: "GetSysColor", libUser32.} proc InvalidateRect*(hWnd: pointer, lpRect: ref Rect, bErase: bool): bool {.importc: "InvalidateRect", libUser32.} proc PostQuitMessage*(nExitCode: int32) {.importc: "PostQuitMessage", libUser32.} proc GetDesktopWindow*(): pointer {.importc: "GetDesktopWindow", libUser32.} -proc SystemParametersInfoA*(uiAction, uiParam: int32, pvParam: pointer, fWinIni: int32): bool {.importc: "SystemParametersInfoA", libUser32.} +proc SystemParametersInfoW*(uiAction, uiParam: int32, pvParam: pointer, fWinIni: int32): bool {.importc: "SystemParametersInfoW", libUser32.} proc ClientToScreen*(hWnd: pointer, lpPoint: var Point): bool {.importc: "ClientToScreen", libUser32.} proc AdjustWindowRect*(lpRect: var Rect, dwStyle: int32, bMenu: bool): bool {.importc: "AdjustWindowRect", libUser32.} proc LoadCursorA*(hInstance: pointer, lpCursorName: cstring): pointer {.importc: "LoadCursorA", libUser32.} @@ -455,12 +450,10 @@ when defined(cpu64): # Only available on 64-bit Windows: proc GetWindowLongPtrW*(hWnd: pointer, nIndex: int32): pointer {.importc: "GetWindowLongPtrW", libUser32.} proc SetWindowLongPtrW*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetWindowLongPtrW", libUser32.} - # proc SetClassLongPtrA*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetClassLongPtrA", libUser32.} else: # Should only be used on 32-bit Windows: proc GetWindowLongW*(hWnd: pointer, nIndex: int32): pointer {.importc: "GetWindowLongW", libUser32.} proc SetWindowLongW*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetWindowLongW", libUser32.} - # proc SetClassLongA*(hWnd: pointer, nIndex: int32, dwNewLong: pointer): pointer {.importc: "SetClassLongA", libUser32.} # ---------------------------------------------------------------------------------------- @@ -475,7 +468,7 @@ proc TextOutW*(hdc: pointer, nXStart, nYStart: int32, lpString: cstring, cchStri proc CreateSolidBrush*(crColor: RGB32): pointer {.importc: "CreateSolidBrush", libGdi32.} proc CreatePen*(fnPenStyle, nWidth: int32, crColor: RGB32): pointer {.importc: "CreatePen", libGdi32.} # proc GetStockObject*(fnObject: int32): pointer {.importc: "GetStockObject", libGdi32.} -proc CreateFontA*(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily: int32, lpszFace: cstring): pointer {.importc: "CreateFontA", libGdi32.} +proc CreateFontW*(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily: int32, lpszFace: cstring): pointer {.importc: "CreateFontW", libGdi32.} proc GetTextExtentPoint32W*(hdc: pointer, lpString: cstring, c: int32, lpSize: var Size): bool {.importc: "GetTextExtentPoint32W", libGdi32.} proc SetBkMode*(hdc: pointer, iBkMode: int32): int32 {.importc: "SetBkMode", libGdi32.} proc SetTextColor*(hdc: pointer, crColor: RGB32): RGB32 {.importc: "SetTextColor", libGdi32.} |
