applied patch #1871856 - nsDialogs: support for keyboard cues for link control

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5482 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2008-01-18 13:45:25 +00:00
parent 26d527f8e4
commit ae3e2cff89

View file

@ -5,6 +5,14 @@
#include "input.h"
#include "rtl.h"
#ifndef ODS_NOACCEL
#define ODS_NOACCEL 0x0100
#define ODS_NOFOCUSRECT 0x0200
#endif
#ifndef DT_HIDEPREFIX
#define DT_HIDEPREFIX 0x00100000
#endif
HINSTANCE g_hInstance;
struct nsDialog g_dialog;
extra_parameters* g_pluginParms;
@ -115,6 +123,13 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
RECT rc;
char text[1024];
// http://blogs.msdn.com/oldnewthing/archive/2005/05/03/414317.aspx#414357
// says we should call SystemParametersInfo(SPI_GETKEYBOARDCUES,...) to make
// sure, does not seem to be required, might be a win2k bug, or it might
// only apply to menus
BOOL hideFocus = (lpdis->itemState & ODS_NOFOCUSRECT);
BOOL hideAccel = (lpdis->itemState & ODS_NOACCEL);
struct nsControl* ctl = GetControl(lpdis->hwndItem);
if (ctl == NULL)
break;
@ -141,20 +156,23 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (lpdis->itemAction & ODA_DRAWENTIRE)
{
DWORD xtraDrawStyle = (g_dialog.rtl ? DT_RTLREADING : 0);
if (hideAccel)
xtraDrawStyle |= DT_HIDEPREFIX;
// Get TxtColor unless the user has set another using SetCtlColors
if (!GetWindowLong(lpdis->hwndItem, GWL_USERDATA))
SetTextColor(lpdis->hDC, RGB(0,0,255));
// Draw the text
DrawText(lpdis->hDC, text, -1, &rc, DT_CENTER | DT_VCENTER | DT_WORDBREAK | (g_dialog.rtl ? DT_RTLREADING : 0));
DrawText(lpdis->hDC, text, -1, &rc, xtraDrawStyle | DT_CENTER | DT_VCENTER | DT_WORDBREAK);
}
// Draw the focus rect if needed
if (((lpdis->itemState & ODS_FOCUS) && (lpdis->itemAction & ODA_DRAWENTIRE)) || (lpdis->itemAction & ODA_FOCUS))
{
// NB: when not in DRAWENTIRE mode, this will actually toggle the focus
// rectangle since it's drawn in a XOR way
DrawFocusRect(lpdis->hDC, &rc);
if (!hideFocus)
DrawFocusRect(lpdis->hDC, &rc);
}
return TRUE;