- B1026  [confirmed] win32: setting multiple options
- bugfix: menu: set focus to the item and make it visible when it is
selected  with accelerator key.
- increased menu font size by 1 point
- layout the main window on WM_MOVE message so the menu windows stays with
the main window  (it was not changing the location before)
- got rid of WinCE specific define (ARM)
- handle all keyboard input via WM_KEYDOWN instead WM_CHAR

Files affected: config1.h mhmsg.h mhmain.c mhmenu.c mswproc.c resource.h
winhack.rc

Notes:
 That overrides Yitzhak's mhmenu patch - I don't like the menu prompt on the
title bar since it can be null and in most cases it is. It looks much better
as a header column in the list and is displayed only if present.

I moved ARM-related (processor) defines to wceconf.h  You cannot undef ARM
before windows.h is processed - ARM version won't compile.

.rc files are generated by IDE - you cannot edit them directly or your
changes will be gone next time the file is saved. If anything needs to be
added to winhack.rc file manually it has to be marked by the following
defines or via menu option View->Resource Includes:
#define APSTUDIO_READONLY_SYMBOLS
...
#undef APSTUDIO_READONLY_SYMBOLS
This commit is contained in:
nethack.allison
2002-01-27 23:28:02 +00:00
parent 6e173ddf5f
commit ad2e81c296
8 changed files with 130 additions and 96 deletions

View File

@@ -122,10 +122,6 @@
# define USE_STDARG
# define NEED_VARARGS
/* ARM - the processor; avoids conflict with ARM in hack.h */
# ifdef ARM
# undef ARM
# endif
#endif

View File

@@ -54,7 +54,7 @@ HGDIOBJ mswin_create_font(int win_type, int attr, HDC hdc)
break;
case NHW_MENU:
font_size = (attr==ATR_INVERSE)? 7 : 7;
font_size = (attr==ATR_INVERSE)? 8 : 8;
lgfnt.lfHeight = -font_size*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
lgfnt.lfWidth = 0; // average character width
lgfnt.lfEscapement = 0; // angle of escapement

View File

