RegisterClass(&wcex);
}
-
+
/*
* Keypad keys are translated to the normal values below.
* Shifted keypad keys are translated to the
*/
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};
-
- 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 */
+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 */
};
#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;
/* 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;
+ 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_CHAR:
- /* all characters go to nethack */
- NHEVENT_KBD(wParam);
- return 0;
-
case WM_COMMAND:
/* process commands - menu commands mostly */
if( onWMCommand(hWnd, wParam, lParam) )
else
return 0;
+ case WM_MOVE:
case WM_SIZE:
mswin_layout_main_window(NULL);
break;
#include "mhmain.h"
#include "mhmsg.h"
#include "mhfont.h"
-#include <commctrl.h>
#define MENU_MARGIN 0
#define NHMENU_STR_SIZE BUFSZ
PNHMenuItem items; /* menu items */
char gacc[QBUFSZ]; /* group accelerators */
BOOL counting; /* counting flag */
+ char prompt[QBUFSZ]; /* menu prompt */
} menu;
struct menu_text {
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;
+
}
}
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,
/* 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 */
i,
-1
);
+ ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED);
+ ListView_EnsureVisible(hwndList, i, FALSE);
break;
}
}
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(
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. */
//Microsoft Developer Studio generated resource script.
//
-#if defined(__BORLANDC__)
-LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US
-#endif
-
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
//
// 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
// Menu
//
-IDC_NETHACKW MENU DISCARDABLE
+IDC_NETHACKW MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
// Accelerator
//
-IDC_NETHACKW ACCELERATORS MOVEABLE PURE
+IDC_NETHACKW ACCELERATORS MOVEABLE PURE
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
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 |
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
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"