win32 stuff held until after bugfix release (from <Someone>)

-better handling of "more" prompt for messages that would have      scrolled off the window
-support perm_invent
-menu option to add/remove windows captions
This commit is contained in:
nethack.allison
2003-03-03 23:31:36 +00:00
parent b83d8d3b5d
commit 27977b7c15
31 changed files with 906 additions and 399 deletions

View File

@@ -13,6 +13,8 @@ expert fireball/cone of cold could not target a monster seen only with
Platform- and/or Interface-Specific Fixes
-----------------------------------------
win32gui: better handling of "more" prompt for messages that would have scrolled
off the window
General New Features
@@ -21,3 +23,6 @@ General New Features
Platform- and/or Interface-Specific New Features
------------------------------------------------
win32gui: support perm_invent
win32gui: menu option to add/remove windows captions

View File

@@ -410,6 +410,8 @@ char *argv[];
if (discover)
You("are in non-scoring discovery mode.");
update_inventory();
if (discover || wizard) {
if(yn("Do you want to keep the save file?") == 'n'){
(void) delete_savefile();
@@ -428,6 +430,7 @@ not_recovered:
set_wear();
(void) pickup(1);
read_engr_at(u.ux,u.uy);
update_inventory();
}
#ifndef NO_SIGNAL

View File

@@ -9,3 +9,4 @@ int mswin_yes_no_dialog( const char *question, const char *choices, int def)
{
return '\032';
}

View File

@@ -9,3 +9,4 @@
int mswin_yes_no_dialog( const char *question, const char *choices, int def);
#endif /* MSWINAskYesNO_h */

View File

@@ -727,3 +727,4 @@ int plselFinalSelection(HWND hWnd, int* selection)
return TRUE;
}

View File

@@ -13,3 +13,4 @@ int mswin_ext_cmd_window (int* selection);
int mswin_player_selection_window(int* selection);
#endif /* MSWINDlgWindow_h */

View File

@@ -14,3 +14,4 @@ void mswin_destroy_splashfonts(void);
UINT mswin_charset(void);
#endif /* MSWINFont_h */

View File

@@ -83,3 +83,4 @@ PMSNHEvent mswin_input_peek()
}
return retval;
}

View File

@@ -33,3 +33,4 @@ PMSNHEvent mswin_input_pop(void);
PMSNHEvent mswin_input_peek(void);
#endif /* MSWINInput_h */

View File

@@ -27,6 +27,7 @@ static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
static void register_main_window_class(void);
static int menuid2mapmode(int menuid);
static int mapmode2menuid(int map_mode);
static void nhlock_windows( BOOL lock );
HWND mswin_init_main_window () {
static int run_once = 0;
@@ -77,8 +78,8 @@ HWND mswin_init_main_window () {
}
else
ShowWindow(ret, SW_SHOWDEFAULT);
UpdateWindow(ret);
UpdateWindow(ret);
return ret;
}
@@ -535,9 +536,7 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
void mswin_layout_main_window(HWND changed_child)
{
winid i;
POINT pt;
RECT client_rt, wnd_rect;
SIZE menu_size;
POINT status_org;
SIZE status_size;
POINT msg_org;
@@ -547,144 +546,153 @@ void mswin_layout_main_window(HWND changed_child)
HWND wnd_status, wnd_msg;
PNHMainWindow data;
GetClientRect(GetNHApp()->hMainWnd, &client_rt);
data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA);
if( GetNHApp()->bAutoLayout ) {
GetClientRect(GetNHApp()->hMainWnd, &client_rt);
data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA);
/* get sizes of child windows */
wnd_status = mswin_hwnd_from_winid(WIN_STATUS);
if( IsWindow(wnd_status) ) {
mswin_status_window_size(wnd_status, &status_size);
} else {
status_size.cx = status_size.cy = 0;
/* get sizes of child windows */
wnd_status = mswin_hwnd_from_winid(WIN_STATUS);
if( IsWindow(wnd_status) ) {
mswin_status_window_size(wnd_status, &status_size);
} else {
status_size.cx = status_size.cy = 0;
}
wnd_msg = mswin_hwnd_from_winid(WIN_MESSAGE);
if( IsWindow(wnd_msg) ) {
mswin_message_window_size(wnd_msg, &msg_size);
} else {
msg_size.cx = msg_size.cy = 0;
}
/* set window positions */
SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right, client_rt.bottom);
switch(iflags.wc_align_status) {
case ALIGN_LEFT:
status_size.cx = (wnd_rect.right-wnd_rect.left)/4;
status_size.cy = (wnd_rect.bottom-wnd_rect.top); // that won't look good
status_org.x = wnd_rect.left;
status_org.y = wnd_rect.top;
wnd_rect.left += status_size.cx;
break;
case ALIGN_RIGHT:
status_size.cx = (wnd_rect.right-wnd_rect.left)/4;
status_size.cy = (wnd_rect.bottom-wnd_rect.top); // that won't look good
status_org.x = wnd_rect.right - status_size.cx;
status_org.y = wnd_rect.top;
wnd_rect.right -= status_size.cx;
break;
case ALIGN_TOP:
status_size.cx = (wnd_rect.right-wnd_rect.left);
status_org.x = wnd_rect.left;
status_org.y = wnd_rect.top;
wnd_rect.top += status_size.cy;
break;
case ALIGN_BOTTOM:
default:
status_size.cx = (wnd_rect.right-wnd_rect.left);
status_org.x = wnd_rect.left;
status_org.y = wnd_rect.bottom - status_size.cy;
wnd_rect.bottom -= status_size.cy;
break;
}
switch(iflags.wc_align_message) {
case ALIGN_LEFT:
msg_size.cx = (wnd_rect.right-wnd_rect.left)/4;
msg_size.cy = (wnd_rect.bottom-wnd_rect.top);
msg_org.x = wnd_rect.left;
msg_org.y = wnd_rect.top;
wnd_rect.left += msg_size.cx;
break;
case ALIGN_RIGHT:
msg_size.cx = (wnd_rect.right-wnd_rect.left)/4;
msg_size.cy = (wnd_rect.bottom-wnd_rect.top);
msg_org.x = wnd_rect.right - msg_size.cx;
msg_org.y = wnd_rect.top;
wnd_rect.right -= msg_size.cx;
break;
case ALIGN_TOP:
msg_size.cx = (wnd_rect.right-wnd_rect.left);
msg_org.x = wnd_rect.left;
msg_org.y = wnd_rect.top;
wnd_rect.top += msg_size.cy;
break;
case ALIGN_BOTTOM:
default:
msg_size.cx = (wnd_rect.right-wnd_rect.left);
msg_org.x = wnd_rect.left;
msg_org.y = wnd_rect.bottom - msg_size.cy;
wnd_rect.bottom -= msg_size.cy;
break;
}
/* map window */
map_org.x = wnd_rect.left;
map_org.y = wnd_rect.top;
map_size.cx = wnd_rect.right - wnd_rect.left;
map_size.cy = wnd_rect.bottom - wnd_rect.top;
GetNHApp()->rtStatusWindow.left = status_org.x;
GetNHApp()->rtStatusWindow.top = status_org.y;
GetNHApp()->rtStatusWindow.right = status_org.x + status_size.cx;
GetNHApp()->rtStatusWindow.bottom= status_org.y + status_size.cy;
GetNHApp()->rtTextWindow.left = map_org.x;
GetNHApp()->rtTextWindow.top = map_org.y;
GetNHApp()->rtTextWindow.right = map_org.x + (wnd_rect.right - wnd_rect.left);
GetNHApp()->rtTextWindow.bottom = map_org.y + map_size.cy;
GetNHApp()->rtMapWindow.left = map_org.x;
GetNHApp()->rtMapWindow.top = map_org.y;
GetNHApp()->rtMapWindow.right = map_org.x + map_size.cx;
GetNHApp()->rtMapWindow.bottom = map_org.y + map_size.cy;
GetNHApp()->rtMsgWindow.left = msg_org.x;
GetNHApp()->rtMsgWindow.top = msg_org.y;
GetNHApp()->rtMsgWindow.right = msg_org.x + msg_size.cx;
GetNHApp()->rtMsgWindow.bottom = msg_org.y + msg_size.cy;
GetNHApp()->rtMenuWindow.left = map_org.x + map_size.cx*2/3;
GetNHApp()->rtMenuWindow.top = map_org.y;
GetNHApp()->rtMenuWindow.right = map_org.x + map_size.cx;
GetNHApp()->rtMenuWindow.bottom = map_org.y + map_size.cy;
GetNHApp()->rtInvenWindow.left = GetNHApp()->rtMenuWindow.left;
GetNHApp()->rtInvenWindow.top = GetNHApp()->rtMenuWindow.top;
GetNHApp()->rtInvenWindow.right = GetNHApp()->rtMenuWindow.right;
GetNHApp()->rtInvenWindow.bottom = GetNHApp()->rtMenuWindow.bottom;
/* adjust map window size only if perm_invent is set */
if( flags.perm_invent )
GetNHApp()->rtMapWindow.right = GetNHApp()->rtMenuWindow.left;
}
wnd_msg = mswin_hwnd_from_winid(WIN_MESSAGE);
if( IsWindow(wnd_msg) ) {
mswin_message_window_size(wnd_msg, &msg_size);
} else {
msg_size.cx = msg_size.cy = 0;
}
/* set window positions */
SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right, client_rt.bottom);
switch(iflags.wc_align_status) {
case ALIGN_LEFT:
status_size.cx = (wnd_rect.right-wnd_rect.left)/4;
status_size.cy = (wnd_rect.bottom-wnd_rect.top); // that won't look good
status_org.x = wnd_rect.left;
status_org.y = wnd_rect.top;
wnd_rect.left += status_size.cx;
break;
case ALIGN_RIGHT:
status_size.cx = (wnd_rect.right-wnd_rect.left)/4;
status_size.cy = (wnd_rect.bottom-wnd_rect.top); // that won't look good
status_org.x = wnd_rect.right - status_size.cx;
status_org.y = wnd_rect.top;
wnd_rect.right -= status_size.cx;
break;
case ALIGN_TOP:
status_size.cx = (wnd_rect.right-wnd_rect.left);
status_org.x = wnd_rect.left;
status_org.y = wnd_rect.top;
wnd_rect.top += status_size.cy;
break;
case ALIGN_BOTTOM:
default:
status_size.cx = (wnd_rect.right-wnd_rect.left);
status_org.x = wnd_rect.left;
status_org.y = wnd_rect.bottom - status_size.cy;
wnd_rect.bottom -= status_size.cy;
break;
}
switch(iflags.wc_align_message) {
case ALIGN_LEFT:
msg_size.cx = (wnd_rect.right-wnd_rect.left)/4;
msg_size.cy = (wnd_rect.bottom-wnd_rect.top);
msg_org.x = wnd_rect.left;
msg_org.y = wnd_rect.top;
wnd_rect.left += msg_size.cx;
break;
case ALIGN_RIGHT:
msg_size.cx = (wnd_rect.right-wnd_rect.left)/4;
msg_size.cy = (wnd_rect.bottom-wnd_rect.top);
msg_org.x = wnd_rect.right - msg_size.cx;
msg_org.y = wnd_rect.top;
wnd_rect.right -= msg_size.cx;
break;
case ALIGN_TOP:
msg_size.cx = (wnd_rect.right-wnd_rect.left);
msg_org.x = wnd_rect.left;
msg_org.y = wnd_rect.top;
wnd_rect.top += msg_size.cy;
break;
case ALIGN_BOTTOM:
default:
msg_size.cx = (wnd_rect.right-wnd_rect.left);
msg_org.x = wnd_rect.left;
msg_org.y = wnd_rect.bottom - msg_size.cy;
wnd_rect.bottom -= msg_size.cy;
break;
}
map_org.x = wnd_rect.left;
map_org.y = wnd_rect.top;
map_size.cx = wnd_rect.right - wnd_rect.left;
map_size.cy = wnd_rect.bottom - wnd_rect.top;
/* go through the windows list and adjust sizes */
for( i=0; i<MAXWINDOWS; i++ ) {
if(GetNHApp()->windowlist[i].win && !GetNHApp()->windowlist[i].dead) {
switch( GetNHApp()->windowlist[i].type ) {
case NHW_STATUS:
MoveWindow(GetNHApp()->windowlist[i].win,
status_org.x,
status_org.y,
status_size.cx,
status_size.cy,
TRUE );
break;
RECT rt;
/* kludge - inventory window should have its own type (same as menu-text
as a matter of fact) */
if( flags.perm_invent && i==WIN_INVEN )
mswin_get_window_placement(NHW_INVEN, &rt);
else
mswin_get_window_placement(GetNHApp()->windowlist[i].type, &rt);
case NHW_TEXT: // same as the map window
case NHW_MAP:
MoveWindow(GetNHApp()->windowlist[i].win,
map_org.x,
map_org.y,
map_size.cx,
map_size.cy,
TRUE );
break;
case NHW_MESSAGE:
MoveWindow(GetNHApp()->windowlist[i].win,
msg_org.x,
msg_org.y,
msg_size.cx,
msg_size.cy,
TRUE );
break;
case NHW_MENU:
mswin_menu_window_size(GetNHApp()->windowlist[i].win, &menu_size);
menu_size.cx = min(menu_size.cx, (client_rt.right-client_rt.left));
pt.x = map_org.x + max(0, (int)(map_size.cx-menu_size.cx));
pt.y = map_org.y;
MoveWindow(GetNHApp()->windowlist[i].win,
pt.x,
pt.y,
min(menu_size.cx, map_size.cx),
map_size.cy,
TRUE );
break;
}
ShowWindow(GetNHApp()->windowlist[i].win, SW_SHOW);
MoveWindow(GetNHApp()->windowlist[i].win,
rt.left,
rt.top,
rt.right - rt.left,
rt.bottom - rt.top,
TRUE
);
}
}
}
@@ -758,6 +766,17 @@ LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
"NetHack", MB_OK | MB_ICONINFORMATION);
break;
}
case IDM_SETTING_AUTOLAYOUT:
GetNHApp()->bAutoLayout = TRUE;
mswin_layout_main_window(NULL);
GetNHApp()->bAutoLayout = FALSE;
break;
case IDM_SETTING_LOCKWINDOWS:
nhlock_windows( !GetNHApp()->bWindowsLocked );
break;
case IDM_HELP_LONG:
display_file(HELP, TRUE);
break;
@@ -957,3 +976,37 @@ int mapmode2menuid(int map_mode)
if(p->mapMode==map_mode ) return p->menuID;
return -1;
}
void nhlock_windows( BOOL lock )
{
int i;
/* go through the windows list and adjust sizes */
for( i=0; i<MAXWINDOWS; i++ ) {
if( IsWindow(GetNHApp()->windowlist[i].win) && !GetNHApp()->windowlist[i].dead) {
DWORD style;
style = GetWindowLong(GetNHApp()->windowlist[i].win, GWL_STYLE);
if( lock ) style &= ~WS_CAPTION;
else style |= WS_CAPTION;
SetWindowLong(GetNHApp()->windowlist[i].win, GWL_STYLE, style);
SetWindowPos(
GetNHApp()->windowlist[i].win,
NULL,
0,
0,
0,
0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
);
}
}
/* update menu */
GetNHApp()->bWindowsLocked = lock;
CheckMenuItem(
GetMenu(GetNHApp()->hMainWnd),
IDM_SETTING_LOCKWINDOWS,
MF_BYCOMMAND |
(lock? MF_CHECKED : MF_UNCHECKED)
);
}

