diff options
| author | trustable-code <krauter.simon@arcor.de> | 2018-09-24 20:22:14 +0200 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2018-09-24 20:22:14 +0200 |
| commit | 38137043869f21d188fc42851d71aa1af005ac9e (patch) | |
| tree | cbb0d5c2e592288217067a302396ff45325bfbb2 /src | |
| parent | 89a4ecc77c7833671913dbc7923db5329f22c447 (diff) | |
| download | NiGui-38137043869f21d188fc42851d71aa1af005ac9e.tar.gz NiGui-38137043869f21d188fc42851d71aa1af005ac9e.zip | |
Improve control focus under Windows
- Focused buttons are now highlighted
- A windows saves its focused control and restores it when the window is
focused
Diffstat (limited to 'src')
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 30 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_types1.nim | 1 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 2 |
3 files changed, 22 insertions, 11 deletions
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index 1b36d10..b7954f3 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -307,9 +307,10 @@ proc pWindowWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe window.fY = rect.top # echo "WM_MOVE: " & $rect.left & ", " & $rect.top of WM_SETFOCUS: - discard - #echo "window WM_SETFOCUS" - # not called? + # Re-focus last focused control + let window = cast[WindowImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) + if window.fFocusedControl != nil: + window.fFocusedControl.focus() of WM_KILLFOCUS: internalAllKeysUp() of WM_DROPFILES: @@ -1105,6 +1106,12 @@ proc pCommonControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): control.handleClickEvent(clickEvent) of WM_HSCROLL, WM_VSCROLL: pCommonControlWndProc_Scroll(hWnd, uMsg, wParam, lParam) + + of WM_SETFOCUS: + # Save focused control + let control = cast[ControlImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) + control.parentWindow().fFocusedControl = control + else: discard @@ -1172,9 +1179,6 @@ proc pCustomControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): echo "wheel: " & $scrolled of WM_ERASEBKGND: return cast[pointer](true) # Allow flicker-free drawing - of WM_SETFOCUS: - # echo "control WM_SETFOCUS" - discard else: discard let comProcRes = pCommonControlWndProc(hWnd, uMsg, wParam, lParam) @@ -1280,11 +1284,15 @@ method getPadding(frame: NativeFrame): Spacing = var pButtonOrigWndProc: pointer proc pButtonWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.} = - # case uMsg - # of WM_KEYDOWN: - # let button = cast[Button](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) - # else: - # discard + case uMsg + of WM_SETFOCUS: + let button = cast[Button](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) + discard SendMessageA(button.fHandle, BM_SETSTYLE, cast[pointer](BS_DEFPUSHBUTTON), nil) + of WM_KILLFOCUS: + let button = cast[Button](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) + discard SendMessageA(button.fHandle, BM_SETSTYLE, cast[pointer](0), nil) + else: + discard let comProcRes = pCommonControlWndProc(hWnd, uMsg, wParam, lParam) if comProcRes == PWndProcResult_False: return cast[pointer](false) diff --git a/src/nigui/private/windows/platform_types1.nim b/src/nigui/private/windows/platform_types1.nim index 52470d4..9b99df8 100755 --- a/src/nigui/private/windows/platform_types1.nim +++ b/src/nigui/private/windows/platform_types1.nim @@ -8,6 +8,7 @@ type WindowImpl* = ref object of Window
fHandle: pointer
fModalParent: WindowImpl
+ fFocusedControl: ControlImpl
ControlImpl* = ref object of Control
fHandle: pointer
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim index f88c510..70f3153 100755 --- a/src/nigui/private/windows/windows.nim +++ b/src/nigui/private/windows/windows.nim @@ -35,7 +35,9 @@ const ACTCTX_FLAG_RESOURCE_NAME_VALID* = 8 ACTCTX_FLAG_SET_PROCESS_DEFAULT* = 16 BN_CLICKED* = 0 + BM_SETSTYLE* = 244 BM_SETIMAGE* = 247 + BS_DEFPUSHBUTTON* = 0x00000001 BS_GROUPBOX* = 0x00000007 CF_TEXT* = 1 COLOR_BTNFACE* = 15 |
