Успешная сборка с createWindowEx, окно все равно не появится

Я пытаюсь научиться программировать на Windows и DirectX, и я пытаюсь попробовать разные вещи. Когда вдруг мои окна перестали появляться, даже если это была успешная сборка. Я подумал, что, должно быть, что-то испортил и отменил все, пока не вернулся в то место, где мне в последний раз удалось открыть окно, но теперь, когда я запускаю (с успешной сборкой), оно все равно не отображается:(И У меня заканчиваются идеи, в чем может быть проблема, это так странно. Одна из вещей, которые я сделал с тех пор, как в последний раз заставил его работать, это добавление некоторых каталогов libs, но мне трудно понять, как это повлияет на Запрограммируйте этот путь. Кто-нибудь из вас сталкивался с этой проблемой раньше, и если да, то как вы ее решили? Вот код функции, создающей окно (и да, я знаю о бесконечном цикле, он не должен вызывать эта проблема, правда?)

пс. Я также пытался переключаться между WINDCLASSEX и WINDCLASS, со всеми функциями, которые должны быть изменены с ним, не имело никакого значения ds.

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow){
    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;

    RegisterClass(&wc);

    RECT wr = {0, 0, 500, 400};    // set the size, but not the position
    AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);    // adjust the size

    // Create the window.

    HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"My first window",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style
    CW_USEDEFAULT, CW_USEDEFAULT,//position x,y
    wr.right-wr.left, wr.bottom-wr.top,//width, height
    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

    if (hwnd == NULL){
        return 0;
    }



    InitD3D(hwnd);
     // Run the message loop.

    MSG msg = { };
    while (true){
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else{

    }
    }

    return 0;
 }

1 ответ

Похоже, вам нужно ShowWindow позвони туда (если только InitD3D делает это, вы не показали код)

окна по умолчанию создаются невидимыми, так что вы можете выполнять различную инициализацию, чтобы пользователь не видел, что происходит

в качестве альтернативы вы можете создать уже видимое окно, но в целом рекомендуется придерживаться единого соглашения


кстати, вы можете просто использовать стандарт int main, не нужно использовать Microsoft чудовище

с инструментарием GNU это все, с инструментами Microsoft вы должны сказать компоновщику принять стандартный код, если вы используете подсистему GUI, через опцию компоновщика /entry:mainCRTStartup,


также призыв к неблокированию PeekMessage означает, что ваш цикл обработки сообщений, скорее всего, будет загружен процессором

вместо этого используйте блокировку GetMessage

и не забудьте выйти из цикла, когда GetMessage возвращает 0 (что указывает на WM_QUIT сообщение опубликовано)

Другие вопросы по тегам