View File

@@ -14,3 +14,4 @@ void mswin_select_map_mode(int map_mode);
void mswin_menu_check_intf_mode(void);
#endif /* MSWINMainWindow_h */

View File

@@ -48,20 +48,29 @@ static COLORREF nhcolor_to_RGB(int c);
HWND mswin_init_map_window () {
static int run_once = 0;
HWND ret;
RECT rt;
if( !run_once ) {
register_map_window_class();
run_once = 1;
}
/* get window position */
if( GetNHApp()->bAutoLayout ) {
SetRect( &rt, 0, 0, 0, 0);
} else {
mswin_get_window_placement(NHW_MAP, &rt);
}
/* create map window object */
ret = CreateWindow(
szNHMapWindowClass, /* registered class name */
NULL, /* window name */
WS_CHILD | WS_HSCROLL | WS_VSCROLL | WS_CLIPSIBLINGS, /* window style */
0, /* horizontal position of window - set it later */
0, /* vertical position of window - set it later */
0, /* window width - set it later */
0, /* window height - set it later*/
WS_CHILD | WS_HSCROLL | WS_VSCROLL | WS_CLIPSIBLINGS | WS_SIZEBOX, /* window style */
rt.left, /* horizontal position of window */
rt.top, /* vertical position of window */
rt.right - rt.left, /* window width */
rt.bottom - rt.top, /* window height */
GetNHApp()->hMainWnd, /* handle to parent or owner window */
NULL, /* menu handle or child identifier */
GetNHApp()->hApp, /* handle to application instance */
@@ -69,6 +78,10 @@ HWND mswin_init_map_window () {
if( !ret ) {
panic("Cannot create map window");
}
/* Set window caption */
SetWindowText(ret, "Map");
return ret;
}
@@ -349,6 +362,7 @@ LRESULT CALLBACK MapWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
case WM_SIZE:
{
RECT rt;
SIZE size;
if( data->bFitToScreenMode ) {
@@ -360,9 +374,23 @@ LRESULT CALLBACK MapWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
size.cy = data->yScrTile*ROWNO;
}
mswin_map_stretch(hWnd, &size, TRUE);
/* update window placement */
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_MAP, &rt);
}
break;
case WM_MOVE: {
RECT rt;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_MAP, &rt);
} return FALSE;
case WM_LBUTTONDOWN:
NHEVENT_MS(
CLICK_1,
@@ -974,3 +1002,4 @@ void nhapply_image_transparent(
DeleteDC(hdcObject);
DeleteDC(hdcSave);
}

View File

@@ -19,3 +19,4 @@ int mswin_map_mode(HWND hWnd, int mode);
#define DEF_CLIPAROUND_AMOUNT 1
#endif /* MSWINMapWindow_h */

View File

@@ -59,6 +59,8 @@ typedef struct mswin_nethack_menu_window {
HBITMAP bmpChecked;
HBITMAP bmpCheckedCount;
HBITMAP bmpNotChecked;
BOOL is_active;
} NHMenuWindow, *PNHMenuWindow;
extern short glyph2tile[];
@@ -86,7 +88,16 @@ static BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch);
/*-----------------------------------------------------------------------------*/
HWND mswin_init_menu_window (int type) {
HWND ret;
RECT rt;
/* get window position */
if( GetNHApp()->bAutoLayout ) {
SetRect( &rt, 0, 0, 0, 0);
} else {
mswin_get_window_placement(NHW_MENU, &rt);
}
/* create menu window object */
ret = CreateDialog(
GetNHApp()->hApp,
MAKEINTRESOURCE(IDD_MENU),
@@ -96,12 +107,28 @@ HWND mswin_init_menu_window (int type) {
if( !ret ) {
panic("Cannot create menu window");
}
/* move it in the predefined position */
if( !GetNHApp()->bAutoLayout ) {
MoveWindow(ret, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, TRUE);
}
/* Set window caption */
SetWindowText(ret, "Menu/Text");
if( !GetNHApp()->bWindowsLocked ) {
DWORD style;
style = GetWindowLong(ret, GWL_STYLE);
style |= WS_CAPTION;
SetWindowLong(ret, GWL_STYLE, style);
SetWindowPos(ret, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
SetMenuType(ret, type);
return ret;
}
/*-----------------------------------------------------------------------------*/
int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected, BOOL activate)
{
PNHMenuWindow data;
int ret_val;
@@ -115,6 +142,14 @@ int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA);
/* force activate for certain menu types */
if( data->type == MENU_TYPE_MENU &&
(how == PICK_ONE || how == PICK_ANY) ) {
activate = TRUE;
}
data->is_active = activate;
/* set menu type */
SetMenuListType(hWnd, how);
@@ -156,7 +191,14 @@ int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
reset_menu_count(NULL, data);
}
mswin_popup_display(hWnd, &data->done);
LayoutMenu(hWnd); // show dialog buttons
if( activate ) {
mswin_popup_display(hWnd, &data->done);
} else {
SetFocus(GetNHApp()->hMainWnd);
mswin_layout_main_window(hWnd);
}
/* get the result */
if( data->result != -1 ) {
@@ -193,8 +235,11 @@ int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
}
}
mswin_popup_destroy(hWnd);
if( activate ) {
data->is_active = FALSE;
LayoutMenu(hWnd); // hide dialog buttons
mswin_popup_destroy(hWnd);
}
return ret_val;
}
/*-----------------------------------------------------------------------------*/
@@ -219,6 +264,7 @@ BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
data->bmpChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL));
data->bmpCheckedCount = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL_COUNT));
data->bmpNotChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL));
data->is_active = FALSE;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
/* set font for the text cotrol */
@@ -235,16 +281,35 @@ BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
which shows on Alt-Tab */
LoadString(GetNHApp()->hApp, IDS_APP_TITLE, title, MAX_LOADSTRING);
SetWindowText(hWnd, title);
break;
/* set focus to text control for now */
SetFocus(control);
return FALSE;
case WM_MSNH_COMMAND:
onMSNHCommand(hWnd, wParam, lParam);
break;
case WM_SIZE:
case WM_SIZE: {
RECT rt;
LayoutMenu(hWnd);
return FALSE;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
if( flags.perm_invent && mswin_winid_from_handle(hWnd)==WIN_INVEN )
mswin_update_window_placement(NHW_INVEN, &rt);
else
mswin_update_window_placement(NHW_MENU, &rt);
} return FALSE;
case WM_MOVE: {
RECT rt;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_MENU, &rt);
} return FALSE;
case WM_CLOSE:
if (program_state.gameover) {
data->result = -1;
@@ -375,10 +440,13 @@ BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
} break;
case WM_SETFOCUS:
if( hWnd!=GetNHApp()->hPopupWnd ) {
SetFocus(GetNHApp()->hPopupWnd );
if( hWnd!=GetNHApp()->hPopupWnd) {
SetFocus(GetNHApp()->hMainWnd);
} else {
if( IsWindow(GetMenuControl(hWnd)) )
SetFocus(GetMenuControl(hWnd));
}
break;
return FALSE;
case WM_MEASUREITEM:
if( wParam==IDC_MENU_LIST )
@@ -562,28 +630,55 @@ void LayoutMenu(HWND hWnd)
/* get window coordinates */
GetClientRect(hWnd, &clrt );
/* set window placements */
GetWindowRect(menu_ok, &rt);
sz_ok.cx = (clrt.right - clrt.left)/2 - 2*MENU_MARGIN;
sz_ok.cy = rt.bottom-rt.top;
pt_ok.x = clrt.left + MENU_MARGIN;
pt_ok.y = clrt.bottom - MENU_MARGIN - sz_ok.cy;
GetWindowRect(menu_cancel, &rt);
sz_cancel.cx = (clrt.right - clrt.left)/2 - 2*MENU_MARGIN;
sz_cancel.cy = rt.bottom-rt.top;
pt_cancel.x = (clrt.left + clrt.right)/2 + MENU_MARGIN;
pt_cancel.y = clrt.bottom - MENU_MARGIN - sz_cancel.cy;
// OK button
if( data->is_active ) {
GetWindowRect(menu_ok, &rt);
if( data->type == MENU_TYPE_TEXT ||
(data->type == MENU_TYPE_MENU && data->how == PICK_NONE ) ) {
sz_ok.cx = (clrt.right - clrt.left) - 2*MENU_MARGIN;
} else {
sz_ok.cx = (clrt.right - clrt.left)/2 - 2*MENU_MARGIN;
}
sz_ok.cy = rt.bottom-rt.top;
pt_ok.x = clrt.left + MENU_MARGIN;
pt_ok.y = clrt.bottom - MENU_MARGIN - sz_ok.cy;
ShowWindow(menu_ok, SW_SHOW);
MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
} else {
sz_ok.cx = sz_ok.cy = 0;
pt_ok.x = pt_ok.y = 0;
ShowWindow(menu_ok, SW_HIDE);
}
// CANCEL button
if( data->is_active &&
!( data->type == MENU_TYPE_TEXT ||
(data->type == MENU_TYPE_MENU && data->how == PICK_NONE ) ) ) {
GetWindowRect(menu_ok, &rt);
sz_cancel.cx = (clrt.right - clrt.left)/2 - 2*MENU_MARGIN;
pt_cancel.x = (clrt.left + clrt.right)/2 + MENU_MARGIN;
sz_cancel.cy = rt.bottom - rt.top;
pt_cancel.y = clrt.bottom - MENU_MARGIN - sz_cancel.cy;
ShowWindow(menu_cancel, SW_SHOW);
MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE );
} else {
sz_cancel.cx = sz_cancel.cy = 0;
pt_cancel.x = pt_cancel.y = 0;
ShowWindow(menu_cancel, SW_HIDE);
}
// main menu control
pt_elem.x = clrt.left + MENU_MARGIN;
pt_elem.y = clrt.top + MENU_MARGIN;
sz_elem.cx = (clrt.right - clrt.left) - 2*MENU_MARGIN;
sz_elem.cy = min(pt_cancel.y, pt_ok.y) - 2*MENU_MARGIN;
if( data->is_active ) {
sz_elem.cy = (clrt.bottom - clrt.top) - max(sz_ok.cy, sz_cancel.cy) - 3*MENU_MARGIN;
} else {
sz_elem.cy = (clrt.bottom - clrt.top) - 2*MENU_MARGIN;
}
MoveWindow(GetMenuControl(hWnd), pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE );
MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE );
}
/*-----------------------------------------------------------------------------*/
void SetMenuType(HWND hWnd, int type)
@@ -602,13 +697,13 @@ void SetMenuType(HWND hWnd, int type)
EnableWindow(list, FALSE);
EnableWindow(text, TRUE);
ShowWindow(text, SW_SHOW);
SetFocus(text);
if( data->is_active ) SetFocus(text);
} else {
ShowWindow(text, SW_HIDE);
EnableWindow(text, FALSE);
EnableWindow(list, TRUE);
ShowWindow(list, SW_SHOW);
SetFocus(list);
if( data->is_active ) SetFocus(list);
}
LayoutMenu(hWnd);
}
@@ -708,7 +803,7 @@ void SetMenuListType(HWND hWnd, int how)
panic("cannot insert menu item");
}
}
SetFocus(control);
if( data->is_active ) SetFocus(control);
}
/*-----------------------------------------------------------------------------*/
HWND GetMenuControl(HWND hWnd)
@@ -1057,7 +1152,7 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
if( mswin_getlin_window("Search for:", buf, BUFSZ)==IDCANCEL ) {
strcpy(buf, "\033");
}
SetFocus(hwndList); // set focus back to the list control
if( data->is_active ) SetFocus(hwndList); // set focus back to the list control
if (!*buf || *buf == '\033') return -2;
for(i=0; i<data->menu.size; i++ ) {
if( NHMENU_IS_SELECTABLE(data->menu.items[i])
@@ -1377,6 +1472,11 @@ LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
bUpdateFocusItem = TRUE;
break;
case WM_SETFOCUS:
if( GetParent(hWnd)!=GetNHApp()->hPopupWnd) {
SetFocus(GetNHApp()->hMainWnd);
}
return FALSE;
}
if( bUpdateFocusItem ) {
@@ -1446,3 +1546,4 @@ LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
return 0;
}
/*-----------------------------------------------------------------------------*/

View File

@@ -12,7 +12,8 @@
#define MENU_TYPE_MENU 2
HWND mswin_init_menu_window ( int type );
int mswin_menu_window_select_menu (HWND hwnd, int how, MENU_ITEM_P **);
int mswin_menu_window_select_menu (HWND hwnd, int how, MENU_ITEM_P ** selected, BOOL activate);
void mswin_menu_window_size (HWND hwnd, LPSIZE sz);
#endif /* MSWINTextWindow_h */

View File

@@ -60,3 +60,4 @@ typedef struct mswin_nhmsg_end_menu {
} MSNHMsgEndMenu, *PMSNHMsgEndMenu;
#endif

View File

@@ -20,21 +20,14 @@
struct window_line {
int attr;
char text[MAXWINDOWTEXT];
char text[MAXWINDOWTEXT+1];
};
typedef struct mswin_nethack_message_window {
size_t max_text;
struct window_line window_text[MAX_MSG_LINES];
#ifdef MSG_WRAP_TEXT
int window_text_lines[MAX_MSG_LINES]; /* How much space this text line takes */
#endif
int lines_last_turn; /* lines added during the last turn */
int cleared; /* clear was called */
int last_line; /* last line in the message history */
struct window_line new_line;
int lines_not_seen; /* lines not yet seen by user after last turn or --More-- */
int in_more; /* We are in a --More-- prompt */
int nevermore; /* We want no more --More-- prompts */
int xChar; /* horizontal scrolling unit */
@@ -58,6 +51,11 @@ static void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam);
static COLORREF setMsgTextColor(HDC hdc, int gray);
static void onPaint(HWND hWnd);
static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
static BOOL can_append_text(HWND hWnd, int attr, const char* text );
/* check if text can be appended to the last line without wrapping */
static BOOL more_prompt_check(HWND hWnd);
/* check if "--more--" promt needs to be displayed */
#ifdef USER_SOUNDS
extern void play_sound_for_message(const char* str);
@@ -67,16 +65,24 @@ HWND mswin_init_message_window () {
static int run_once = 0;
HWND ret;
DWORD style;
RECT rt;
if( !run_once ) {
register_message_window_class( );
run_once = 1;
}
/* get window position */
if( GetNHApp()->bAutoLayout ) {
SetRect( &rt, 0, 0, 0, 0);
} else {
mswin_get_window_placement(NHW_MESSAGE, &rt);
}
#ifdef MSG_WRAP_TEXT
style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL;
style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_SIZEBOX;
#else
style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL;
style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL | WS_SIZEBOX;
#endif
ret = CreateWindowEx(
@@ -84,10 +90,10 @@ HWND mswin_init_message_window () {
szMessageWindowClass, /* registered class name */
NULL, /* window name */
style, /* window style */
0, /* horizontal position of window */
0, /* vertical position of window */
0, /* window width */
0, /* window height - set it later */
rt.left, /* horizontal position of window */
rt.top, /* vertical position of window */
rt.right - rt.left, /* window width */
rt.bottom - rt.top, /* window height */
GetNHApp()->hMainWnd, /* handle to parent or owner window */
NULL, /* menu handle or child identifier */
GetNHApp()->hApp, /* handle to application instance */
@@ -95,6 +101,9 @@ HWND mswin_init_message_window () {
if( !ret ) panic("Cannot create message window");
/* Set window caption */
SetWindowText(ret, "Messages");
return ret;
}
@@ -161,6 +170,7 @@ LRESULT CALLBACK NHMessageWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
int xNewSize;
int yNewSize;
PNHMessageWindow data;
RECT rt;
data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA);
@@ -196,6 +206,12 @@ LRESULT CALLBACK NHMessageWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
si.nPos = data->yPos;
SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
}
/* update NetHack internal window position */
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_MESSAGE, &rt);
}
break;
@@ -215,22 +231,76 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam;
SCROLLINFO si;
char* p;
if( msg_data->append == 1) {
/* Forcibly append to line, even if we pass the edge */
strncat(data->window_text[data->last_line].text, msg_data->text,
MAXWINDOWTEXT - strlen(data->window_text[data->last_line].text));
strncat(data->window_text[MSG_LINES-1].text, msg_data->text,
MAXWINDOWTEXT - strlen(data->window_text[MSG_LINES-1].text));
} else if( msg_data->append < 0) {
/* remove that many chars */
int len = strlen(data->window_text[data->last_line].text);
int len = strlen(data->window_text[MSG_LINES-1].text);
int newend = max(len + msg_data->append, 0);
data->window_text[data->last_line].text[newend] = '\0';
data->window_text[MSG_LINES-1].text[newend] = '\0';
} else {
/* Try to append but move the whole message to the next line if
it doesn't fit */
/* just schedule for displaying */
data->new_line.attr = msg_data->attr;
strncpy(data->new_line.text, msg_data->text, MAXWINDOWTEXT);
if( can_append_text(hWnd, msg_data->attr, msg_data->text ) ) {
strncat(data->window_text[MSG_LINES-1].text, " ", MAXWINDOWTEXT-strlen(data->window_text[MSG_LINES-1].text));
strncat(data->window_text[MSG_LINES-1].text, msg_data->text, MAXWINDOWTEXT-strlen(data->window_text[MSG_LINES-1].text));
} else {
/* check for "--more--" */
if( !data->nevermore && more_prompt_check(hWnd) ) {
int okkey = 0;
int chop;
// @@@ Ok respnses
/* append more prompt and inticate the update */
strncat(data->window_text[MSG_LINES-1].text, MORE, MAXWINDOWTEXT - strlen(data->window_text[MSG_LINES-1].text));
InvalidateRect(hWnd, NULL, TRUE);
/* get the input */
while (!okkey) {
char c = mswin_nhgetch();
switch (c)
{
/* space or enter */
case ' ':
case '\015':
okkey = 1;
break;
/* ESC */
case '\033':
data->nevermore = 1;
okkey = 1;
break;
default:
break;
}
}
/* erase the "--more--" prompt */
chop = strlen(data->window_text[MSG_LINES-1].text) - strlen(MORE);
data->window_text[MSG_LINES-1].text[chop] = '\0';
data->lines_not_seen = 0;
}
/* check if the string is empty */
for(p = data->window_text[MSG_LINES-1].text; *p && isspace(*p); p++);
if( *p ) {
/* last string is not empty - scroll up */
memmove(&data->window_text[0],
&data->window_text[1],
(MSG_LINES-1)*sizeof(data->window_text[0]));
}
/* append new text to the end of the array */
data->window_text[MSG_LINES-1].attr = msg_data->attr;
strncpy(data->window_text[MSG_LINES-1].text, msg_data->text, MAXWINDOWTEXT);
data->lines_not_seen++;
data->lines_last_turn++;
}
}
/* reset V-scroll position to display new text */
@@ -253,9 +323,8 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
case MSNH_MSG_CLEAR_WINDOW:
{
data->cleared = 1;
data->lines_last_turn = 0;
data->lines_not_seen = 0;
/* do --More-- again if needed */
data->nevermore = 0;
break;
}
@@ -480,7 +549,6 @@ void onPaint(HWND hWnd)
LastLine = min (MSG_LINES-1, data->yPos - (client_rt.bottom - ps.rcPaint.bottom)/data->yChar);
y = min( ps.rcPaint.bottom, client_rt.bottom );
for (i=LastLine; i>=FirstLine; i--) {
int lineidx = (data->last_line + 1 + i) % MSG_LINES;
x = data->xChar * (2 - data->xPos);
draw_rt.left = x;
@@ -488,123 +556,21 @@ void onPaint(HWND hWnd)
draw_rt.top = y - data->yChar;
draw_rt.bottom = y;
oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[lineidx].attr, hdc, FALSE));
oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[i].attr, hdc, FALSE));
/* find out if we can concatenate the scheduled message without wrapping,
but only if no clear_nhwindow was done just before putstr'ing this one,
and only if not in a more prompt already (to prevent concatenating to
a line containing --More-- when resizing while --More-- is displayed.)
*/
if (i == MSG_LINES-1
&& strlen(data->new_line.text) > 0
&& !data->in_more) {
/* concatenate to the previous line if that is not empty, and
if it has the same attribute, and no clear was done.
*/
if (strlen(data->window_text[lineidx].text) > 0
&& (data->window_text[lineidx].attr
== data->new_line.attr)
&& !data->cleared) {
RECT tmpdraw_rt = draw_rt;
/* assume this will never work when textsize is near MAXWINDOWTEXT */
char tmptext[MAXWINDOWTEXT];
TCHAR tmpwbuf[MAXWINDOWTEXT+2];
strcpy(tmptext, data->window_text[lineidx].text);
strncat(tmptext, " ",
MAXWINDOWTEXT - strlen(tmptext));
strncat(tmptext, data->new_line.text,
MAXWINDOWTEXT - strlen(tmptext));
/* Always keep room for a --More-- */
strncat(tmptext, MORE,
MAXWINDOWTEXT - strlen(tmptext));
NH_A2W(tmptext, tmpwbuf, sizeof(tmpwbuf));
/* Find out how large the bounding rectangle of the text is */
DrawText(hdc, tmpwbuf, _tcslen(tmpwbuf), &tmpdraw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
if ((tmpdraw_rt.bottom - tmpdraw_rt.top) == (draw_rt.bottom - draw_rt.top) /* fits pixelwise */
&& (strlen(data->window_text[lineidx].text)
+ strlen(data->new_line.text) < MAXWINDOWTEXT)) /* fits charwise */
{
/* strip off --More-- of this combined line and make it so */
tmptext[strlen(tmptext) - strlen(MORE)] = '\0';
strcpy(data->window_text[lineidx].text, tmptext);
data->new_line.text[0] = '\0';
i++; /* Start from the last line again */
continue;
}
}
if (strlen(data->new_line.text) > 0) {
/* if we get here, the new line was not concatenated. Add it on a new line,
but first check whether we should --More--. */
RECT tmpdraw_rt = draw_rt;
TCHAR tmpwbuf[MAXWINDOWTEXT+2];
HGDIOBJ oldFont;
int new_screen_lines;
int screen_lines_not_seen = 0;
/* Count how many screen lines we haven't seen yet. */
#ifdef MSG_WRAP_TEXT
{
int n;
for (n = data->lines_not_seen - 1; n >= 0; n--) {
screen_lines_not_seen +=
data->window_text_lines[(data->last_line - n + MSG_LINES) % MSG_LINES];
}
}
#else
screen_lines_not_seen = data->lines_not_seen;
#endif
/* Now find out how many screen lines we would like to add */
NH_A2W(data->new_line.text, tmpwbuf, sizeof(tmpwbuf));
/* Find out how large the bounding rectangle of the text is */
oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[lineidx].attr, hdc, FALSE));
DrawText(hdc, tmpwbuf, _tcslen(tmpwbuf), &tmpdraw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
SelectObject(hdc, oldFont);
new_screen_lines = (tmpdraw_rt.bottom - tmpdraw_rt.top) / data->yChar;
/* If this together is more than fits on the window, we must
--More--, unless:
- We are in --More-- already (the user is scrolling the window)
- The user pressed ESC
*/
if (screen_lines_not_seen + new_screen_lines > MSG_VISIBLE_LINES
&& !data->in_more && !data->nevermore) {
data->in_more = 1;
/* Show --More-- on last line */
strcat(data->window_text[data->last_line].text, MORE);
/* Go on drawing, but remember we must do a more afterwards */
do_more = 1;
} else if (!data->in_more) {
data->last_line++;
data->last_line %= MSG_LINES;
data->window_text[data->last_line].attr = data->new_line.attr;
strncpy(data->window_text[data->last_line].text, data->new_line.text, MAXWINDOWTEXT);
data->new_line.text[0] = '\0';
if (data->cleared) {
/* now we are drawing a new line, the old lines can be redrawn in grey.*/
data->lines_last_turn = 0;
data->cleared = 0;
}
data->lines_last_turn++;
data->lines_not_seen++;
/* and start over */
i++; /* Start from the last line again */
continue;
}
}
}
/* convert to UNICODE */
NH_A2W(data->window_text[lineidx].text, wbuf, sizeof(wbuf));
NH_A2W(data->window_text[i].text, wbuf, sizeof(wbuf));
wlen = _tcslen(wbuf);
setMsgTextColor(hdc, i < (MSG_LINES - data->lines_last_turn));
#ifdef MSG_WRAP_TEXT
/* Find out how large the bounding rectangle of the text is */
DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
/* move that rectangle up, so that the bottom remains at the same height */
/* move that rectangle up, so that the bottom remains at the same height */
draw_rt.top = y - (draw_rt.bottom - draw_rt.top);
draw_rt.bottom = y;
/* Remember the height of this line for subsequent --More--'s */
data->window_text_lines[lineidx] = (draw_rt.bottom - draw_rt.top) / data->yChar;
/* Now really draw it */
DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK);
/* Now really draw it */
DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK);
/* Find out the cursor (caret) position */
if (i == MSG_LINES-1) {
@@ -647,39 +613,6 @@ void onPaint(HWND hWnd)
SelectObject(hdc, oldFont);
y -= draw_rt.bottom - draw_rt.top;
}
if (do_more) {
int okkey = 0;
int chop;
// @@@ Ok respnses
while (!okkey) {
char c = mswin_nhgetch();
switch (c)
{
/* space or enter */
case ' ':
case '\015':
okkey = 1;
break;
/* ESC */
case '\033':
data->nevermore = 1;
okkey = 1;
break;
default:
break;
}
}
chop = strlen(data->window_text[data->last_line].text)
- strlen(MORE);
data->window_text[data->last_line].text[chop] = '\0';
data->in_more = 0;
data->lines_not_seen = 0;
/* We did the --More--, reset the lines_not_seen; now draw that
new line. This is the easiest method */
InvalidateRect(hWnd, NULL, TRUE);
}
}
SetTextColor (hdc, OldFg);
SetBkColor (hdc, OldBg);
@@ -740,3 +673,99 @@ void mswin_message_window_size (HWND hWnd, LPSIZE sz)
sz->cy = sz->cy - (client_rt.bottom - client_rt.top) +
data->yChar * MSG_VISIBLE_LINES;
}
/* check if text can be appended to the last line without wrapping */
BOOL can_append_text(HWND hWnd, int attr, const char* text )
{
PNHMessageWindow data;
char tmptext[MAXWINDOWTEXT+1];
HDC hdc;
HGDIOBJ saveFont;
RECT draw_rt;
BOOL retval = FALSE;
data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA);
/* cannot append if lines_not_seen is 0 (beginning of the new turn */
if( data->lines_not_seen==0 ) return FALSE;
/* cannot append text with different attrbutes */
if( data->window_text[MSG_LINES-1].attr != attr ) return FALSE;
/* check if the maximum string langth will be exceeded */
if( strlen(data->window_text[MSG_LINES-1].text)+
2 + /* space characters */
strlen(text) +
strlen(MORE) >= MAXWINDOWTEXT ) return FALSE;
/* check if the text is goinf to fin into a single line */
strcpy(tmptext, data->window_text[MSG_LINES-1].text );
strcat(tmptext, " " );
strcat(tmptext, text );
strcat(tmptext, MORE );
hdc = GetDC(hWnd);
saveFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[MSG_LINES-1].attr, hdc, FALSE));
GetClientRect(hWnd, &draw_rt);
draw_rt.bottom = draw_rt.top; /* we only need width for the DrawText */
DrawText(hdc, tmptext, strlen(tmptext), &draw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
/* we will check against 1.5 of the font size in order to determine
if the text is single-line or not - just to be on the safe size */
retval = (draw_rt.bottom-draw_rt.top)<(data->yChar+data->yChar/2);
/* free device context */
SelectObject(hdc, saveFont);
ReleaseDC (hWnd, hdc);
return retval;
}
/* check if "--more--" promt needs to be displayed
basically, check if the lines not seen are going to find in the message window
*/
BOOL more_prompt_check(HWND hWnd)
{
PNHMessageWindow data;
HDC hdc;
HGDIOBJ saveFont;
RECT client_rt, draw_rt;
BOOL retval = FALSE;
int visible_lines = 0;
int i;
int remaining_height;
char tmptext[MAXWINDOWTEXT+1];
data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA);
if( data->lines_not_seen==0 ) return FALSE; /* don't bother checking - nothig to "more" */
if( data->lines_not_seen>=MSG_LINES ) return TRUE; /* history size exceeded - always more */
GetClientRect(hWnd, &client_rt);
remaining_height = client_rt.bottom - client_rt.top;
hdc = GetDC(hWnd);
saveFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, FALSE));
for( i=0; i<data->lines_not_seen; i++ ) {
/* we only need width for the DrawText */
SetRect(&draw_rt, client_rt.left, client_rt.top, client_rt.right, client_rt.top);
SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[MSG_LINES-i-1].attr, hdc, FALSE));
strcpy(tmptext, data->window_text[MSG_LINES-i-1].text );
if( i==0 ) strcat(tmptext, MORE );
remaining_height -=
DrawText( hdc,
tmptext,
strlen(tmptext),
&draw_rt,
DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT
);
if( remaining_height<=0 ) break;
}
/* free device context */
SelectObject(hdc, saveFont);
ReleaseDC (hWnd, hdc);
return (remaining_height<=0); /* TRUE if lines_not_seen take more that window height */
}

