Exemple #1
0
LRESULT CALLBACK TextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND control;
    HDC hdc;
    PNHTextWindow data;

    data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
    switch (message) {
    case WM_INITDIALOG:
        /* set text control font */
        control = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
        if( !control ) {
            panic("cannot get text view window");
        }

        hdc = GetDC(control);
        SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0);
        ReleaseDC(control, hdc);

#if defined(WIN_CE_SMARTPHONE)
        /* special initialization for SmartPhone dialogs */
        NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen);
#endif
        /* subclass edit control */
        editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC);
        SetWindowLong(control, GWL_WNDPROC, (LONG)NHTextControlWndProc);

        if( !program_state.gameover && GetNHApp()->bWrapText ) {
            DWORD styles;
            styles = GetWindowLong(control, GWL_STYLE);
            if( styles ) {
                SetWindowLong(control, GWL_STYLE, styles & (~WS_HSCROLL));
                SetWindowPos(control, NULL, 0, 0, 0, 0,
                             SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE );
            }
        }

        SetFocus(control);
        return FALSE;

    case WM_MSNH_COMMAND:
        onMSNHCommand(hWnd, wParam, lParam);
        break;

    case WM_SIZE:
        LayoutText(hWnd);
        return FALSE;

    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDOK:
        case IDCANCEL:
            data->done = 1;
            return TRUE;
        }
        break;

    case WM_CTLCOLORBTN:
    case WM_CTLCOLOREDIT:
    case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */
        HDC hdcEdit = (HDC) wParam;
        HWND hwndEdit = (HWND) lParam;
        if( hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL) ) {
            SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG));
            SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG));
            return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG);
        }
    }
    return FALSE;

    case WM_DESTROY:
        if( data ) {
            mswin_free_text_buffer(data->window_text);
            free(data);
            SetWindowLong(hWnd, GWL_USERDATA, (LONG)0);
        }
        break;

    }
    return FALSE;
}
Exemple #2
0
LRESULT CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PNHMenuWindow data;
	
	CheckInputDialog(hWnd, message, wParam, lParam);	

	data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA);
	switch (message) 
	{
	case WM_INITDIALOG: {
		HWND text_control;
		HDC hDC;

		text_control = GetDlgItem(hWnd, IDC_MENU_TEXT);

		data = (PNHMenuWindow)malloc(sizeof(NHMenuWindow));
		ZeroMemory(data, sizeof(NHMenuWindow));
		data->type = MENU_TYPE_TEXT;
		data->how = PICK_NONE;
		data->result = 0;
		data->done = 0;
		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));
		SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);

		/* subclass edit control */
		editControlWndProc = (WNDPROC)GetWindowLong(text_control, GWL_WNDPROC);
		SetWindowLong(text_control, GWL_WNDPROC, (LONG)NHMenuTextWndProc);

		/* set text window font */
		hDC = GetDC(text_control);
		SendMessage(
			text_control, 
			WM_SETFONT, 
			(WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hDC, FALSE),
			(LPARAM)0
		);
		ReleaseDC(text_control, hDC);

#if defined(WIN_CE_SMARTPHONE)
		/* special initialization for SmartPhone dialogs */ 
		NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen);
#endif
	} break;

	case WM_MSNH_COMMAND:
		onMSNHCommand(hWnd, wParam, lParam);
	break;

	case WM_SIZE:
		LayoutMenu(hWnd);
	return FALSE;

	case WM_COMMAND: 
	{
		switch (LOWORD(wParam)) 
        { 
		case IDCANCEL:
			if( data->type == MENU_TYPE_MENU && 
			    (data->how==PICK_ONE || data->how==PICK_ANY) &&
			    data->menu.counting) {
				HWND list;
				int i;

				/* reset counter if counting is in progress */
				list = GetMenuControl(hWnd);
				i = ListView_GetNextItem(list, -1,	LVNI_FOCUSED);
				if( i>=0 ) {
					SelectMenuItem(list, data, i,  0);
				}
				return FALSE;
			} else {
				data->result = -1;
				data->done = 1;
			}
		return FALSE;

		case IDOK:
			data->done = 1;
			data->result = 0;
		return FALSE;
		}
	} break;

	case WM_NOTIFY:
	{
		LPNMHDR	lpnmhdr = (LPNMHDR)lParam;
		switch (LOWORD(wParam)) {
		case IDC_MENU_LIST:
		{
			if( !data || data->type!=MENU_TYPE_MENU ) break;

			switch(lpnmhdr->code) {
			case LVN_ITEMACTIVATE: 
			{
				LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam;
				if(data->how==PICK_ONE) {
					if( lpnmlv->iItem>=0 &&
						lpnmlv->iItem<data->menu.size &&
						NHMENU_IS_SELECTABLE(data->menu.items[lpnmlv->iItem]) ) {
						SelectMenuItem(
							lpnmlv->hdr.hwndFrom, 
							data, 
							lpnmlv->iItem, 
							-1
						);
						data->done = 1;
						data->result = 0;
						return TRUE;
					}
				} else if( data->how==PICK_ANY ) {
					if( lpnmlv->iItem>=0 &&
						lpnmlv->iItem<data->menu.size &&
						NHMENU_IS_SELECTABLE(data->menu.items[lpnmlv->iItem]) ) {
						SelectMenuItem(
							lpnmlv->hdr.hwndFrom, 
							data, 
							lpnmlv->iItem, 
							NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem])? 0 : -1
						);
					}
				}
			} break;

			case NM_CLICK: {
				LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam;
				if( lpnmlv->iItem==-1 ) return 0;
				if( data->how==PICK_ANY ) {
					SelectMenuItem(
						lpnmlv->hdr.hwndFrom, 
						data, 
						lpnmlv->iItem, 
						NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem])? 0 : -1
					);
				}
			} break;

			case LVN_ITEMCHANGED: 
			{
				LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam;
				if( lpnmlv->iItem==-1 ) return 0;
				if( !(lpnmlv->uChanged & LVIF_STATE) ) return 0;

				/* update item that has the focus */
				data->menu.items[lpnmlv->iItem].has_focus = !!(lpnmlv->uNewState & LVIS_FOCUSED);
				ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, lpnmlv->iItem);

				/* update count for single-selection menu (follow the listview selection) */
				if( data->how==PICK_ONE ) {
					if( lpnmlv->uNewState & LVIS_SELECTED ) {
						SelectMenuItem(
							lpnmlv->hdr.hwndFrom, 
							data, 
							lpnmlv->iItem, 
							-1
						);
					}
				}

				/* check item focus */
				data->menu.items[lpnmlv->iItem].has_focus = !!(lpnmlv->uNewState & LVIS_FOCUSED);
				ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, lpnmlv->iItem);
			} break;

			case NM_KILLFOCUS:
				reset_menu_count(lpnmhdr->hwndFrom, data);
			break;

			}
		} break;
		}
	} break;

	case WM_SETFOCUS:
		if( hWnd!=GetNHApp()->hPopupWnd ) {
			SetFocus(GetNHApp()->hPopupWnd );
			return 0;
		}
	break;
	
    case WM_MEASUREITEM: 
		if( wParam==IDC_MENU_LIST )
			return onMeasureItem(hWnd, wParam, lParam);
		else
			return FALSE;

    case WM_DRAWITEM:
		if( wParam==IDC_MENU_LIST )
			return onDrawItem(hWnd, wParam, lParam);
		else
			return FALSE;

	case WM_CTLCOLORBTN:
	case WM_CTLCOLOREDIT:
	case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */
		HDC hdcEdit = (HDC) wParam; 
		HWND hwndEdit = (HWND) lParam;
		if( hwndEdit == GetDlgItem(hWnd, IDC_MENU_TEXT) ) {
			SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG));
			SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); 
			return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG);
		}
	} return FALSE;

	case WM_DESTROY:
		if( data ) {
			DeleteObject(data->bmpChecked);
			DeleteObject(data->bmpCheckedCount);
			DeleteObject(data->bmpNotChecked);
			if( data->type == MENU_TYPE_TEXT ) {
				if( data->text.text ) {
					mswin_free_text_buffer(data->text.text);
					data->text.text = NULL;
				}
			}
			free(data);
			SetWindowLong(hWnd, GWL_USERDATA, (LONG)0);
		}
		return TRUE;
	}
	return FALSE;
}
Exemple #3
0
BOOL CALLBACK
PlayerSelectorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    struct plsel_data *data;
    RECT main_rt, dlg_rt;
    SIZE dlg_sz;

    switch (message) {
    case WM_INITDIALOG:
        data = (struct plsel_data *) lParam;
        SetWindowLong(hWnd, GWL_USERDATA, lParam);

        /* center dialog in the main window */
        GetWindowRect(GetNHApp()->hMainWnd, &main_rt);
        GetWindowRect(hWnd, &dlg_rt);
        dlg_sz.cx = dlg_rt.right - dlg_rt.left;
        dlg_sz.cy = dlg_rt.bottom - dlg_rt.top;

        dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2;
        dlg_rt.right = dlg_rt.left + dlg_sz.cx;
        dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2;
        dlg_rt.bottom = dlg_rt.top + dlg_sz.cy;
        MoveWindow(hWnd, (main_rt.left + main_rt.right - dlg_sz.cx) / 2,
                   (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx,
                   dlg_sz.cy, TRUE);

        /* init dialog */
        plselInitDialog(hWnd);

#if defined(WIN_CE_SMARTPHONE)
        NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, FALSE, FALSE);
#endif
        /* set focus on the role checkbox (random) field */
        SetFocus(GetDlgItem(hWnd, IDC_PLSEL_ROLE_RANDOM));

        /* tell windows we set the focus */
        return FALSE;
        break;

    case WM_COMMAND:
        data = (struct plsel_data *) GetWindowLong(hWnd, GWL_USERDATA);
        switch (LOWORD(wParam)) {
        /* OK button was clicked */
        case IDOK:
            if (plselFinalSelection(hWnd, data->selection)) {
                EndDialog(hWnd, wParam);
            } else {
                MessageBox(
                    hWnd, TEXT("Cannot match this role. Try something else."),
                    TEXT("STOP"), MB_OK);
            }
            return TRUE;

        /* CANCEL button was clicked */
        case IDCANCEL:
            *data->selection = -1;
            EndDialog(hWnd, wParam);
            return TRUE;

        /* following are events from dialog controls:
           "random" checkboxes send BN_CLICKED messages;
           role/race/... combo-boxes send CBN_SELENDOK
           if something was selected;
        */
        case IDC_PLSEL_ROLE_RANDOM:
            if (HIWORD(wParam) == BN_CLICKED) {
                /* enable corresponding list window if "random"
                   checkbox was "unchecked" */
                EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST),
                             SendMessage((HWND) lParam, BM_GETCHECK, 0, 0)
                                 == BST_UNCHECKED);
            }
            break;

        case IDC_PLSEL_RACE_RANDOM:
            if (HIWORD(wParam) == BN_CLICKED) {
                EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST),
                             SendMessage((HWND) lParam, BM_GETCHECK, 0, 0)
                                 == BST_UNCHECKED);
            }
            break;

        case IDC_PLSEL_GENDER_RANDOM:
            if (HIWORD(wParam) == BN_CLICKED) {
                EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST),
                             SendMessage((HWND) lParam, BM_GETCHECK, 0, 0)
                                 == BST_UNCHECKED);
            }
            break;

        case IDC_PLSEL_ALIGN_RANDOM:
            if (HIWORD(wParam) == BN_CLICKED) {
                EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST),
                             SendMessage((HWND) lParam, BM_GETCHECK, 0, 0)
                                 == BST_UNCHECKED);
            }
            break;

        case IDC_PLSEL_ROLE_LIST:
            if (HIWORD(wParam) == CBN_SELENDOK) {
                /* filter out invalid options if
                   the selection was made */
                plselAdjustLists(hWnd, LOWORD(wParam));
            }
            break;

        case IDC_PLSEL_RACE_LIST:
            if (HIWORD(wParam) == CBN_SELENDOK) {
                plselAdjustLists(hWnd, LOWORD(wParam));
            }
            break;

        case IDC_PLSEL_GENDER_LIST:
            if (HIWORD(wParam) == CBN_SELENDOK) {
                plselAdjustLists(hWnd, LOWORD(wParam));
            }
            break;

        case IDC_PLSEL_ALIGN_LIST:
            if (HIWORD(wParam) == CBN_SELENDOK) {
                plselAdjustLists(hWnd, LOWORD(wParam));
            }
            break;
        }
        break;
    }
    return FALSE;
}
Exemple #4
0
LRESULT CALLBACK
GetlinDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    struct getlin_data *data;
    RECT main_rt, text_rt, dlg_rt, edit_rt;
    SIZE dlg_sz;
    TCHAR wbuf[BUFSZ];
    HDC hdc;
    HWND control;
    HWND hwndMap;