@@ -79,7 +79,7 @@ void register_main_window_class()
RegisterClass(&wcex);
}
/*
* Keypad keys are translated to the normal values below.
* Shifted keypad keys are translated to the
@@ -87,55 +87,56 @@ void register_main_window_class()
*/
enum KEY_INDEXES {
KEY_NW, KEY_N, KEY_NE, KEY_MINUS,
KEY_W, KEY_STAY, KEY_E, KEY_PLUS,
KEY_SW, KEY_S, KEY_SE,
KEY_INV, KEY_WAITLOOK,
KEY_LAST};
KEY_NW, KEY_N, KEY_NE, KEY_MINUS,
KEY_W, KEY_STAY, KEY_E, KEY_PLUS,
KEY_SW, KEY_S, KEY_SE,
KEY_INV, KEY_WAITLOOK,
KEY_LAST};
static const unsigned char
/* normal, shift, control */
keypad[KEY_LAST][3] = {
{'y', 'Y', C('y')}, /* 7 */
{'k', 'K', C('k')}, /* 8 */
{'u', 'U', C('u')}, /* 9 */
{'m', C('p'), C('p')}, /* - */
{'h', 'H', C('h')}, /* 4 */
{'g', 'g', 'g'}, /* 5 */
{'l', 'L', C('l')}, /* 6 */
{'p', 'P', C('p')}, /* + */
{'b', 'B', C('b')}, /* 1 */
{'j', 'J', C('j')}, /* 2 */
{'n', 'N', C('n')}, /* 3 */
{'i', 'I', C('i')}, /* Ins */
{'.', ':', ':'} /* Del */
}, numpad[KEY_LAST][3] = {
{'7', M('7'), '7'}, /* 7 */
{'8', M('8'), '8'}, /* 8 */
{'9', M('9'), '9'}, /* 9 */
{'m', C('p'), C('p')}, /* - */
{'4', M('4'), '4'}, /* 4 */
{'g', 'G', 'g'}, /* 5 */
{'6', M('6'), '6'}, /* 6 */
{'p', 'P', C('p')}, /* + */
{'1', M('1'), '1'}, /* 1 */
{'2', M('2'), '2'}, /* 2 */
{'3', M('3'), '3'}, /* 3 */
{'i', 'I', C('i')}, /* Ins */
{'.', ':', ':'} /* Del */
static const unsigned char
/* normal, shift, control */
keypad[KEY_LAST][3] = {
{'y', 'Y', C('y')}, /* 7 */
{'k', 'K', C('k')}, /* 8 */
{'u', 'U', C('u')}, /* 9 */
{'m', C('p'), C('p')}, /* - */
{'h', 'H', C('h')}, /* 4 */
{'g', 'g', 'g'}, /* 5 */
{'l', 'L', C('l')}, /* 6 */
{'p', 'P', C('p')}, /* + */
{'b', 'B', C('b')}, /* 1 */
{'j', 'J', C('j')}, /* 2 */
{'n', 'N', C('n')}, /* 3 */
{'i', 'I', C('i')}, /* Ins */
{'.', ':', ':'} /* Del */
},
numpad[KEY_LAST][3] = {
{'7', M('7'), '7'}, /* 7 */
{'8', M('8'), '8'}, /* 8 */
{'9', M('9'), '9'}, /* 9 */
{'m', C('p'), C('p')}, /* - */
{'4', M('4'), '4'}, /* 4 */
{'g', 'G', 'g'}, /* 5 */
{'6', M('6'), '6'}, /* 6 */
{'p', 'P', C('p')}, /* + */
{'1', M('1'), '1'}, /* 1 */
{'2', M('2'), '2'}, /* 2 */
{'3', M('3'), '3'}, /* 3 */
{'i', 'I', C('i')}, /* Ins */
{'.', ':', ':'} /* Del */
};
#define STATEON(x) ((GetKeyState(x) & 0xFFFE) != 0)
#define KEYTABLE(x) ((iflags.num_pad ? numpad : keypad)[x] \
[(STATEON(VK_SHIFT) ? 1 : STATEON(VK_CONTROL) ? 2 : 0)])
[(STATEON(VK_SHIFT) ? 1 : STATEON(VK_CONTROL) ? 2 : 0)])
/*
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
*/
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PNHMainWindow data;
@@ -161,63 +162,73 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
/* translate arrow keys into nethack commands */
switch (wParam)
{
case VK_LEFT:
case VK_LEFT:
NHEVENT_KBD(KEYTABLE(KEY_W));
return 0;
return 0;
case VK_RIGHT:
case VK_RIGHT:
NHEVENT_KBD(KEYTABLE(KEY_E));
return 0;
return 0;
case VK_UP:
case VK_UP:
NHEVENT_KBD(KEYTABLE(KEY_N));
return 0;
return 0;
case VK_DOWN:
case VK_DOWN:
NHEVENT_KBD(KEYTABLE(KEY_S));
return 0;
return 0;
case VK_HOME:
case VK_HOME:
NHEVENT_KBD(KEYTABLE(KEY_NW));
return 0;
return 0;
case VK_END:
case VK_END:
NHEVENT_KBD(KEYTABLE(KEY_SW));
return 0;
return 0;
case VK_PRIOR:
case VK_PRIOR:
NHEVENT_KBD(KEYTABLE(KEY_NE));
return 0;
return 0;
case VK_NEXT:
case VK_NEXT:
NHEVENT_KBD(KEYTABLE(KEY_SE));
return 0;
return 0;
case VK_DECIMAL:
case VK_DELETE:
case VK_DELETE:
NHEVENT_KBD(KEYTABLE(KEY_WAITLOOK));
return 0;
return 0;
case VK_INSERT:
case VK_NUMPAD0:
NHEVENT_KBD(KEYTABLE(KEY_INV));
return 0;
return 0;
case VK_SUBTRACT:
return 0;
NHEVENT_KBD(KEYTABLE(KEY_MINUS));
return 0;
case VK_ADD:
return 0;
NHEVENT_KBD(KEYTABLE(KEY_PLUS));
}
return 1;
} break;
return 0;
case WM_CHAR:
/* all characters go to nethack */
NHEVENT_KBD(wParam);
return 0;
default: {
WORD c[4];
BYTE kbd_state[256];
ZeroMemory(kbd_state, sizeof(kbd_state));
ZeroMemory(c, sizeof(c));
GetKeyboardState(kbd_state);
if( ToAscii( LOWORD(wParam), 0, kbd_state, c, 0)==1 ) {
NHEVENT_KBD(c[0]);
return 0;
} else {
return 1;
}
}
}
} break;
case WM_COMMAND:
/* process commands - menu commands mostly */
@@ -226,6 +237,7 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
else
return 0;
case WM_MOVE:
case WM_SIZE:
mswin_layout_main_window(NULL);
break;