View File

@@ -13,3 +13,4 @@ void mswin_message_window_size (HWND hWnd, LPSIZE sz);
#endif /* MSWINMessageWindow_h */

View File

@@ -263,3 +263,4 @@ void mswin_finish_rip_text(winid wid)
{
SendMessage (mswin_hwnd_from_winid(wid), WM_MSNH_COMMAND, MSNH_MSG_DIED, 0);
}

View File

@@ -13,3 +13,4 @@ HWND mswin_init_RIP_window (void);
void mswin_display_RIP_window (HWND hwnd);
#endif /* MSWINRIPWindow_h */

View File

@@ -32,7 +32,6 @@ void mswin_display_splash_window (BOOL show_ver)
{
MSG msg;
RECT rt;
HWND mapWnd;
RECT splashrt;
RECT clientrt;
RECT controlrt;
@@ -44,8 +43,6 @@ void mswin_display_splash_window (BOOL show_ver)
if( !hWnd ) panic("Cannot create Splash window");
mswin_init_splashfonts(hWnd);
GetNHApp()->hPopupWnd = hWnd;
mapWnd = mswin_hwnd_from_winid(WIN_MAP);
if( !IsWindow(mapWnd) ) mapWnd = GetNHApp()->hMainWnd;
/* Get control size */
GetWindowRect (GetDlgItem(hWnd, IDOK), &controlrt);
controlrt.right -= controlrt.left;
@@ -60,7 +57,7 @@ void mswin_display_splash_window (BOOL show_ver)
splashrt.right += SPLASH_WIDTH + SPLASH_OFFSET_X * 2 - clientrt.right;
splashrt.bottom += SPLASH_HEIGHT + controlrt.bottom + SPLASH_OFFSET_Y * 3 - clientrt.bottom;
/* Place the window centered */
GetWindowRect(mapWnd, &rt);
GetWindowRect(GetNHApp()->hMainWnd, &rt);
rt.left += (rt.right - rt.left - splashrt.right) / 2;
rt.top += (rt.bottom - rt.top - splashrt.bottom) / 2;
MoveWindow(hWnd, rt.left, rt.top, splashrt.right, splashrt.bottom, TRUE);
@@ -91,7 +88,6 @@ void mswin_display_splash_window (BOOL show_ver)
/* Show news, if any */
FILE *nf;
iflags.news = 0; /* prevent newgame() from re-displaying news */
nf = fopen(NEWS, "r");
if (nf != NULL) {
char *buf = NULL;
@@ -228,3 +224,4 @@ BOOL CALLBACK NHSplashWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
}
return FALSE;
}

