Hot Door CORE Forum

Full Version: Windows update and OpenGL handling.
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello. I've encountered a problem that I'm not sure how to deal with yet, so any advice is welcome. I'm using openGL rendering in my plugin, basic workflow for it is something like this:

hdi::core::CustomWidget frame(...args);
    CWnd *pWnd = frame.platformWidget();
    HWND mHwnd = pWnd->GetSafeHwnd();
    HDC mHdc = pWnd->GetDC()->m_hDC;
//set pixel format etc
    HGLRC mHglrc = wglCreateContext(mHdc);
        wglMakeCurrent(mHdc, mHglrc);

Then there is some draw routine triggered by hdi::core::Timer.
Something like this:
void Draw()
//setup gl
    glBegin( ... );
//some rendering

Everything worked perfectly. However when my Win10 updated to version 1709, build 16299.19 the viewport where image should have been became empty. I've checked for context validity and everything seemed fine. Even more - if I flushed rendered context to an image file, it showed me correct results - image was there, its size corresponded to custom widget size that hosted my context. So it seems that opengl works fine.
Only conclusion that I could think of is that Microsoft changed window lifecycle in this update and now all the rendered stuff gets invalidated somehow. Maybe there is a better place for my draw fuction other than timer triggered callback? Or maybe there are some actions I could take that are not obvious to me right now?
I've done some experimenting with this. I've tried to get a handler for windows native proc for the widget and tinker a little with it so that in case of WM_PAINT default winproc is used and in all other cases old handler is used.

std::map<HWND, LONG_PTR> oldHandlerMap;

typedef LRESULT (*WndProcType)(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WndProcTst (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    if(message == WM_PAINT)
        return DefWindowProc(hwnd, message, wParam, lParam) ;

    WndProcType oldHandlerPtr = (WndProcType)oldHandlerMap[hwnd];
    return CallWindowProc((WNDPROC)oldHandlerPtr, hwnd, message, wParam, lParam);
void RehookWinProc(const hdi::core::CustomWidget& parent) {
    CWnd *pWnd = parent.platformWidget();
    HWND tmpHwnd = pWnd->GetSafeHwnd();

    LONG_PTR oldHandler = GetClassLongPtr(tmpHwnd, GCLP_WNDPROC);
    oldHandlerMap[tmpHwnd] = oldHandler;
    SetWindowLongPtr(tmpHwnd, GWLP_WNDPROC, (LONG_PTR)WndProcTst);

Now I can see the graphics, however all the callbacks related to widget like mouse down, mouse up etc are gone. Still trying to figure this out.
Is it possible to dynamically upload an image (bit buffer) to a label during runtime? This would theoretically resolve my problem since I have my rendered image as a buffer, even though its not displayed since update.
Reference URL's