#if defined(WIN_CE_POCKETPC)
    SHInputDialog(hWnd, message, wParam);
#endif

    switch (message) {
    case WM_INITDIALOG:
        data = (struct getlin_data *) lParam;
        SetWindowText(hWnd, NH_A2W(data->question, wbuf, sizeof(wbuf)));
        SetWindowLong(hWnd, GWL_USERDATA, lParam);

        /* get title text width */
        SetRect(&text_rt, 0, 0, 100, 50);
        hdc = GetWindowDC(hWnd);
        DrawText(hdc, wbuf, _tcslen(wbuf), &text_rt,
                 DT_CALCRECT | DT_SINGLELINE | DT_NOPREFIX | DT_LEFT
                     | DT_VCENTER);
        ReleaseDC(hWnd, hdc);

        /* center dialog in the main window */
        GetWindowRect(hWnd, &dlg_rt);
        hwndMap = mswin_hwnd_from_winid(WIN_MAP);
        GetWindowRect(IsWindow(hwndMap) ? hwndMap : GetNHApp()->hMainWnd,
                      &main_rt);
        dlg_sz.cx = max(
            dlg_rt.right - dlg_rt.left,
            min(text_rt.right - text_rt.left + GetSystemMetrics(SM_CXICON),
                main_rt.right - main_rt.left));
        dlg_sz.cy =
            min(dlg_rt.bottom - dlg_rt.top, main_rt.bottom - main_rt.top);
        dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2;
        dlg_rt.right = dlg_rt.left + dlg_sz.cx;
        dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2;
        dlg_rt.bottom = dlg_rt.top + dlg_sz.cy;
        MoveWindow(hWnd, (main_rt.left + main_rt.right - dlg_sz.cx) / 2,
                   (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx,
                   dlg_sz.cy, TRUE);

        /* change layout of controls */
        GetClientRect(hWnd, &dlg_rt);

        control = GetDlgItem(hWnd, IDC_GETLIN_EDIT);
        GetWindowRect(control, &edit_rt);
        MoveWindow(control, 0, 0, dlg_rt.right - dlg_rt.left,
                   edit_rt.bottom - edit_rt.top, TRUE);

        control = GetDlgItem(hWnd, IDOK);
        GetWindowRect(control, &text_rt);
        MoveWindow(control, 0, edit_rt.bottom - edit_rt.top,
                   (dlg_rt.right - dlg_rt.left) / 2,
                   text_rt.bottom - text_rt.top, TRUE);

        control = GetDlgItem(hWnd, IDCANCEL);
        GetWindowRect(control, &text_rt);
        MoveWindow(control, (dlg_rt.right - dlg_rt.left) / 2,
                   edit_rt.bottom - edit_rt.top,
                   (dlg_rt.right - dlg_rt.left) / 2,
                   text_rt.bottom - text_rt.top, TRUE);

#if defined(WIN_CE_SMARTPHONE)
        NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, TRUE, FALSE);
#endif

        /* set focus to the edit control */
        SetFocus(GetDlgItem(hWnd, IDC_GETLIN_EDIT));

        /* tell windows that we've set the focus */
        return FALSE;
        break;

    case WM_COMMAND: {
        TCHAR wbuf[BUFSZ];

        switch (LOWORD(wParam)) {
        /* OK button was pressed */
        case IDOK:
            data = (struct getlin_data *) GetWindowLong(hWnd, GWL_USERDATA);
            SendDlgItemMessage(hWnd, IDC_GETLIN_EDIT, WM_GETTEXT,
                               (WPARAM) sizeof(wbuf), (LPARAM) wbuf);
            NH_W2A(wbuf, data->result, data->result_size);

        /* Fall through. */

        /* cancel button was pressed */
        case IDCANCEL:
            EndDialog(hWnd, wParam);
            return TRUE;
        }
    } break;

#if defined(WIN_CE_SMARTPHONE)
    case WM_HOTKEY:
        if (VK_TBACK == HIWORD(lParam)) {
            SHSendBackToFocusWindow(message, wParam, lParam);
        }
        break;
#endif

    } /* end switch (message) */
    return FALSE;
}
Exemple #5
0
LRESULT CALLBACK
ExtCmdDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    struct extcmd_data *data;
    RECT main_rt, dlg_rt;
    SIZE dlg_sz;
    int i;
    const char *ptr;
    TCHAR wbuf[255];

    switch (message) {
    case WM_INITDIALOG:
        data = (struct extcmd_data *) lParam;
        SetWindowLong(hWnd, GWL_USERDATA, lParam);

        /* center dialog in the main window */
        GetWindowRect(GetNHApp()->hMainWnd, &main_rt);
        GetWindowRect(hWnd, &dlg_rt);
        dlg_sz.cx = dlg_rt.right - dlg_rt.left;
        dlg_sz.cy = dlg_rt.bottom - dlg_rt.top;

        dlg_rt.left = (main_rt.left + main_rt.right - dlg_sz.cx) / 2;
        dlg_rt.right = dlg_rt.left + dlg_sz.cx;
        dlg_rt.top = (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2;
        dlg_rt.bottom = dlg_rt.top + dlg_sz.cy;
        MoveWindow(hWnd, (main_rt.left + main_rt.right - dlg_sz.cx) / 2,
                   (main_rt.top + main_rt.bottom - dlg_sz.cy) / 2, dlg_sz.cx,
                   dlg_sz.cy, TRUE);

        /* fill combobox with extended commands */
        for (i = 0; (ptr = extcmdlist[i].ef_txt); i++) {
            SendDlgItemMessage(hWnd, IDC_EXTCMD_LIST, LB_ADDSTRING,
                               (WPARAM) 0,
                               (LPARAM) NH_A2W(ptr, wbuf, sizeof(wbuf)));
        }

#if defined(WIN_CE_SMARTPHONE)
        NHSPhoneDialogSetup(hWnd, IDC_SPHONE_DIALOGBAR, FALSE, FALSE);

        GetClientRect(hWnd, &dlg_rt);
        MoveWindow(GetDlgItem(hWnd, IDC_EXTCMD_LIST), dlg_rt.left, dlg_rt.top,
                   dlg_rt.right - dlg_rt.left, dlg_rt.bottom - dlg_rt.top,
                   TRUE);
#endif

        /* set focus to the list control */
        SetFocus(GetDlgItem(hWnd, IDC_EXTCMD_LIST));

        /* tell windows we set the focus */
        return FALSE;
        break;

    case WM_COMMAND:
        data = (struct extcmd_data *) GetWindowLong(hWnd, GWL_USERDATA);
        switch (LOWORD(wParam)) {
        /* OK button ws clicked */
        case IDOK:
            *data->selection = SendDlgItemMessage(
                hWnd, IDC_EXTCMD_LIST, LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);
            if (*data->selection == LB_ERR)
                *data->selection = -1;
        /* Fall through. */

        /* CANCEL button ws clicked */
        case IDCANCEL:
            EndDialog(hWnd, wParam);
            return TRUE;

        /* list control events */
        case IDC_EXTCMD_LIST:
            switch (HIWORD(wParam)) {
            case LBN_DBLCLK:
                /* double click within the list
                       wParam
                         The low-order word is the list box identifier.
                         The high-order word is the notification message.
                       lParam
                         Handle to the list box
                      */
                *data->selection = SendMessage((HWND) lParam, LB_GETCURSEL,
                                               (WPARAM) 0, (LPARAM) 0);
                if (*data->selection == LB_ERR)
                    *data->selection = -1;
                EndDialog(hWnd, IDOK);
                return TRUE;
            }
            break;
        }
    }
    return FALSE;
}