View File

@@ -11,3 +11,4 @@
void mswin_display_splash_window (BOOL);
#endif /* MSWINSplashWindow_h */

View File

@@ -25,28 +25,39 @@ HWND mswin_init_status_window () {
static int run_once = 0;
HWND ret;
NHStatusWindow* data;
RECT rt;
if( !run_once ) {
register_status_window_class( );
run_once = 1;
}
/* get window position */
if( GetNHApp()->bAutoLayout ) {
SetRect( &rt, 0, 0, 0, 0);
} else {
mswin_get_window_placement(NHW_STATUS, &rt);
}
/* create status window object */
ret = CreateWindow(
szStatusWindowClass,
NULL,
WS_CHILD | WS_DISABLED | WS_CLIPSIBLINGS,
0, /* x position */
0, /* y position */
0, /* x-size - we will set it later */
0, /* y-size - we will set it later */
WS_CHILD | WS_CLIPSIBLINGS | WS_SIZEBOX,
rt.left, /* horizontal position of window */
rt.top, /* vertical position of window */
rt.right - rt.left, /* window width */
rt.bottom - rt.top, /* window height */
GetNHApp()->hMainWnd,
NULL,
GetNHApp()->hApp,
NULL );
if( !ret ) panic("Cannot create status window");
EnableWindow(ret, FALSE);
/* Set window caption */
SetWindowText(ret, "Status");
/* create window data */
data = (PNHStatusWindow)malloc(sizeof(NHStatusWindow));
if( !data ) panic("out of memory");
@@ -92,8 +103,6 @@ LRESULT CALLBACK StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP
PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam;
strncpy(data->window_text[data->index], msg_data->text,
MAXWINDOWTEXT);
strncat(data->window_text[data->index], "\n",
MAXWINDOWTEXT-strlen(data->window_text[data->index]));
data->index = (data->index+1) % NHSW_LINES;
InvalidateRect(hWnd, NULL, TRUE);
break;
@@ -136,6 +145,22 @@ LRESULT CALLBACK StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP
EndPaint(hWnd, &ps);
} break;
case WM_SIZE: {
RECT rt;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_STATUS, &rt);
} return FALSE;
case WM_MOVE: {
RECT rt;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_STATUS, &rt);
} return FALSE;
case WM_DESTROY:
free(data);
SetWindowLong(hWnd, GWL_USERDATA, (LONG)0);
@@ -168,9 +193,10 @@ void mswin_status_window_size (HWND hWnd, LPSIZE sz)
saveFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
GetTextMetrics(hdc, &tm);
sz->cy = tm.tmHeight * NHSW_LINES;
sz->cy = tm.tmHeight * NHSW_LINES + 2*GetSystemMetrics(SM_CYSIZEFRAME);
SelectObject(hdc, saveFont);
ReleaseDC(hWnd, hdc);
}
}

