1 /* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */
2 /* NetHack may be freely redistributed. See license for details. */
11 typedef struct mswin_nethack_text_window {
12 PNHTextBuffer window_text;
14 } NHTextWindow, *PNHTextWindow;
16 static WNDPROC editControlWndProc = NULL;
18 LRESULT CALLBACK TextWndProc(HWND, UINT, WPARAM, LPARAM);
19 LRESULT CALLBACK NHTextControlWndProc(HWND, UINT, WPARAM, LPARAM);
20 static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
21 static void LayoutText(HWND hwnd);
23 HWND mswin_init_text_window () {
29 MAKEINTRESOURCE(IDD_NHTEXT),
33 if( !ret ) panic("Cannot create text window");
35 data = (PNHTextWindow)malloc(sizeof(NHTextWindow));
36 if( !data ) panic("out of memory");
38 ZeroMemory(data, sizeof(NHTextWindow));
39 data->window_text = mswin_init_text_buffer(
40 program_state.gameover? FALSE : GetNHApp()->bWrapText
42 SetWindowLong(ret, GWL_USERDATA, (LONG)data);
46 void mswin_display_text_window (HWND hWnd)
50 data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
53 control = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
54 SendMessage(control, EM_FMTLINES, 1, 0 );
55 mswin_render_text(data->window_text, GetDlgItem(hWnd, IDC_TEXT_CONTROL));
58 mswin_popup_display(hWnd, &data->done);
59 mswin_popup_destroy(hWnd);
63 LRESULT CALLBACK TextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
69 data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
73 /* set text control font */
74 control = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
76 panic("cannot get text view window");
80 SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0);
81 ReleaseDC(control, hdc);
83 #if defined(WIN_CE_SMARTPHONE)
84 /* special initialization for SmartPhone dialogs */
85 NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen);
87 /* subclass edit control */
88 editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC);
89 SetWindowLong(control, GWL_WNDPROC, (LONG)NHTextControlWndProc);
91 if( !program_state.gameover && GetNHApp()->bWrapText ) {
93 styles = GetWindowLong(control, GWL_STYLE);
95 SetWindowLong(control, GWL_STYLE, styles & (~WS_HSCROLL));
96 SetWindowPos(control, NULL, 0, 0, 0, 0,
97 SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE );
104 case WM_MSNH_COMMAND:
105 onMSNHCommand(hWnd, wParam, lParam);
113 switch (LOWORD(wParam))
123 case WM_CTLCOLOREDIT:
124 case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */
125 HDC hdcEdit = (HDC) wParam;
126 HWND hwndEdit = (HWND) lParam;
127 if( hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL) ) {
128 SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG));
129 SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG));
130 return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG);
136 mswin_free_text_buffer(data->window_text);
138 SetWindowLong(hWnd, GWL_USERDATA, (LONG)0);
146 void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
150 data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
152 case MSNH_MSG_PUTSTR: {
153 PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam;
154 mswin_add_text(data->window_text, msg_data->attr, msg_data->text);
160 void LayoutText(HWND hWnd)
165 POINT pt_elem, pt_ok;
168 text = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
169 btn_ok = GetDlgItem(hWnd, IDOK);
171 /* get window coordinates */
172 GetClientRect(hWnd, &clrt );
174 /* set window placements */
175 if( IsWindow(btn_ok) ) {
176 GetWindowRect(btn_ok, &rt);
177 sz_ok.cx = clrt.right - clrt.left;
178 sz_ok.cy = rt.bottom-rt.top;
180 pt_ok.y = clrt.bottom - sz_ok.cy;
181 MoveWindow(btn_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
183 pt_elem.x = clrt.left;
184 pt_elem.y = clrt.top;
185 sz_elem.cx = clrt.right - clrt.left;
186 sz_elem.cy = pt_ok.y;
187 MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE );
189 pt_elem.x = clrt.left;
190 pt_elem.y = clrt.top;
191 sz_elem.cx = clrt.right - clrt.left;
192 sz_elem.cy = clrt.bottom - clrt.top;
193 MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE );
197 /* Text control window proc - implements close on space and scrolling on arrows */
198 LRESULT CALLBACK NHTextControlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
206 PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0);
211 PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL);
216 PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL);
221 PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINELEFT, 0), (LPARAM)NULL);
226 PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT, 0), (LPARAM)NULL);
229 break; /* case WM_KEYUP: */
232 if( editControlWndProc )
233 return CallWindowProc(editControlWndProc, hWnd, message, wParam, lParam);