View File

@@ -815,7 +815,7 @@ void nhglyph2charcolor(short g, uchar* ch, int* color)
COLORREF nhcolor_to_RGB(int c)
{
switch(c) {
case CLR_BLACK: return RGB(85, 85, 85);
case CLR_BLACK: return RGB( 85, 85, 85);
case CLR_RED: return RGB(255, 0, 0);
case CLR_GREEN: return RGB( 0, 128, 0);
case CLR_BROWN: return RGB(165, 42, 42);

View File

@@ -7,7 +7,6 @@
#include "mhmain.h"
#include "mhmsg.h"
#include "mhfont.h"
#include <commctrl.h>
#define MENU_MARGIN 0
#define NHMENU_STR_SIZE BUFSZ
@@ -35,6 +34,7 @@ typedef struct mswin_nethack_menu_window {
PNHMenuItem items; /* menu items */
char gacc[QBUFSZ]; /* group accelerators */
BOOL counting; /* counting flag */
char prompt[QBUFSZ]; /* menu prompt */
} menu;
struct menu_text {
@@ -468,6 +468,17 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
data->menu.size++;
} break;
case MSNH_MSG_ENDMENU:
{
PMSNHMsgEndMenu msg_data = (PMSNHMsgEndMenu)lParam;
if( msg_data->text ) {
strncpy( data->menu.prompt, msg_data->text, sizeof(data->menu.prompt)-1 );
} else {
ZeroMemory(data->menu.prompt, sizeof(data->menu.prompt));
}
} break;
}
}
@@ -558,22 +569,26 @@ void SetMenuListType(HWND hWnd, int how)
switch(how) {
case PICK_NONE:
dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD
| WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_NOCOLUMNHEADER
| WS_VSCROLL | WS_HSCROLL | LVS_REPORT
| LVS_OWNERDRAWFIXED | LVS_SINGLESEL;
break;
case PICK_ONE:
dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD
| WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_NOCOLUMNHEADER
| WS_VSCROLL | WS_HSCROLL | LVS_REPORT
| LVS_OWNERDRAWFIXED | LVS_SINGLESEL;
break;
case PICK_ANY:
dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD
| WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_NOCOLUMNHEADER
| WS_VSCROLL | WS_HSCROLL | LVS_REPORT
| LVS_OWNERDRAWFIXED | LVS_SINGLESEL;
break;
default: panic("how should be one of PICK_NONE, PICK_ONE or PICK_ANY");
};
if( strlen(data->menu.prompt)==0 ) {
dwStyles |= LVS_NOCOLUMNHEADER ;
}
GetWindowRect(GetDlgItem(hWnd, IDC_MENU_LIST), &rt);
DestroyWindow(GetDlgItem(hWnd, IDC_MENU_LIST));
control = CreateWindow(WC_LISTVIEW, NULL,
@@ -598,8 +613,9 @@ void SetMenuListType(HWND hWnd, int how)
/* add column to the list view */
ZeroMemory(&lvcol, sizeof(lvcol));
lvcol.mask = LVCF_WIDTH;
lvcol.cx = 1024;
lvcol.mask = LVCF_WIDTH | LVCF_TEXT;
lvcol.cx = GetSystemMetrics(SM_CXFULLSCREEN);
lvcol.pszText = NH_A2W(data->menu.prompt, wbuf, BUFSZ);
ListView_InsertColumn(control, 0, &lvcol);
/* add items to the list view */
@@ -926,6 +942,8 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
i,
-1
);
ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED);
ListView_EnsureVisible(hwndList, i, FALSE);
break;
}
}
@@ -1021,6 +1039,7 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1
);
ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED);
ListView_EnsureVisible(hwndList, i, FALSE);
return -2;
} else if( data->how == PICK_ONE ) {
SelectMenuItem(
@@ -1060,7 +1079,7 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA);
if(data && data->type==MENU_TYPE_MENU ) {
hdc = GetDC(GetMenuControl(hWnd));
saveFont = SelectObject(hdc, mswin_create_font(NHW_MENU, ATR_INVERSE, hdc));
saveFont = SelectObject(hdc, mswin_create_font(NHW_MENU, ATR_NONE, hdc));
GetTextMetrics(hdc, &tm);
/* Set the height of the list box items. */

View File

@@ -15,6 +15,7 @@
#define MSNH_MSG_STARTMENU 105
#define MSNH_MSG_ADDMENU 106
#define MSNH_MSG_CURSOR 107
#define MSNH_MSG_ENDMENU 108
typedef struct mswin_nhmsg_add_wnd {
winid wid;
@@ -51,4 +52,8 @@ typedef struct mswin_nhmsg_cursor {
int y;
} MSNHMsgCursor, *PMSNHMsgCursor;
typedef struct mswin_nhmsg_end_menu {
const char* text;
} MSNHMsgEndMenu, *PMSNHMsgEndMenu;
#endif

View File

@@ -580,15 +580,18 @@ end_menu(window, prompt)
*/
void mswin_end_menu(winid wid, const char *prompt)
{
TCHAR wbuf[255];
logDebug("mswin_end_menu(%d, %s)\n", wid, prompt);
if ((wid >= 0) &&
if ((wid >= 0) &&
(wid < MAXWINDOWS) &&
(GetNHApp()->windowlist[wid].win != NULL))
{
SetWindowText (
GetNHApp()->windowlist[wid].win,
NH_A2W(prompt, wbuf ,sizeof(wbuf))
MSNHMsgEndMenu data;
ZeroMemory(&data, sizeof(data));
data.text = prompt;
SendMessage(
GetNHApp()->windowlist[wid].win,
WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_ENDMENU, (LPARAM)&data
);
}
}

View File

@@ -1,9 +1,5 @@
//Microsoft Developer Studio generated resource script.
//
#if defined(__BORLANDC__)
LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US
#endif
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
@@ -11,6 +7,9 @@ LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US
//
// Generated from the TEXTINCLUDE 2 resource.
//
#if defined(__BORLANDC__)
LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
@@ -42,7 +41,7 @@ IDI_NETHACKW ICON DISCARDABLE "NETHACK.ICO"
// Menu
//
IDC_NETHACKW MENU DISCARDABLE
IDC_NETHACKW MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
@@ -85,7 +84,7 @@ END
// Accelerator
//
IDC_NETHACKW ACCELERATORS MOVEABLE PURE
IDC_NETHACKW ACCELERATORS MOVEABLE PURE
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
@@ -110,7 +109,7 @@ END
IDD_NHTEXT DIALOGEX 0, 0, 172, 178
STYLE DS_SETFOREGROUND | WS_POPUP | WS_THICKFRAME
EXSTYLE WS_EX_STATICEDGE
FONT 8, "MS Sans Serif"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,54,163,50,14
EDITTEXT IDC_TEXT_CONTROL,0,0,170,160,ES_MULTILINE |
@@ -118,12 +117,9 @@ BEGIN
END
IDD_MENU DIALOGEX 0, 0, 187, 153
STYLE WS_POPUP | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_CAPTION
STYLE WS_POPUP | WS_CLIPSIBLINGS | WS_THICKFRAME
EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE
FONT 8, "MS Sans Serif"
#ifndef __BORLANDC__
, 0, 0, 0x1
#endif
BEGIN
DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT
PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT
@@ -193,6 +189,9 @@ END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#if defined(__BORLANDC__)\r\n"
"LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US\r\n"
"#endif\r\n"
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"