View File

@@ -12,3 +12,4 @@ HWND mswin_init_status_window (void);
void mswin_status_window_size (HWND hWnd, LPSIZE sz);
#endif /* MSWINStatusWindow_h */

View File

@@ -25,7 +25,16 @@ static void LayoutText(HWND hwnd);
HWND mswin_init_text_window () {
HWND ret;
PNHTextWindow data;
RECT rt;
/* get window position */
if( GetNHApp()->bAutoLayout ) {
SetRect( &rt, 0, 0, 0, 0);
} else {
mswin_get_window_placement(NHW_TEXT, &rt);
}
/* create text widnow object */
ret = CreateDialog(
GetNHApp()->hApp,
MAKEINTRESOURCE(IDD_NHTEXT),
@@ -34,9 +43,24 @@ HWND mswin_init_text_window () {
);
if( !ret ) panic("Cannot create text window");
/* move it in the predefined position */
if( !GetNHApp()->bAutoLayout ) {
MoveWindow(ret, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, TRUE);
}
/* Set window caption */
SetWindowText(ret, "Text");
if( !GetNHApp()->bWindowsLocked ) {
DWORD style;
style = GetWindowLong(ret, GWL_STYLE);
style |= WS_CAPTION;
SetWindowLong(ret, GWL_STYLE, style);
SetWindowPos(ret, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
/* create and set window data */
data = (PNHTextWindow)malloc(sizeof(NHTextWindow));
if( !data ) panic("out of memory");
ZeroMemory(data, sizeof(NHTextWindow));
SetWindowLong(ret, GWL_USERDATA, (LONG)data);
return ret;
@@ -95,9 +119,24 @@ BOOL CALLBACK NHTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
onMSNHCommand(hWnd, wParam, lParam);
break;
case WM_SIZE:
case WM_SIZE: {
RECT rt;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_TEXT, &rt);
LayoutText(hWnd);
return FALSE;
} return FALSE;
case WM_MOVE: {
RECT rt;
GetWindowRect(hWnd, &rt);
ScreenToClient(GetNHApp()->hMainWnd, (LPPOINT)&rt);
ScreenToClient(GetNHApp()->hMainWnd, ((LPPOINT)&rt)+1);
mswin_update_window_placement(NHW_TEXT, &rt);
} return FALSE;
case WM_COMMAND:
switch (LOWORD(wParam))
@@ -252,3 +291,4 @@ LRESULT CALLBACK NHEditHookWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
else
return 0;
}

View File

@@ -12,3 +12,4 @@ HWND mswin_init_text_window (void);
void mswin_display_text_window (HWND hwnd);
#endif /* MSWINTextWindow_h */

View File

@@ -241,7 +241,8 @@ void mswin_init_nhwindows(int* argc, char** argv)
mswin_color_from_string(iflags.wc_backgrnd_status, &status_bg_brush, &status_bg_color);
mswin_color_from_string(iflags.wc_backgrnd_text, &text_bg_brush, &text_bg_color);
if (iflags.wc_splash_screen) mswin_display_splash_window(FALSE);
if (iflags.wc_splash_screen) mswin_display_splash_window(FALSE);
iflags.window_inited = TRUE;
}
@@ -813,9 +814,10 @@ void mswin_display_nhwindow(winid wid, BOOLEAN_P block)
logDebug("mswin_display_nhwindow(%d, %d)\n", wid, block);
if (GetNHApp()->windowlist[wid].win != NULL)
{
ShowWindow(GetNHApp()->windowlist[wid].win, SW_SHOW);
if (GetNHApp()->windowlist[wid].type == NHW_MENU) {
MENU_ITEM_P* p;
mswin_menu_window_select_menu(GetNHApp()->windowlist[wid].win, PICK_NONE, &p);
mswin_menu_window_select_menu(GetNHApp()->windowlist[wid].win, PICK_NONE, &p, TRUE);
} if (GetNHApp()->windowlist[wid].type == NHW_TEXT) {
mswin_display_text_window(GetNHApp()->windowlist[wid].win);
} if (GetNHApp()->windowlist[wid].type == NHW_RIP) {
@@ -1163,7 +1165,13 @@ int mswin_select_menu(winid wid, int how, MENU_ITEM_P **selected)
(wid < MAXWINDOWS) &&
(GetNHApp()->windowlist[wid].win != NULL))
{
nReturned = mswin_menu_window_select_menu(GetNHApp()->windowlist[wid].win, how, selected);
ShowWindow(GetNHApp()->windowlist[wid].win, SW_SHOW);
nReturned = mswin_menu_window_select_menu(
GetNHApp()->windowlist[wid].win,
how,
selected,
!(flags.perm_invent && wid==WIN_INVEN && how==PICK_NONE) /* don't activate inventory window if perm_invent is on */
);
}
return nReturned;
}
@@ -1176,6 +1184,10 @@ int mswin_select_menu(winid wid, int how, MENU_ITEM_P **selected)
void mswin_update_inventory()
{
logDebug("mswin_update_inventory()\n");
if( flags.perm_invent &&
program_state.something_worth_saving &&
iflags.window_inited &&
WIN_INVEN!=WIN_ERR ) display_inventory(NULL, FALSE);
}
/*
@@ -1984,6 +1996,7 @@ void mswin_popup_display(HWND hWnd, int* done_indicator)
/* bring menu window on top */
SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
SetFocus(hWnd);
/* go into message loop */
while( IsWindow(hWnd) &&
@@ -2022,10 +2035,8 @@ void mswin_popup_destroy(HWND hWnd)
}
DrawMenuBar( GetNHApp()->hMainWnd );
SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
ShowWindow(hWnd, SW_HIDE);
GetNHApp()->hPopupWnd = NULL;
mswin_window_mark_dead( mswin_winid_from_handle(hWnd) );
DestroyWindow(hWnd);
mswin_layout_main_window(hWnd);
@@ -2067,6 +2078,27 @@ logDebug(const char *fmt, ...)
#define MAINRIGHTKEY "MainRight"
#define MAINTOPKEY "MainTop"
#define MAINBOTTOMKEY "MainBottom"
#define MAINAUTOLAYOUT "AutoLayout"
#define MAPLEFT "MapLeft"
#define MAPRIGHT "MapRight"
#define MAPTOP "MapTop"
#define MAPBOTTOM "MapBottom"
#define MSGLEFT "MsgLeft"
#define MSGRIGHT "MsgRight"
#define MSGTOP "MsgTop"
#define MSGBOTTOM "MsgBottom"
#define STATUSLEFT "StatusLeft"
#define STATUSRIGHT "StatusRight"
#define STATUSTOP "StatusTop"
#define STATUSBOTTOM "StatusBottom"
#define MENULEFT "MenuLeft"
#define MENURIGHT "MenuRight"
#define MENUTOP "MenuTop"
#define MENUBOTTOM "MenuBottom"
#define TEXTLEFT "TextLeft"
#define TEXTRIGHT "TextRight"
#define TEXTTOP "TextTop"
#define TEXTBOTTOM "TextBottom"
/* #define all the subkeys here */
#define INTFKEY "Interface"
@@ -2076,6 +2108,7 @@ mswin_read_reg()
{
HKEY key;
DWORD size;
DWORD safe_buf;
char keystring[MAX_PATH];
sprintf(keystring, "%s\\%s\\%s\\%s",
@@ -2091,20 +2124,63 @@ mswin_read_reg()
return;
size = sizeof(DWORD);
/* Read the keys here. */
RegQueryValueEx(key, INTFKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regNetHackMode)), &size);
/* Main window placement */
RegQueryValueEx(key, MAINSHOWSTATEKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainShowState)), &size);
RegQueryValueEx(key, MAINMINXKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMinX)), &size);
RegQueryValueEx(key, MAINMINYKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMinY)), &size);
RegQueryValueEx(key, MAINMAXXKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMaxX)), &size);
RegQueryValueEx(key, MAINMAXYKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMaxY)), &size);
RegQueryValueEx(key, MAINLEFTKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainLeft)), &size);
RegQueryValueEx(key, MAINRIGHTKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainRight)), &size);
RegQueryValueEx(key, MAINTOPKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainTop)), &size);
RegQueryValueEx(key, MAINBOTTOMKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainBottom)), &size);
#define NHGETREG_DWORD(name, val) \
RegQueryValueEx(key, (name), 0, NULL, (unsigned char *)(&safe_buf), &size); (val) = safe_buf;
/* read the keys here */
NHGETREG_DWORD(INTFKEY, GetNHApp()->regNetHackMode);
/* read window placement */
NHGETREG_DWORD(MAINSHOWSTATEKEY, GetNHApp()->regMainShowState);
NHGETREG_DWORD(MAINMINXKEY, GetNHApp()->regMainMinX);
NHGETREG_DWORD(MAINMINYKEY, GetNHApp()->regMainMinY);
NHGETREG_DWORD(MAINMAXXKEY, GetNHApp()->regMainMaxX);
NHGETREG_DWORD(MAINMAXYKEY, GetNHApp()->regMainMaxY);
NHGETREG_DWORD(MAINLEFTKEY, GetNHApp()->regMainLeft);
NHGETREG_DWORD(MAINRIGHTKEY, GetNHApp()->regMainRight);
NHGETREG_DWORD(MAINTOPKEY, GetNHApp()->regMainTop);
NHGETREG_DWORD(MAINBOTTOMKEY, GetNHApp()->regMainBottom);
NHGETREG_DWORD(MAINAUTOLAYOUT, GetNHApp()->bAutoLayout);
NHGETREG_DWORD(MAPLEFT, GetNHApp()->rtMapWindow.left);
NHGETREG_DWORD(MAPRIGHT, GetNHApp()->rtMapWindow.right);
NHGETREG_DWORD(MAPTOP, GetNHApp()->rtMapWindow.top);
NHGETREG_DWORD(MAPBOTTOM, GetNHApp()->rtMapWindow.bottom);
NHGETREG_DWORD(MSGLEFT, GetNHApp()->rtMsgWindow.left);
NHGETREG_DWORD(MSGRIGHT, GetNHApp()->rtMsgWindow.right);
NHGETREG_DWORD(MSGTOP, GetNHApp()->rtMsgWindow.top);
NHGETREG_DWORD(MSGBOTTOM, GetNHApp()->rtMsgWindow.bottom);
NHGETREG_DWORD(STATUSLEFT, GetNHApp()->rtStatusWindow.left);
NHGETREG_DWORD(STATUSRIGHT, GetNHApp()->rtStatusWindow.right);
NHGETREG_DWORD(STATUSTOP, GetNHApp()->rtStatusWindow.top);
NHGETREG_DWORD(STATUSBOTTOM, GetNHApp()->rtStatusWindow.bottom);
NHGETREG_DWORD(MENULEFT, GetNHApp()->rtMenuWindow.left);
NHGETREG_DWORD(MENURIGHT, GetNHApp()->rtMenuWindow.right);
NHGETREG_DWORD(MENUTOP, GetNHApp()->rtMenuWindow.top);
NHGETREG_DWORD(MENUBOTTOM, GetNHApp()->rtMenuWindow.bottom);
NHGETREG_DWORD(TEXTLEFT, GetNHApp()->rtTextWindow.left);
NHGETREG_DWORD(TEXTRIGHT, GetNHApp()->rtTextWindow.right);
NHGETREG_DWORD(TEXTTOP, GetNHApp()->rtTextWindow.top);
NHGETREG_DWORD(TEXTBOTTOM, GetNHApp()->rtTextWindow.bottom);
NHGETREG_DWORD(TEXTLEFT, GetNHApp()->rtInvenWindow.left);
NHGETREG_DWORD(TEXTRIGHT, GetNHApp()->rtInvenWindow.right);
NHGETREG_DWORD(TEXTTOP, GetNHApp()->rtInvenWindow.top);
NHGETREG_DWORD(TEXTBOTTOM, GetNHApp()->rtInvenWindow.bottom);
#undef NHGETREG_DWORD
RegCloseKey(key);
/* check the data for validity */
if( IsRectEmpty(&GetNHApp()->rtMapWindow) ||
IsRectEmpty(&GetNHApp()->rtMsgWindow) ||
IsRectEmpty(&GetNHApp()->rtStatusWindow) ||
IsRectEmpty(&GetNHApp()->rtMenuWindow) ||
IsRectEmpty(&GetNHApp()->rtTextWindow) ||
IsRectEmpty(&GetNHApp()->rtInvenWindow) )
{
GetNHApp()->bAutoLayout = TRUE;
}
}
void
@@ -2116,6 +2192,7 @@ mswin_write_reg()
if (GetNHApp()->saveRegistrySettings)
{
char keystring[MAX_PATH];
DWORD safe_buf;
sprintf(keystring, "%s\\%s\\%s\\%s",
CATEGORYKEY, COMPANYKEY, PRODUCTKEY, SETTINGSKEY);
@@ -2126,18 +2203,49 @@ mswin_write_reg()
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition);
}
#define NHSETREG_DWORD(name, val) \
RegSetValueEx(key, (name), 0, REG_DWORD, (unsigned char *)((safe_buf=(val)), &safe_buf), sizeof(DWORD));
/* Write the keys here */
RegSetValueEx(key, INTFKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regNetHackMode)), sizeof(DWORD));
NHSETREG_DWORD(INTFKEY, GetNHApp()->regNetHackMode);
/* Main window placement */
RegSetValueEx(key, MAINSHOWSTATEKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainShowState)), sizeof(DWORD));
RegSetValueEx(key, MAINMINXKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMinX)), sizeof(DWORD));
RegSetValueEx(key, MAINMINYKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMinY)), sizeof(DWORD));
RegSetValueEx(key, MAINMAXXKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMaxX)), sizeof(DWORD));
RegSetValueEx(key, MAINMAXYKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMaxY)), sizeof(DWORD));
RegSetValueEx(key, MAINLEFTKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainLeft)), sizeof(DWORD));
RegSetValueEx(key, MAINRIGHTKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainRight)), sizeof(DWORD));
RegSetValueEx(key, MAINTOPKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainTop)), sizeof(DWORD));
RegSetValueEx(key, MAINBOTTOMKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainBottom)), sizeof(DWORD));
NHSETREG_DWORD(MAINSHOWSTATEKEY, GetNHApp()->regMainShowState);
NHSETREG_DWORD(MAINMINXKEY, GetNHApp()->regMainMinX);
NHSETREG_DWORD(MAINMINYKEY, GetNHApp()->regMainMinY);
NHSETREG_DWORD(MAINMAXXKEY, GetNHApp()->regMainMaxX);
NHSETREG_DWORD(MAINMAXYKEY, GetNHApp()->regMainMaxY);
NHSETREG_DWORD(MAINLEFTKEY, GetNHApp()->regMainLeft);
NHSETREG_DWORD(MAINRIGHTKEY, GetNHApp()->regMainRight);
NHSETREG_DWORD(MAINTOPKEY, GetNHApp()->regMainTop);
NHSETREG_DWORD(MAINBOTTOMKEY, GetNHApp()->regMainBottom);
NHSETREG_DWORD(MAINAUTOLAYOUT, GetNHApp()->bAutoLayout);
NHSETREG_DWORD(MAPLEFT, GetNHApp()->rtMapWindow.left);
NHSETREG_DWORD(MAPRIGHT, GetNHApp()->rtMapWindow.right);
NHSETREG_DWORD(MAPTOP, GetNHApp()->rtMapWindow.top);
NHSETREG_DWORD(MAPBOTTOM, GetNHApp()->rtMapWindow.bottom);
NHSETREG_DWORD(MSGLEFT, GetNHApp()->rtMsgWindow.left);
NHSETREG_DWORD(MSGRIGHT, GetNHApp()->rtMsgWindow.right);
NHSETREG_DWORD(MSGTOP, GetNHApp()->rtMsgWindow.top);
NHSETREG_DWORD(MSGBOTTOM, GetNHApp()->rtMsgWindow.bottom);
NHSETREG_DWORD(STATUSLEFT, GetNHApp()->rtStatusWindow.left);
NHSETREG_DWORD(STATUSRIGHT, GetNHApp()->rtStatusWindow.right);
NHSETREG_DWORD(STATUSTOP, GetNHApp()->rtStatusWindow.top);
NHSETREG_DWORD(STATUSBOTTOM, GetNHApp()->rtStatusWindow.bottom);
NHSETREG_DWORD(MENULEFT, GetNHApp()->rtMenuWindow.left);
NHSETREG_DWORD(MENURIGHT, GetNHApp()->rtMenuWindow.right);
NHSETREG_DWORD(MENUTOP, GetNHApp()->rtMenuWindow.top);
NHSETREG_DWORD(MENUBOTTOM, GetNHApp()->rtMenuWindow.bottom);
NHSETREG_DWORD(TEXTLEFT, GetNHApp()->rtTextWindow.left);
NHSETREG_DWORD(TEXTRIGHT, GetNHApp()->rtTextWindow.right);
NHSETREG_DWORD(TEXTTOP, GetNHApp()->rtTextWindow.top);
NHSETREG_DWORD(TEXTBOTTOM, GetNHApp()->rtTextWindow.bottom);
NHSETREG_DWORD(TEXTLEFT, GetNHApp()->rtInvenWindow.left);
NHSETREG_DWORD(TEXTRIGHT, GetNHApp()->rtInvenWindow.right);
NHSETREG_DWORD(TEXTTOP, GetNHApp()->rtInvenWindow.top);
NHSETREG_DWORD(TEXTBOTTOM, GetNHApp()->rtInvenWindow.bottom);
#undef NHSETREG_DWORD
RegCloseKey(key);
}
@@ -2291,3 +2399,80 @@ static void mswin_color_from_string(char *colorstring, HBRUSH* brushptr, COLORRE
*brushptr = CreateSolidBrush(*colorptr);
brush_table[max_brush++] = *brushptr;
}
void mswin_get_window_placement(int type, LPRECT rt)
{
switch (type) {
case NHW_MAP:
*rt = GetNHApp()->rtMapWindow;
break;
case NHW_MESSAGE:
*rt = GetNHApp()->rtMsgWindow;
break;
case NHW_STATUS:
*rt = GetNHApp()->rtStatusWindow;
break;
case NHW_MENU:
*rt = GetNHApp()->rtMenuWindow;
break;
case NHW_TEXT:
*rt = GetNHApp()->rtTextWindow;
break;
case NHW_INVEN:
*rt = GetNHApp()->rtInvenWindow;
break;
default:
SetRect(rt, 0, 0, 0, 0);
break;
}
}
void mswin_update_window_placement(int type, LPRECT rt)
{
LPRECT rt_conf = NULL;
switch (type) {
case NHW_MAP:
rt_conf = &GetNHApp()->rtMapWindow;
break;
case NHW_MESSAGE:
rt_conf = &GetNHApp()->rtMsgWindow;
break;
case NHW_STATUS:
rt_conf = &GetNHApp()->rtStatusWindow;
break;
case NHW_MENU:
rt_conf = &GetNHApp()->rtMenuWindow;
break;
case NHW_TEXT:
rt_conf = &GetNHApp()->rtTextWindow;
break;
case NHW_INVEN:
rt_conf = &GetNHApp()->rtInvenWindow;
break;
}
if( rt_conf &&
!IsRectEmpty(rt) &&
!EqualRect(rt_conf, rt) )
{
*rt_conf = *rt;
/* if window changed size while the game is in progess -
it was most likely resized by the user */
if( program_state.something_worth_saving )
GetNHApp()->bAutoLayout = FALSE;
}
}

