Проблемы с окном просмотра на Win 10 1709

Я работаю над плагином для Adobe Illustrator, использующим фреймворк hotdoor, поэтому у меня нет особого доступа к процессу создания окон \ инициализации. При этом я использовал openGL для рендеринга графики в моем плагине. Я получил CWnd из виджета и использовал его для инициализации контекста openGL, что-то вроде этого:

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);

Затем я просто подключил цикл обновления / рисования к таймеру. Работало нормально. Однако после обновления Win10 1709 визуализированная графика исчезла из моего окна. Первым делом я проверил контекст, и все оказалось хорошо. Извлечение контекста в файл изображения после рисования привело к правильному изображению с размером и содержанием, соответствующими тому, что я ожидал увидеть в окне просмотра. Таким образом, я мог только предположить, что жизненный цикл окна каким-то образом изменился после обновления 1709 года, но чтение заметок об обновлении не дало мне никакой подсказки, где моя графика могла стать недействительной. Прямо сейчас я даже не уверен, в каком направлении мне следует расследовать, поэтому любые предложения приветствуются.

Обновить:
Я провел некоторые эксперименты с этим. Я попытался получить обработчик для Windows родной proc для виджета и немного повозился с ним, чтобы в случае WM_PAINT по умолчанию использовался winproc, а во всех других случаях использовался старый обработчик.

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);
}

Теперь я могу видеть графику, однако все обратные вызовы, связанные с виджетом, такие как мышь вниз, мышь вверх и т. Д., Пропали. Все еще пытаюсь понять это.

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …