У меня есть дескриптор Windows HDC из внешней библиотеки, который я бы хотел использовать для функциональности QPainter. Есть ли способ в Qt создать QPaintDevice из дескриптора HDC?Создайте QPaintDevice из ручки HDC
ответ
Один из способов сделать это:
Использование API для Windows, получить HWND от HDC.
HWND handle = WindowFromDC(hdc);
assert(handle != NULL);
Затем подкласс QWidget, чтобы получить доступ к защищенному члену конвертировать. Используя это, создайте QWidget, используя этот элемент, как описано в этом решении: How to create a qwidget with a hwnd as parent. В этом примере я назвал подкласс для QWidgetWrapper.
QWidgetWrapper *w = new QWidgetWrapper();
w->create((Wld)main_window);
Обратите внимание, что Wld является typedef в Qt для «Идентификатора окна, зависящего от платформы».
И почему вы думаете, что HWND связан с HDC? Вы слышали о ["памяти DC"] (http://www.codeproject.com/Articles/224754/Guide-to-Win32-Memory-DC)? У него HDC, но нет окна. – SigTerm
Вы правы, таким образом, утверждаете. Это может работать, только если вы можете предположить, что это не память DC. Это плохое решение, но единственное, что я придумал. – dagur
Насколько я вижу, это невозможно. QWidget (который наследуется от QPaintDevice) имеет концепцию HDC. Его HDC можно получить через QWidget :: getDC(), но его нельзя установить. Внутренне он хранится в QWidgetPrivate :: dc; в классе Pimpl QWidget и полностью недоступном. – dagur