- hide the keyboard focus when appropriate

- add missing definitions to w32api

svn path=/trunk/; revision=16408
This commit is contained in:
Thomas Bluemel 2005-07-04 13:21:14 +00:00
parent 0140b609d9
commit 8e3b9a7f21
2 changed files with 65 additions and 4 deletions

View file

@ -50,6 +50,7 @@ typedef struct _CHECKLISTWND
PCHECKITEM FocusedCheckItem;
UINT FocusedCheckItemBox;
BOOL FocusedPushed;
BOOL FocusVisible;
COLORREF TextColor[2];
UINT CheckBoxLeft[2];
@ -840,7 +841,7 @@ PaintControl(IN PCHECKLISTWND infoPtr,
((Item->State & CIS_ALLOW) ? DFCS_CHECKED : 0) |
(IsPushed ? DFCS_PUSHED : 0));
}
if (Item == infoPtr->FocusedCheckItem &&
if (Item == infoPtr->FocusedCheckItem && infoPtr->FocusVisible &&
infoPtr->HasFocus &&
infoPtr->FocusedCheckItemBox != CLB_DENY)
{
@ -895,7 +896,7 @@ PaintControl(IN PCHECKLISTWND infoPtr,
((Item->State & CIS_DENY) ? DFCS_CHECKED : 0) |
(IsPushed ? DFCS_PUSHED : 0));
}
if (infoPtr->HasFocus &&
if (infoPtr->HasFocus && infoPtr->FocusVisible &&
Item == infoPtr->FocusedCheckItem &&
infoPtr->FocusedCheckItemBox == CLB_DENY)
{
@ -995,8 +996,8 @@ UpdateCheckItemBox(IN PCHECKLISTWND infoPtr,
rcUpdate.left = rcClient.left + infoPtr->CheckBoxLeft[ItemBox] - (infoPtr->ItemHeight / 2);
rcUpdate.right = rcUpdate.left + infoPtr->ItemHeight;
rcUpdate.top = ((Index - VisibleFirst) * infoPtr->ItemHeight) + CI_TEXT_MARGIN_HEIGHT;
rcUpdate.bottom = rcUpdate.top + infoPtr->ItemHeight - (2 * CI_TEXT_MARGIN_HEIGHT);
rcUpdate.top = ((Index - VisibleFirst) * infoPtr->ItemHeight);
rcUpdate.bottom = rcUpdate.top + infoPtr->ItemHeight;
RedrawWindow(infoPtr->hSelf,
&rcUpdate,
@ -1727,6 +1728,15 @@ CheckListWndProc(IN HWND hwnd,
Shift,
&NewFocusBox);
if (!infoPtr->FocusVisible)
{
/* change the UI status */
SendMessage(GetAncestor(hwnd, GA_ROOT),
WM_CHANGEUISTATE,
MAKEWPARAM(UIS_INITIALIZE, UISF_HIDEFOCUS),
0);
}
ChangeCheckItemFocus(infoPtr,
NewFocus,
NewFocusBox);
@ -1852,6 +1862,35 @@ CheckListWndProc(IN HWND hwnd,
TRUE);
break;
}
case WM_UPDATEUISTATE:
{
BOOL OldFocusVisible = infoPtr->FocusVisible;
switch(LOWORD(wParam))
{
case UIS_CLEAR:
{
infoPtr->FocusVisible = (HIWORD(wParam) & UISF_HIDEFOCUS);
break;
}
case UIS_SET:
case UIS_INITIALIZE:
{
infoPtr->FocusVisible = !(HIWORD(wParam) & UISF_HIDEFOCUS);
break;
}
}
if (infoPtr->FocusVisible != OldFocusVisible &&
infoPtr->FocusedCheckItem != NULL)
{
UpdateCheckItemBox(infoPtr,
infoPtr->FocusedCheckItem,
infoPtr->FocusedCheckItemBox);
}
break;
}
case WM_CREATE:
{
@ -1908,6 +1947,11 @@ CheckListWndProc(IN HWND hwnd,
infoPtr->ThemeHandle = NULL;
}
#endif
infoPtr->FocusVisible = !(SendMessage(hwnd,
WM_QUERYUISTATE,
0,
0) & UISF_HIDEFOCUS);
}
else
{

View file

@ -1316,7 +1316,24 @@ extern "C" {
#define WM_CANCELMODE 31
#define WM_CAPTURECHANGED 533
#define WM_CHANGECBCHAIN 781
#if (WINVER >= 0x0500)
#define WM_CHANGEUISTATE 295
#define WM_UPDATEUISTATE 296
#define WM_QUERYUISTATE 297
#define UIS_SET 1
#define UIS_CLEAR 2
#define UIS_INITIALIZE 3
#define UISF_HIDEFOCUS 0x1
#define UISF_HIDEACCEL 0x2
#if (WINVER >= 0x0501)
#define UISF_ACTIVE 0x4
#endif
#endif
#define WM_CHAR 258
#define WM_CHARTOITEM 47
#define WM_CHILDACTIVATE 34