Fredrik Boston Westman
Fredrik Boston Westman

Reputation: 347

Successful build with createWindowEx, window still won't appear

I'm trying to learn some windows and directX programming and I was messing around trying some different things. When suddently my the windows stopped appearing, even tho it was a successful build. I figured I must have messed something up and I undid everything until i got back to the place where I last managed to get the window to appear, but now when I run (with a successful build) it still doesn't show :( And I'm starting to run out of ideas what the problem could be, it so strange. One of the thing I did since last time I got it to work was add some libs directories but I have a hard time seeing how that would affect the program this way. Have anyone of you run in to this problem before, and if so how did you solve it? Here is the code of the func creating the window (and yes I am aware of the infinite loop, it shouldn't cause this problem tho, right?) :

ps. I have also tried changing between WINDCLASSEX and WINDCLASS, with all the functions that need to be change with it, didn't make any difference 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;
 }

Upvotes: 0

Views: 1208

Answers (1)

Cheers and hth. - Alf
Cheers and hth. - Alf

Reputation: 145279

looks like you need a ShowWindow call in there (unless InitD3D does that, you haven't shown the code)

windows are by default created non-visible, so that you can do various initialization without the user seeing what goes on

as an alternative you can create the window already visible, but generally it's a good idea to keep to a single convention


by the way, you can just use a standard int main, no need to use the Microsoft monstrosity

with GNU toolchain that's all, with Microsoft's tools you then have to tell the linker to accept the standard code, if you use the GUI subsystem, via linker option /entry:mainCRTStartup.


also, the call to non-blocking PeekMessage means your message loop will most likely be a CPU hog

instead, use blocking GetMessage

and remember to exit the loop when GetMessage returns 0 (which indicates a WM_QUIT message has been posted)

Upvotes: 1

Related Questions