Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
154 views
in Technique[技术] by (71.8m points)

c++ - Why does this LRESULT CALLBACK-function not work after adding code to let it react to a button press?

So this is the function that works:

LRESULT CALLBACK windowCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
        LRESULT result = 0;

        //check and execute input
        switch (uMsg) {
            case WM_CLOSE:
            case WM_DESTROY: {
                running = false;
            } break;

            case WM_SIZE: {
                RECT rect;
                GetClientRect(hWnd, &rect);

                //calculate width and height of the window in pixels
                bufferWidth = rect.right - rect.left;
                bufferHeight = rect.bottom - rect.top;

                //calculate memory for all pixels
                int bufferSize = bufferWidth * bufferHeight * sizeof(unsigned int);

                //check for allocated memory: if true: release it
                if (bufferMemory) {
                    VirtualFree(bufferMemory, 0, MEM_RELEASE);
                }

                //allocate memory for all pixels
                bufferMemory = VirtualAlloc(0, bufferSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

                //fill in bitmapinfo
                bufferBitmapInfo.bmiHeader.biSize = sizeof(bufferBitmapInfo.bmiHeader);
                bufferBitmapInfo.bmiHeader.biWidth = bufferWidth;
                bufferBitmapInfo.bmiHeader.biHeight = bufferHeight;
                bufferBitmapInfo.bmiHeader.biPlanes = 1;
                bufferBitmapInfo.bmiHeader.biBitCount = 32;
                bufferBitmapInfo.bmiHeader.biCompression = BI_RGB;
                //window::resize();
                break;
            }

            default: {
                result = DefWindowProc(hWnd, uMsg, wParam, lParam);
            }
        }
        return result;
    }

...but when I add this code to it, it doesn't work anymore and just tells me that the function is faulty, but doesn't give me any errors?(I added the code after the closing bracket of the "case WM_SIZE"-thing + the render::rect()-function works fine):

case WM_KEYDOWN: {
        switch (wParam) {
            case VK_LEFT: {
                render::rect(100, 100, 100, 100, 0x123456, false);
                break;
            }
        }
        break;
}

I changed the code now and edited here too...but it still doesn't work :/ This is the output:

1> ------ Build started: Project: IdkAnyNamesAnymore -_-, Configuration: Debug Win32 ------
1> A task was canceled.
1> A task was canceled.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ok it seems like VS just didn't like me, because when I just retested it with the old Build it didn't work either, so I restarted the program and the solution works! Thx :D

question from:https://stackoverflow.com/questions/65919771/why-does-this-lresult-callback-function-not-work-after-adding-code-to-let-it-rea

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Your WM_SIZE handler is missing a break statement:

case WM_SIZE: {
    ...
    break; // <-- ADD THIS
}

Without that, any WM_SIZE message that is received will fall through to your WM_KEYDOWN handler, skipping DefWindowProc().


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...