1 /* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */
2 /* NetHack may be freely redistributed. See license for details. */
10 #define MAXWINDOWTEXT BUFSZ
12 typedef struct mswin_nethack_status_window {
14 char window_text[NHSW_LINES][MAXWINDOWTEXT+1];
15 } NHStatusWindow, *PNHStatusWindow;
17 static TCHAR szStatusWindowClass[] = TEXT("MSNHStatusWndClass");
18 LRESULT CALLBACK StatusWndProc(HWND, UINT, WPARAM, LPARAM);
19 static void register_status_window_class(void);
21 #define DEFAULT_COLOR_BG_STATUS COLOR_WINDOW
22 #define DEFAULT_COLOR_FG_STATUS COLOR_WINDOWTEXT
24 HWND mswin_init_status_window () {
25 static int run_once = 0;
30 register_status_window_class( );
37 WS_CHILD | WS_DISABLED | WS_CLIPSIBLINGS,
40 0, /* x-size - we will set it later */
41 0, /* y-size - we will set it later */
46 if( !ret ) panic("Cannot create status window");
48 EnableWindow(ret, FALSE);
50 data = (PNHStatusWindow)malloc(sizeof(NHStatusWindow));
51 if( !data ) panic("out of memory");
53 ZeroMemory(data, sizeof(NHStatusWindow));
54 SetWindowLong(ret, GWL_USERDATA, (LONG)data);
58 void register_status_window_class()
61 ZeroMemory( &wcex, sizeof(wcex));
63 wcex.style = CS_NOCLOSE;
64 wcex.lpfnWndProc = (WNDPROC)StatusWndProc;
67 wcex.hInstance = GetNHApp()->hApp;
69 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
70 wcex.hbrBackground = status_bg_brush
71 ? status_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_STATUS);
72 wcex.lpszMenuName = NULL;
73 wcex.lpszClassName = szStatusWindowClass;
79 LRESULT CALLBACK StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
86 data = (PNHStatusWindow)GetWindowLong(hWnd, GWL_USERDATA);
89 case WM_MSNH_COMMAND: {
91 case MSNH_MSG_PUTSTR: {
92 PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam;
93 strncpy(data->window_text[data->index], msg_data->text,
95 strncat(data->window_text[data->index], "\n",
96 MAXWINDOWTEXT-strlen(data->window_text[data->index]));
97 data->index = (data->index+1) % NHSW_LINES;
98 InvalidateRect(hWnd, NULL, TRUE);
101 case MSNH_MSG_CLEAR_WINDOW:
103 ZeroMemory(data->window_text, sizeof(data->window_text));
104 InvalidateRect(hWnd, NULL, TRUE);
114 COLORREF OldBg, OldFg;
116 hdc = BeginPaint(hWnd, &ps);
117 GetClientRect(hWnd, &rt);
119 oldFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
121 OldBg = SetBkColor(hdc, status_bg_brush
122 ? status_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_STATUS));
123 OldFg = SetTextColor(hdc, status_fg_brush
124 ? status_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_STATUS));
126 for(i=0; i<NHSW_LINES; i++ ) {
127 GetTextExtentPoint32(hdc, NH_A2W(data->window_text[i], wbuf, sizeof(wbuf)), strlen(data->window_text[i]), &sz);
128 NH_A2W(data->window_text[i], wbuf, BUFSZ);
129 DrawText(hdc, wbuf, strlen(data->window_text[i]), &rt, DT_LEFT | DT_END_ELLIPSIS);
133 SelectObject(hdc, oldFont);
134 SetTextColor (hdc, OldFg);
135 SetBkColor (hdc, OldBg);
141 SetWindowLong(hWnd, GWL_USERDATA, (LONG)0);
145 SetFocus(GetNHApp()->hMainWnd);
149 return DefWindowProc(hWnd, message, wParam, lParam);
154 void mswin_status_window_size (HWND hWnd, LPSIZE sz)
159 PNHStatusWindow data;
161 GetWindowRect(hWnd, &rt);
162 sz->cx = rt.right - rt.left;
163 sz->cy = rt.bottom - rt.top;
165 data = (PNHStatusWindow)GetWindowLong(hWnd, GWL_USERDATA);
168 saveFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
169 GetTextMetrics(hdc, &tm);
171 sz->cy = tm.tmHeight * NHSW_LINES;
173 SelectObject(hdc, saveFont);
174 ReleaseDC(hWnd, hdc);