iflags.wc_tile_file = (char *)alloc(strlen(op) + 1);
Strcpy(iflags.wc_tile_file, op);
}
+ return;
}
/* WINCAP
* tile_height:nn */
iflags.wc_align_message == ALIGN_RIGHT ? "right" :
"unknown");
else if (!strcmp(optname,"align_status"))
- Sprintf(buf, "%s", iflags.wc_align_message == ALIGN_TOP ? "top" :
- iflags.wc_align_message == ALIGN_LEFT ? "left" :
- iflags.wc_align_message == ALIGN_BOTTOM ? "bottom" :
- iflags.wc_align_message == ALIGN_RIGHT ? "right" :
+ Sprintf(buf, "%s", iflags.wc_align_status == ALIGN_TOP ? "top" :
+ iflags.wc_align_status == ALIGN_LEFT ? "left" :
+ iflags.wc_align_status == ALIGN_BOTTOM ? "bottom" :
+ iflags.wc_align_status == ALIGN_RIGHT ? "right" :
"unknown");
else if (!strcmp(optname,"align"))
Sprintf(buf, "%s", rolestring(flags.initalign, aligns, adj));
#define NHFONT_CODE(win, attr) (((attr&0xFF)<<8)|(win_type&0xFF))
+static void __cdecl font_table_cleanup(void);
/* create font based on window type, charater attributes and
window device context */
-HGDIOBJ mswin_create_font(int win_type, int attr, HDC hdc)
+HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace)
{
HFONT fnt = NULL;
LOGFONT lgfnt;
int font_size;
- int i;
+ int font_index;
+ static BOOL once = FALSE;
+
+ if( !once ) {
+ once = TRUE;
+ atexit(font_table_cleanup);
+ }
ZeroMemory( &lgfnt, sizeof(lgfnt) );
/* try find font in the table */
- for(i=0; i<font_table_size; i++) {
- if(NHFONT_CODE(win_type, attr)==font_table[i].code) {
- return font_table[i].hFont;
- }
- }
+ for(font_index=0; font_index<font_table_size; font_index++)
+ if(NHFONT_CODE(win_type, attr)==font_table[font_index].code)
+ break;
+
+ if( !replace && font_index<font_table_size )
+ return font_table[font_index].hFont;
switch(win_type) {
case NHW_STATUS:
- lgfnt.lfHeight = -8*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
+ lgfnt.lfHeight = -iflags.wc_fontsiz_status*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
lgfnt.lfWidth = 0; // average character width
lgfnt.lfEscapement = 0; // angle of escapement
lgfnt.lfOrientation = 0; // base-line orientation angle
lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision
lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision
lgfnt.lfQuality = DEFAULT_QUALITY; // output quality
- lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family
- /* lgfnt.lfFaceName */
+ if( iflags.wc_font_status &&
+ *iflags.wc_font_status ) {
+ lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family
+ NH_A2W( iflags.wc_font_status, lgfnt.lfFaceName, LF_FACESIZE);
+ } else {
+ lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family
+ }
break;
case NHW_MENU:
- font_size = (attr==ATR_INVERSE)? 8 : 8;
- lgfnt.lfHeight = -font_size*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
+ lgfnt.lfHeight = -iflags.wc_fontsiz_menu*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
lgfnt.lfWidth = 0; // average character width
lgfnt.lfEscapement = 0; // angle of escapement
lgfnt.lfOrientation = 0; // base-line orientation angle
lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision
lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision
lgfnt.lfQuality = DEFAULT_QUALITY; // output quality
- lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family
- /* lgfnt.lfFaceName */
+ if( iflags.wc_font_menu &&
+ *iflags.wc_font_menu ) {
+ lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family
+ NH_A2W( iflags.wc_font_menu, lgfnt.lfFaceName, LF_FACESIZE);
+ } else {
+ lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family
+ }
break;
case NHW_MESSAGE:
- font_size = (attr==ATR_INVERSE)? 10 : 9;
+ font_size = (attr==ATR_INVERSE)? iflags.wc_fontsiz_message+1 : iflags.wc_fontsiz_message;
lgfnt.lfHeight = -font_size*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
lgfnt.lfWidth = 0; // average character width
lgfnt.lfEscapement = 0; // angle of escapement
lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision
lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision
lgfnt.lfQuality = DEFAULT_QUALITY; // output quality
- lgfnt.lfPitchAndFamily = VARIABLE_PITCH; // pitch and family
- /* lgfnt.lfFaceName */
+ if( iflags.wc_font_message &&
+ *iflags.wc_font_message ) {
+ lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family
+ NH_A2W( iflags.wc_font_message, lgfnt.lfFaceName, LF_FACESIZE);
+ } else {
+ lgfnt.lfPitchAndFamily = VARIABLE_PITCH; // pitch and family
+ }
break;
case NHW_TEXT:
- lgfnt.lfHeight = -8*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
+ lgfnt.lfHeight = -iflags.wc_fontsiz_text*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font
lgfnt.lfWidth = 0; // average character width
lgfnt.lfEscapement = 0; // angle of escapement
lgfnt.lfOrientation = 0; // base-line orientation angle
lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision
lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision
lgfnt.lfQuality = DEFAULT_QUALITY; // output quality
- lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family
- /* lgfnt.lfFaceName */
+ if( iflags.wc_font_text &&
+ *iflags.wc_font_text ) {
+ lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family
+ NH_A2W( iflags.wc_font_text, lgfnt.lfFaceName, LF_FACESIZE);
+ } else {
+ lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family
+ }
break;
}
fnt = CreateFontIndirect(&lgfnt);
/* add font to the table */
- if( font_table_size>=MAXFONTS ) panic( "font table overflow!" );
-
- font_table[font_table_size].code = NHFONT_CODE(win_type, attr);
- font_table[font_table_size].hFont = fnt;
- font_table_size++;
+ if( font_index==font_table_size ) {
+ if( font_table_size>=MAXFONTS ) panic( "font table overflow!" );
+ font_table_size++;
+ } else {
+ DeleteObject(font_table[font_index].hFont);
+ }
+ font_table[font_index].code = NHFONT_CODE(win_type, attr);
+ font_table[font_index].hFont = fnt;
return fnt;
}
-/* dispose the font object */
-void mswin_destroy_font( HGDIOBJ fnt )
+void __cdecl font_table_cleanup(void)
{
- /* do nothing - we are going to reuse the font,
- then it will destroyed when application exits
- (at least I hope it will) */
-
- /* if(fnt) DeleteObject(fnt); */
+ int i;
+ for(i=0; i<font_table_size; i++) {
+ DeleteObject(font_table[i].hFont);
+ }
+ font_table_size = 0;
}
#include "winMS.h"
-HGDIOBJ mswin_create_font(int win_type, int attr, HDC hdc);
-void mswin_destroy_font( HGDIOBJ fnt );
+HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace);
#endif /* MSWINFont_h */
HWND child;
if( GetNHApp()->windowlist[msg_param->wid].type == NHW_MAP )
- select_map_mode(GetNHApp()->mapDisplayMode);
+ select_map_mode(iflags.wc_map_mode);
child = GetNHApp()->windowlist[msg_param->wid].win;
if( child ) mswin_layout_main_window(child);
/* set window positions */
SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right, client_rt.bottom);
- switch(GetNHApp()->winStatusAlign) {
- case NHWND_ALIGN_LEFT:
+ 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;
wnd_rect.left += status_size.cx;
break;
- case NHWND_ALIGN_RIGHT:
+ 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;
wnd_rect.right -= status_size.cx;
break;
- case NHWND_ALIGN_TOP:
+ 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 NHWND_ALIGN_BOTTOM:
+ case ALIGN_BOTTOM:
default:
status_size.cx = (wnd_rect.right-wnd_rect.left);
status_org.x = wnd_rect.left;
break;
}
- switch(GetNHApp()->winMessageAlign) {
- case NHWND_ALIGN_LEFT:
+ 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;
wnd_rect.left += msg_size.cx;
break;
- case NHWND_ALIGN_RIGHT:
+ 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;
wnd_rect.right -= msg_size.cx;
break;
- case NHWND_ALIGN_TOP:
+ 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 NHWND_ALIGN_BOTTOM:
+ case ALIGN_BOTTOM:
default:
msg_size.cx = (wnd_rect.right-wnd_rect.left);
msg_org.x = wnd_rect.left;
if( Is_rogue_level(&u.uz) ) return;
#endif
- GetNHApp()->mapDisplayMode = mode;
+ iflags.wc_map_mode = mode;
mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), mode);
}
int mapMode;
} _menu2mapmode[] =
{
- { IDM_MAP_TILES, NHMAP_VIEW_TILES },
- { IDM_MAP_ASCII4X6, NHMAP_VIEW_ASCII4x6 },
- { IDM_MAP_ASCII6X8, NHMAP_VIEW_ASCII6x8 },
- { IDM_MAP_ASCII8X8, NHMAP_VIEW_ASCII8x8 },
- { IDM_MAP_ASCII16X8, NHMAP_VIEW_ASCII16x8 },
- { IDM_MAP_ASCII7X12, NHMAP_VIEW_ASCII7x12 },
- { IDM_MAP_ASCII8X12, NHMAP_VIEW_ASCII8x12 },
- { IDM_MAP_ASCII12X16, NHMAP_VIEW_ASCII12x16 },
- { IDM_MAP_ASCII16X12, NHMAP_VIEW_ASCII16x12 },
- { IDM_MAP_ASCII10X18, NHMAP_VIEW_ASCII10x18 },
- { IDM_MAP_FIT_TO_SCREEN, NHMAP_VIEW_FIT_TO_SCREEN },
+ { IDM_MAP_TILES, MAP_MODE_TILES },
+ { IDM_MAP_ASCII4X6, MAP_MODE_ASCII4x6 },
+ { IDM_MAP_ASCII6X8, MAP_MODE_ASCII6x8 },
+ { IDM_MAP_ASCII8X8, MAP_MODE_ASCII8x8 },
+ { IDM_MAP_ASCII16X8, MAP_MODE_ASCII16x8 },
+ { IDM_MAP_ASCII7X12, MAP_MODE_ASCII7x12 },
+ { IDM_MAP_ASCII8X12, MAP_MODE_ASCII8x12 },
+ { IDM_MAP_ASCII12X16, MAP_MODE_ASCII16x12 },
+ { IDM_MAP_ASCII16X12, MAP_MODE_ASCII12x16 },
+ { IDM_MAP_ASCII10X18, MAP_MODE_ASCII10x18 },
+ { IDM_MAP_FIT_TO_SCREEN, MAP_MODE_ASCII_FIT_TO_SCREEN },
{ -1, -1 }
};
#include "winMS.h"
-#define NHWND_ALIGN_LEFT 0
-#define NHWND_ALIGN_RIGHT 1
-#define NHWND_ALIGN_TOP 2
-#define NHWND_ALIGN_BOTTOM 3
-
HWND mswin_init_main_window (void);
void mswin_layout_main_window(HWND changed_child);
/* set new screen tile size */
data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA);
- data->xScrTile = ((data->mapMode==NHMAP_VIEW_FIT_TO_SCREEN)? wnd_size.cx : lpsz->cx) / COLNO;
- data->yScrTile = ((data->mapMode==NHMAP_VIEW_FIT_TO_SCREEN)? wnd_size.cy : lpsz->cy) / ROWNO;
+ data->xScrTile = ((data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN)? wnd_size.cx : lpsz->cx) / COLNO;
+ data->yScrTile = ((data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN)? wnd_size.cy : lpsz->cy) / ROWNO;
/* set map origin point */
data->map_orig.x = max(0, client_rt.left + (wnd_size.cx - data->xScrTile*COLNO)/2 );
data->map_orig.y -= data->map_orig.y % data->yScrTile;
/* adjust horizontal scroll bar */
- if( data->mapMode==NHMAP_VIEW_FIT_TO_SCREEN )
+ if( data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN )
data->xPageSize = COLNO+1; /* disable scroll bar */
else
data->xPageSize = wnd_size.cx/data->xScrTile;
SetScrollInfo(hWnd, SB_HORZ, &si, TRUE);
/* adjust vertical scroll bar */
- if( data->mapMode==NHMAP_VIEW_FIT_TO_SCREEN )
+ if( data->mapMode==MAP_MODE_ASCII_FIT_TO_SCREEN )
data->yPageSize = ROWNO+1; /* disable scroll bar */
else
data->yPageSize = wnd_size.cy/data->yScrTile;
switch( data->mapMode ) {
- case NHMAP_VIEW_ASCII4x6:
+ case MAP_MODE_ASCII4x6:
data->bAsciiMode = TRUE;
mapSize.cx = 4*COLNO;
mapSize.cy = 6*ROWNO;
break;
- case NHMAP_VIEW_ASCII6x8:
+ case MAP_MODE_ASCII6x8:
data->bAsciiMode = TRUE;
mapSize.cx = 6*COLNO;
mapSize.cy = 8*ROWNO;
break;
- case NHMAP_VIEW_ASCII8x8:
+ case MAP_MODE_ASCII8x8:
data->bAsciiMode = TRUE;
mapSize.cx = 8*COLNO;
mapSize.cy = 8*ROWNO;
break;
- case NHMAP_VIEW_ASCII16x8:
+ case MAP_MODE_ASCII16x8:
data->bAsciiMode = TRUE;
mapSize.cx = 16*COLNO;
mapSize.cy = 8*ROWNO;
break;
- case NHMAP_VIEW_ASCII7x12:
+ case MAP_MODE_ASCII7x12:
data->bAsciiMode = TRUE;
mapSize.cx = 7*COLNO;
mapSize.cy = 12*ROWNO;
break;
- case NHMAP_VIEW_ASCII8x12:
+ case MAP_MODE_ASCII8x12:
data->bAsciiMode = TRUE;
mapSize.cx = 8*COLNO;
mapSize.cy = 12*ROWNO;
break;
- case NHMAP_VIEW_ASCII16x12:
+ case MAP_MODE_ASCII16x12:
data->bAsciiMode = TRUE;
mapSize.cx = 16*COLNO;
mapSize.cy = 12*ROWNO;
break;
- case NHMAP_VIEW_ASCII12x16:
+ case MAP_MODE_ASCII12x16:
data->bAsciiMode = TRUE;
mapSize.cx = 12*COLNO;
mapSize.cy = 16*ROWNO;
break;
- case NHMAP_VIEW_ASCII10x18:
+ case MAP_MODE_ASCII10x18:
data->bAsciiMode = TRUE;
mapSize.cx = 10*COLNO;
mapSize.cy = 18*ROWNO;
break;
- case NHMAP_VIEW_FIT_TO_SCREEN: {
+ case MAP_MODE_ASCII_FIT_TO_SCREEN: {
RECT client_rt;
GetClientRect(hWnd, &client_rt);
mapSize.cx = client_rt.right - client_rt.left;
data->bAsciiMode = TRUE;
} break;
- case NHMAP_VIEW_TILES:
+ case MAP_MODE_TILES:
default:
data->bAsciiMode = FALSE;
- mapSize.cx = TILE_X*COLNO;
- mapSize.cy = TILE_Y*ROWNO;
+ mapSize.cx = GetNHApp()->mapTile_X*COLNO;
+ mapSize.cy = GetNHApp()->mapTile_Y*ROWNO;
break;
}
{
SIZE size;
- if( data->mapMode == NHMAP_VIEW_FIT_TO_SCREEN ) {
+ if( data->mapMode == MAP_MODE_ASCII_FIT_TO_SCREEN ) {
size.cx = LOWORD(lParam);
size.cy = HIWORD(lParam);
} else {
PMSNHMsgClipAround msg_data = (PMSNHMsgClipAround)lParam;
int x, y;
BOOL scroll_x, scroll_y;
- int mcam = GetNHApp()->mapCliparoundMargin;
+ int mcam = iflags.wc_scroll_margin;
/* calculate if you should clip around */
scroll_x =
data->bAsciiMode = FALSE;
- data->xScrTile = TILE_X;
- data->yScrTile = TILE_Y;
+ data->xScrTile = GetNHApp()->mapTile_X;
+ data->yScrTile = GetNHApp()->mapTile_Y;
SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
}
} else {
/* prepare tiles DC for mapping */
tileDC = CreateCompatibleDC(hDC);
- saveBmp = SelectObject(tileDC, GetNHApp()->bmpTiles);
+ saveBmp = SelectObject(tileDC, GetNHApp()->bmpMapTiles);
/* draw the map */
for(i=paint_rt.left; i<paint_rt.right; i++)
RECT glyph_rect;
ntile = glyph2tile[ data->map[i][j] ];
- t_x = (ntile % TILES_PER_LINE)*TILE_X;
- t_y = (ntile / TILES_PER_LINE)*TILE_Y;
+ t_x = (ntile % GetNHApp()->mapTilesPerLine)*GetNHApp()->mapTile_X;
+ t_y = (ntile / GetNHApp()->mapTilesPerLine)*GetNHApp()->mapTile_Y;
nhcoord2display(data, i, j, &glyph_rect);
tileDC,
t_x,
t_y,
- TILE_X,
- TILE_Y,
+ GetNHApp()->mapTile_X,
+ GetNHApp()->mapTile_Y,
SRCCOPY
);
- if( glyph_is_pet(data->map[i][j]) && iflags.hilite_pet ) {
+ if( glyph_is_pet(data->map[i][j]) && iflags.wc_hilite_pet ) {
/* apply pet mark transparently over
pet image */
HDC hdcPetMark;
HWND mswin_init_map_window (void);
void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw);
-#define NHMAP_VIEW_TILES 0
-#define NHMAP_VIEW_ASCII4x6 1
-#define NHMAP_VIEW_ASCII6x8 2
-#define NHMAP_VIEW_ASCII8x8 3
-#define NHMAP_VIEW_ASCII16x8 4
-#define NHMAP_VIEW_ASCII7x12 5
-#define NHMAP_VIEW_ASCII8x12 6
-#define NHMAP_VIEW_ASCII16x12 7
-#define NHMAP_VIEW_ASCII12x16 8
-#define NHMAP_VIEW_ASCII10x18 9
-#define NHMAP_VIEW_FIT_TO_SCREEN 10
-
int mswin_map_mode(HWND hWnd, int mode);
-#define ROGUE_LEVEL_MAP_MODE NHMAP_VIEW_ASCII12x16
+#define ROGUE_LEVEL_MAP_MODE MAP_MODE_ASCII12x16
#define DEF_CLIPAROUND_MARGIN 5
BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PNHMenuWindow data;
+ HWND control;
+ HDC hdc;
data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA);
switch (message)
data->bmpNotChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL));
SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
+ /* set font for the text cotrol */
+ control = GetDlgItem(hWnd, IDC_MENU_TEXT);
+ hdc = GetDC(control);
+ SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE), (LPARAM)0);
+ ReleaseDC(control, hdc);
+
/* subclass edit control */
- editControlWndProc = (WNDPROC)GetWindowLong(GetDlgItem(hWnd, IDC_MENU_TEXT), GWL_WNDPROC);
- SetWindowLong(GetDlgItem(hWnd, IDC_MENU_TEXT), GWL_WNDPROC, (LONG)NHMenuTextWndProc);
+ editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC);
+ SetWindowLong(control, GWL_WNDPROC, (LONG)NHMenuTextWndProc);
break;
case WM_MSNH_COMMAND:
GetClientRect(GetMenuControl(hWnd), &list_rect);
hdc = GetDC(GetMenuControl(hWnd));
- saveFont = SelectObject(hdc, mswin_create_font(NHW_MENU, ATR_INVERSE, hdc));
+ saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_INVERSE, hdc, FALSE));
GetTextMetrics(hdc, &tm);
/* Set the height of the list box items. */
lpmis->itemHeight = max(tm.tmHeight, TILE_Y)+2;
lpmis->itemWidth = list_rect.right - list_rect.left;
- mswin_destroy_font(SelectObject(hdc, saveFont));
+ SelectObject(hdc, saveFont);
ReleaseDC(GetMenuControl(hWnd), hdc);
return TRUE;
}
item = &data->menu.items[lpdis->itemID];
tileDC = CreateCompatibleDC(lpdis->hDC);
- saveFont = SelectObject(lpdis->hDC, mswin_create_font(NHW_MENU, item->attr, lpdis->hDC));
+ saveFont = SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, item->attr, lpdis->hDC, FALSE));
GetTextMetrics(lpdis->hDC, &tm);
x = lpdis->rcItem.left + 1;
_stprintf(wbuf, TEXT("Count: %d"), data->menu.items[lpdis->itemID].count );
}
- SelectObject(lpdis->hDC, mswin_create_font(NHW_MENU, ATR_BLINK, lpdis->hDC));
+ SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, ATR_BLINK, lpdis->hDC, FALSE));
/* calculate text rectangle */
SetRect( &drawRect, client_rt.left, lpdis->rcItem.top, client_rt.right, lpdis->rcItem.bottom );
DrawFocusRect(lpdis->hDC, &drawRect);
}
- mswin_destroy_font(SelectObject(lpdis->hDC, saveFont));
+ SelectObject(lpdis->hDC, saveFont);
DeleteDC(tileDC);
return TRUE;
}
void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
{
TEXTMETRIC tm;
+ HWND control;
HGDIOBJ saveFont;
HDC hdc;
PNHMenuWindow data;
int i;
RECT rt;
- GetWindowRect(hWnd, &rt);
+ GetClientRect(hWnd, &rt);
sz->cx = rt.right - rt.left;
sz->cy = rt.bottom - rt.top;
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_NONE, hdc));
- GetTextMetrics(hdc, &tm);
-
- /* Set the height of the list box items. */
- for(i=0; i<data->menu.size; i++ ) {
- sz->cx = max(sz->cx,
- (LONG)(2*TILE_X + tm.tmMaxCharWidth*(strlen(data->menu.items[i].str)+10)));
+ if(data) {
+ control = GetMenuControl(hWnd);
+ hdc = GetDC(control);
+
+ if( data->type==MENU_TYPE_MENU ) {
+ /* Set the height of the list box items. */
+ saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
+ GetTextMetrics(hdc, &tm);
+ for(i=0; i<data->menu.size; i++ ) {
+ sz->cx = max(sz->cx,
+ (LONG)(2*TILE_X + tm.tmAveCharWidth*(strlen(data->menu.items[i].str)+12) + tm.tmOverhang));
+ }
+ SelectObject(hdc, saveFont);
+ } else {
+ RECT text_rt;
+ saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
+ GetTextMetrics(hdc, &tm);
+ SetRect(&text_rt, 0, 0, sz->cx, sz->cy);
+ DrawText(hdc, data->text.text, _tcslen(data->text.text), &text_rt, DT_CALCRECT | DT_TOP | DT_LEFT | DT_NOPREFIX);
+ sz->cx = max(sz->cx, text_rt.right - text_rt.left + 5*tm.tmAveCharWidth + tm.tmOverhang);
+ SelectObject(hdc, saveFont);
}
+ sz->cx += GetSystemMetrics(SM_CXVSCROLL) + 2*GetSystemMetrics(SM_CXSIZEFRAME);
- mswin_destroy_font(SelectObject(hdc, saveFont));
- ReleaseDC(GetMenuControl(hWnd), hdc);
+ ReleaseDC(control, hdc);
}
}
style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL;
#endif
- ret = CreateWindow(
+ ret = CreateWindowEx(
+ WS_EX_CLIENTEDGE,
szMessageWindowClass, /* registered class name */
NULL, /* window name */
style, /* window style */
x = data->xChar * (4 - data->xPos);
}
-
if( strlen(data->window_text[i].text)>0 ) {
/* convert to UNICODE */
NH_A2W(data->window_text[i].text, wbuf, sizeof(wbuf));
draw_rt.top = y - data->yChar;
draw_rt.bottom = y;
- oldFont = SelectObject(hdc, mswin_create_font(NHW_MESSAGE, data->window_text[i].attr, hdc));
+ oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[i].attr, hdc, FALSE));
#ifdef MSG_WRAP_TEXT
DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
#else
DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX );
#endif
- mswin_destroy_font(SelectObject(hdc, oldFont));
+ SelectObject(hdc, oldFont);
y -= draw_rt.bottom - draw_rt.top;
} else {
/* Get the handle to the client area's device context. */
hdc = prepareDC( GetDC(hWnd) );
- saveFont = SelectObject(hdc, mswin_create_font(NHW_MESSAGE, ATR_NONE, hdc));
+ saveFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, FALSE));
/* Extract font dimensions from the text metrics. */
GetTextMetrics (hdc, &tm);
data->xPage = 1;
/* Free the device context. */
- mswin_destroy_font(SelectObject(hdc, saveFont));
+ SelectObject(hdc, saveFont);
ReleaseDC (hWnd, hdc);
}
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rt);
- oldFont = SelectObject(hdc, mswin_create_font(NHW_STATUS, ATR_NONE, hdc));
+ oldFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
for(i=0; i<NHSW_LINES; i++ ) {
GetTextExtentPoint32(hdc, NH_A2W(data->window_text[i], wbuf, sizeof(wbuf)), strlen(data->window_text[i]), &sz);
rt.top += sz.cy;
}
- mswin_destroy_font(SelectObject(hdc, oldFont));
+ SelectObject(hdc, oldFont);
EndPaint(hWnd, &ps);
} break;
data = (PNHStatusWindow)GetWindowLong(hWnd, GWL_USERDATA);
if(data) {
hdc = GetDC(hWnd);
- saveFont = SelectObject(hdc, mswin_create_font(NHW_STATUS, ATR_NONE, hdc));
+ saveFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
GetTextMetrics(hdc, &tm);
sz->cy = tm.tmHeight * NHSW_LINES;
- mswin_destroy_font(SelectObject(hdc, saveFont));
+ SelectObject(hdc, saveFont);
ReleaseDC(hWnd, hdc);
}
}
\ No newline at end of file
}
hdc = GetDC(control);
- SendMessage(control, WM_SETFONT, (WPARAM)mswin_create_font(NHW_TEXT, ATR_NONE, hdc), 0);
+ SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0);
ReleaseDC(control, hdc);
/* subclass edit control */
struct window_procs mswin_procs = {
"MSWIN",
WC_COLOR|WC_HILITE_PET|WC_ALIGN_MESSAGE|WC_ALIGN_STATUS|
- WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE,
+ WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE|
+ WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|
+ WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT|
+ WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE,
mswin_init_nhwindows,
mswin_player_selection,
mswin_askname,
if( Is_rogue_level(&u.uz) )
mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), ROGUE_LEVEL_MAP_MODE);
else
- mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), GetNHApp()->mapDisplayMode);
+ mswin_map_mode(mswin_hwnd_from_winid(WIN_MAP), iflags.wc_map_mode);
#endif
}
((def == 'y') ? MB_DEFBUTTON1 :
(def == 'n') ? MB_DEFBUTTON2 : MB_DEFBUTTON3));
free(text);
- GetNHApp()->saved_text = strdup(TEXT(""));
+ GetNHApp()->saved_text = strdup("");
return box_result == IDYES ? 'y' : box_result == IDNO ? 'n' : '\033';
}
/* tile background color */
#define TILE_BK_COLOR RGB(71, 108, 108)
+/* minimum/maximum font size (in points - 1/72 inch) */
+#define NHFONT_DEFAULT_SIZE 9
+#define NHFONT_SIZE_MIN 3
+#define NHFONT_SIZE_MAX 20
+
typedef struct mswin_nhwindow_data {
HWND win;
int type;
HBITMAP bmpTiles;
HBITMAP bmpPetMark;
+ HBITMAP bmpMapTiles; /* custom tiles bitmap */
+ int mapTile_X; /* tile width */
+ int mapTile_Y; /* tile height */
+ int mapTilesPerLine; /* number of tile per row in the bitmap */
boolean bNoHScroll; /* disable cliparound for horizontal grid (map) */
boolean bNoVScroll; /* disable cliparound for vertical grid (map) */
- int mapDisplayMode; /* regular map display mode */
int mapDisplayModeSave; /* saved map display mode */
- int mapCliparoundMargin; /* when to scroll display */
-
- int winStatusAlign; /* alignment of the status window */
- int winMessageAlign; /* alignment of the status window */
char* saved_text;
} NHWinApp, *PNHWinApp;
extern void FDECL(pcmain, (int,char **));
static void __cdecl mswin_moveloop(void *);
+static BOOL initMapTiles(void);
#define MAX_CMDLINE_PARAM 255
if( _nethack_app.bmpTiles==NULL ) panic("cannot load tiles bitmap");
_nethack_app.bmpPetMark = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_PETMARK));
if( _nethack_app.bmpPetMark==NULL ) panic("cannot load pet mark bitmap");
+ _nethack_app.bmpMapTiles = _nethack_app.bmpTiles;
+ _nethack_app.mapTile_X = TILE_X;
+ _nethack_app.mapTile_Y = TILE_Y;
+ _nethack_app.mapTilesPerLine = TILES_PER_LINE;
+
_nethack_app.bNoHScroll = FALSE;
_nethack_app.bNoVScroll = FALSE;
- _nethack_app.mapDisplayMode = NHMAP_VIEW_TILES;
- _nethack_app.winStatusAlign = NHWND_ALIGN_BOTTOM;
- _nethack_app.winMessageAlign = NHWND_ALIGN_TOP;
- _nethack_app.mapCliparoundMargin = DEF_CLIPAROUND_MARGIN;
- _nethack_app.saved_text = strdup(TEXT(""));
+ _nethack_app.saved_text = strdup("");
// init controls
ZeroMemory(&InitCtrls, sizeof(InitCtrls));
pcmain(argc,argv);
+ /* initialize map tiles bitmap */
+ initMapTiles();
+
moveloop();
return 0;
return &_nethack_app;
}
-/* options */
-struct t_win32_opt_int {
- const char* val;
- int opt;
-};
-static struct t_win32_opt_int _win32_map_mode[] =
-{
- { "tiles", NHMAP_VIEW_TILES },
- { "ascii4x6", NHMAP_VIEW_ASCII4x6 },
- { "ascii6x8", NHMAP_VIEW_ASCII6x8 },
- { "ascii8x8", NHMAP_VIEW_ASCII8x8 },
- { "ascii16x8", NHMAP_VIEW_ASCII16x8 },
- { "ascii7x12", NHMAP_VIEW_ASCII7x12 },
- { "ascii8x12", NHMAP_VIEW_ASCII8x12 },
- { "ascii16x12", NHMAP_VIEW_ASCII16x12 },
- { "ascii12x16", NHMAP_VIEW_ASCII12x16 },
- { "ascii10x18", NHMAP_VIEW_ASCII10x18 },
- { "fit_to_screen", NHMAP_VIEW_FIT_TO_SCREEN },
- { NULL, -1 }
-};
-
-static struct t_win32_opt_int _win32_align[] =
+BOOL initMapTiles(void)
{
- { "left", NHWND_ALIGN_LEFT },
- { "right", NHWND_ALIGN_RIGHT },
- { "top", NHWND_ALIGN_TOP },
- { "bottom", NHWND_ALIGN_BOTTOM },
- { NULL, -1 }
-};
-
-int set_win32_option( const char * name, const char * val)
-{
- struct t_win32_opt_int* p;
- if( _stricmp(name, "win32_map_mode")==0 ) {
- for( p=_win32_map_mode; p->val; p++ ) {
- if( _stricmp(p->val, val)==0 ){
- GetNHApp()->mapDisplayMode = p->opt;
- return 1;
- }
- }
- return 0;
- } else if( _stricmp(name, "win32_align_status")==0 ) {
- for( p=_win32_align; p->val; p++ ) {
- if( _stricmp(p->val, val)==0 ) {
- GetNHApp()->winStatusAlign = p->opt;
- return 1;
- }
- }
- return 0;
- } else if( _stricmp(name, "win32_align_message")==0 ) {
- for( p=_win32_align; p->val; p++ ) {
- if( _stricmp(p->val, val)==0 ) {
- GetNHApp()->winMessageAlign = p->opt;
- return 1;
- }
- }
- return 0;
- } else if( _stricmp(name, "win32_map_cliparound_margin")==0 ) {
- int tmp = atoi(val);
- /* Alex, this range should be revisited and groundtruthed */
- if( tmp >= DEF_CLIPAROUND_MARGIN && tmp < COLNO/2) {
- GetNHApp()->mapCliparoundMargin = tmp;
- return 1;
- }
+ HBITMAP hBmp;
+ BITMAP bm;
+ TCHAR wbuf[MAX_PATH];
+ int tl_num;
+ SIZE map_size;
+ extern int total_tiles_used;
+
+ /* no file - no tile */
+ if( !(iflags.wc_tile_file && *iflags.wc_tile_file) )
+ return TRUE;
+
+ /* load bitmap */
+ hBmp = LoadImage(
+ GetNHApp()->hApp,
+ NH_A2W(iflags.wc_tile_file, wbuf, MAX_PATH),
+ IMAGE_BITMAP,
+ 0,
+ 0,
+ LR_LOADFROMFILE | LR_DEFAULTSIZE
+ );
+ if( hBmp==NULL ) {
+ raw_print("Cannot load tiles from the file. Reverting back to default.");
+ return FALSE;
}
- return 0;
+
+ /* calculate tile dimensions */
+ GetObject(hBmp, sizeof(BITMAP), (LPVOID)&bm);
+ if( bm.bmWidth%iflags.wc_tile_width ||
+ bm.bmHeight%iflags.wc_tile_height ) {
+ DeleteObject(hBmp);
+ raw_print("Tiles bitmap does not match tile_width and tile_height options. Reverting back to default.");
+ return FALSE;
+ }
+
+ tl_num = (bm.bmWidth/iflags.wc_tile_width)*
+ (bm.bmHeight/iflags.wc_tile_height);
+ if( tl_num<total_tiles_used ) {
+ DeleteObject(hBmp);
+ raw_print("Number of tiles in the bitmap is less than required by the game. Reverting back to default.");
+ return FALSE;
+ }
+
+ /* set the tile information */
+ if( GetNHApp()->bmpMapTiles!=GetNHApp()->bmpTiles ) {
+ DeleteObject(GetNHApp()->bmpMapTiles);
+ }
+
+ GetNHApp()->bmpMapTiles = hBmp;
+ GetNHApp()->mapTile_X = iflags.wc_tile_width;
+ GetNHApp()->mapTile_Y = iflags.wc_tile_height;
+ GetNHApp()->mapTilesPerLine = bm.bmWidth / iflags.wc_tile_width;
+
+ map_size.cx = GetNHApp()->mapTile_X * COLNO;
+ map_size.cy = GetNHApp()->mapTile_Y * ROWNO;
+ mswin_map_stretch(
+ mswin_hwnd_from_winid(WIN_MAP),
+ &map_size,
+ TRUE
+ );
+ return TRUE;
}