【问题标题】:Why terminal are not showing printf messages whening running win32 window为什么终端在运行 win32 窗口时不显示 printf 消息
【发布时间】:2020-12-23 22:46:46
【问题描述】:

我正在运行普通的 win32 API,但所有消息在执行后不久都会显示。 我正在为我的游戏测试输入键的回调,当我按下任何按钮时没有任何反应,但是在关闭应用程序后一切恢复正常,我不知道我做错了什么

窗口文件

#include <stdio.h>
#include <stdlib.h>
#include "./window.h"

Window wind;

LRESULT window_callback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    switch (uMsg) {
        case WM_DESTROY: {
            PostQuitMessage(0);
            exit(EXIT_SUCCESS);
        } break;

        case WM_KEYUP: {
            printf("SOME MESSAGE");
        } break;

        return 0;
    }
    
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

void init_window() {
    WNDCLASSA window_class = {0};

    window_class.style = CS_HREDRAW|CS_VREDRAW;
    window_class.lpfnWndProc = window_callback;
    window_class.hCursor = LoadCursor(NULL, IDC_ARROW);
    window_class.lpszClassName = "GAME_WINDOW_CLASS";

    RegisterClassA(&window_class);

    wind.ws_window = CreateWindowEx(0,
        window_class.lpszClassName,
        wind.title,
        WS_VISIBLE | WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        wind.width, wind.height,
        NULL, NULL, NULL, NULL);
    wind.ws_canvas = GetDC(wind.ws_window);
}

void update_window() {
    MSG message;

    while (GetMessage(&message, NULL, 0, 0)) {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
}

Window create_window(char * title, int width, int height) {
    wind.title = title;
    wind.width = width;
    wind.height = height;
    wind.running = 1;

    init_window();
}

主文件

#include <stdio.h>
// #include "core/gui.h"
#include "core/window.h"

void main() {
    create_window("Game Window", 600, 600);

    while(1) {
        // if(key_pressed("A"))
        //     printf("A was pressed!");

        update_window();
    }
}

编辑:

在 printf 的末尾加上一个“\n”解决问题

【问题讨论】:

  • 代替while(1) ... GetMessage,使用WaitMessage
  • 如果这是真正的代码,那么您没有在输出中添加任何换行符,因此它可能已被缓冲,请尝试将 \n 放在末尾(如果仍然没有,则将 fflush(stdout);工作)

标签: c windows compilation


【解决方案1】:

Win api:使用 TextOut() 或 ExTextOut() 而不是 printf()。您正在写入 HWND 而不是标准 C 句柄。 还有 Message Box() 而不是 printf 用于调试。 接下来:WM_PAINT,它的序列是 BeginPaint...EndPaint。这应该可以帮助您入门。

【讨论】:

  • OP 有一个控制台应用程序,它使用printf 并打开一个 GUI 窗口。两者都是完全合法的。输出未显示的原因很可能是阻塞消息循环。
  • HINSTANCE 需要注册窗口类,所以 OP 无法创建相同的。除了没有错误检查。
  • 有什么方法可以将我的控制台链接到窗口控制台?
【解决方案2】:

在 printf 的末尾加上一个“\n”解决问题

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多