View File

@@ -136,6 +136,8 @@
#define IDM_MAP_FIT_TO_SCREEN 32792
#define IDM_NHMODE 32794
#define IDM_CLEARSETTINGS 32795
#define IDM_SETTING_AUTOLAYOUT 32796
#define IDM_SETTING_LOCKWINDOWS 32797
#define IDC_STATIC -1
// Next default values for new objects
@@ -143,7 +145,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 145
#define _APS_NEXT_COMMAND_VALUE 32796
#define _APS_NEXT_COMMAND_VALUE 32798
#define _APS_NEXT_CONTROL_VALUE 1332
#define _APS_NEXT_SYMED_VALUE 110
#endif

View File

@@ -16,7 +16,8 @@
#define MAXWINDOWS 15
#endif
#define NHW_RIP 32
#define NHW_RIP 32
#define NHW_INVEN 33
#ifndef TILE_X
#define TILE_X 16
@@ -77,6 +78,15 @@ typedef struct mswin_nhwindow_app {
LONG regMainBottom;
LONG regMainRight;
DWORD regMainShowState;
BOOL bAutoLayout;
RECT rtMapWindow;
RECT rtMsgWindow;
RECT rtStatusWindow;
RECT rtMenuWindow;
RECT rtTextWindow;
RECT rtInvenWindow;
BOOL bWindowsLocked; /* TRUE if windows are "locked" - no captions */
} NHWinApp, *PNHWinApp;
#define E extern
@@ -151,6 +161,9 @@ void mswin_read_reg(void);
void mswin_destroy_reg(void);
void mswin_write_reg(void);
void mswin_get_window_placement(int type, LPRECT rt);
void mswin_update_window_placement(int type, LPRECT rt);
extern HBRUSH menu_bg_brush;
extern HBRUSH menu_fg_brush;
extern HBRUSH text_bg_brush;
@@ -198,3 +211,4 @@ extern COLORREF message_fg_color;
#endif
#endif /* WINmswin_H */

