2301_77634747 2024-03-16 19:03 采纳率: 88%
浏览 1
已结题

如何不通过控制台向exe输入字母或数字等信息

用VC2022编写了一个小游戏,但是用户的输入总是在控制台而不是游戏界面,控制台影响美观,如何不需要控制台,直接可以面向exe画面进行输入

  • 写回答

5条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-16 19:04
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 用户输入在控制台而不是游戏界面,一般是因为游戏使用的是Windows控制台窗口作为输入输出窗口,需要用户手动在控制台窗口中输入,影响美观。因此需要将输入输出窗口集成到游戏程序中,使用户可以直接在游戏程序的界面中进行输入输出。 解决方案: 可以使用Windows API中的窗口函数来创建一个窗口,并在窗口中显示游戏界面和输入框,使用户可以直接在窗口中进行输入。具体步骤如下:
    1. 创建窗口 使用CreateWindow函数创建一个窗口,指定窗口的大小、位置、样式等属性。例如: HWND hWnd = CreateWindow( L"MainWindow", // 窗口类名 L"My Game", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 CW_USEDEFAULT, CW_USEDEFAULT, // 窗口起始位置 800, 600, // 窗口大小 NULL, NULL, hInstance, NULL); 其中,hInstance为程序实例句柄,可在WinMain函数中获取。
    2. 显示游戏界面 在窗口上绘制游戏的界面,可以使用GDI或DirectX等图形库。例如,使用GDI绘制一个矩形: PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); RECT rc; GetClientRect(hWnd, &rc); HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255)); // 创建一个蓝色刷子 FillRect(hdc, &rc, hBrush); // 绘制矩形 DeleteObject(hBrush); // 删除刷子 EndPaint(hWnd, &ps);
    3. 添加输入框 使用CreateWindow函数创建一个编辑框控件,放置于窗口上方或下方。例如: HWND hEdit = CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 10, 10, 200, 30, hWnd, NULL, hInstance, NULL); 其中,WS_CHILD表示子控件样式,WS_VISIBLE表示可见,WS_BORDER表示有边框,ES_LEFT表示文本对齐方式为左对齐。
    4. 处理输入消息 在窗口过程中,处理WM_COMMAND消息,获取用户输入的文本。例如: case WM_COMMAND: switch (LOWORD(wParam)) { case ID_OK: // 确认按钮被点击 WCHAR buf[256]; // 用于存储文本 GetWindowText(hEdit, buf, 256); // 获取文本 // 处理输入 break; } break; 其中,hEdit为编辑框控件句柄,ID_OK为确认按钮ID。 完整代码示例: #include <windows.h> const int ID_OK = 1; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: // 创建编辑框 CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 10, 10, 200, 30, hWnd, NULL, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL); // 创建确认按钮 CreateWindow(L"Button", L"OK", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 220, 10, 50, 30, hWnd, (HMENU)ID_OK, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL); break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_OK: WCHAR buf[256]; GetWindowText(GetDlgItem(hWnd, 1), buf, 256); MessageBox(hWnd, buf, L"Text", MB_OK); break; } break; case WM_PAINT: // 绘制游戏界面 PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); RECT rc; GetClientRect(hWnd, &rc); HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255)); FillRect(hdc, &rc, hBrush); DeleteObject(hBrush); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = L"MainWindow"; RegisterClass(&wc); // 创建窗口 HWND hWnd = CreateWindow( L"MainWindow", L"My Game", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 求MCSCANX 帮助
  • ¥15 机器学习训练相关模型
  • ¥15 Todesk 远程写代码 anaconda jupyter python3
  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制