View File

@@ -113,6 +113,9 @@ int APIENTRY WinMain(HINSTANCE hInstance,
_nethack_app.bNoVScroll = FALSE;
_nethack_app.saved_text = strdup("");
_nethack_app.bAutoLayout = TRUE;
_nethack_app.bWindowsLocked = TRUE;
// init controls
if (FAILED(GetComCtlVersion(&major, &minor)))
{

View File

@@ -69,6 +69,9 @@ BEGIN
MENUITEM "NetHack Mode", IDM_NHMODE
MENUITEM SEPARATOR
MENUITEM "&Clear All Settings", IDM_CLEARSETTINGS
MENUITEM SEPARATOR
MENUITEM "Auto &Arrange Windows", IDM_SETTING_AUTOLAYOUT
MENUITEM "&Lock Windows", IDM_SETTING_LOCKWINDOWS
END
POPUP "&Help"
BEGIN
@@ -116,24 +119,24 @@ END
IDD_NHTEXT DIALOGEX 0, 0, 172, 178
STYLE DS_SETFOREGROUND | WS_CHILD | WS_THICKFRAME
EXSTYLE WS_EX_STATICEDGE
FONT 8, "MS Sans Serif"
EXSTYLE WS_EX_CLIENTEDGE
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 |
EDITTEXT IDC_TEXT_CONTROL,0,0,172,160,ES_MULTILINE |
ES_OEMCONVERT | ES_READONLY | WS_VSCROLL | WS_HSCROLL
END
IDD_MENU DIALOGEX 0, 0, 187, 153
STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_THICKFRAME
EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE
FONT 8, "MS Sans Serif"
EXSTYLE WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT
PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT
LISTBOX IDC_MENU_LIST,10,10,170,55,LBS_SORT | WS_TABSTOP
DEFPUSHBUTTON "OK",IDOK,7,132,50,14,BS_FLAT | NOT WS_TABSTOP
PUSHBUTTON "Cancel",IDCANCEL,130,132,50,14,BS_FLAT | NOT WS_TABSTOP
LISTBOX IDC_MENU_LIST,10,10,170,55,LBS_SORT
EDITTEXT IDC_MENU_TEXT,10,70,170,60,ES_MULTILINE | ES_OEMCONVERT |
ES_READONLY | WS_VSCROLL | WS_HSCROLL
ES_READONLY | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP
END
IDD_GETLIN DIALOG DISCARDABLE 0, 0, 131, 29
@@ -192,7 +195,7 @@ END
IDD_NHRIP DIALOGEX 0, 0, 281, 209
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Here lies..."
FONT 8, "MS Sans Serif"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,82,188,50,14
END
@@ -203,7 +206,7 @@ CAPTION "Welcome to NetHack"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,224,236,50,14
EDITTEXT IDC_EXTRAINFO,7,191,267,37,ES_MULTILINE | ES_READONLY |
EDITTEXT IDC_EXTRAINFO,7,191,267,37,ES_MULTILINE | ES_READONLY |
WS_VSCROLL
END