2012-04-29 4 views
2

У меня есть дескриптор Windows HDC из внешней библиотеки, который я бы хотел использовать для функциональности QPainter. Есть ли способ в Qt создать QPaintDevice из дескриптора HDC?Создайте QPaintDevice из ручки HDC

+1

Насколько я вижу, это невозможно. QWidget (который наследуется от QPaintDevice) имеет концепцию HDC. Его HDC можно получить через QWidget :: getDC(), но его нельзя установить. Внутренне он хранится в QWidgetPrivate :: dc; в классе Pimpl QWidget и полностью недоступном. – dagur

ответ

0

Один из способов сделать это:

Использование 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 для «Идентификатора окна, зависящего от платформы».

+0

И почему вы думаете, что HWND связан с HDC? Вы слышали о ["памяти DC"] (http://www.codeproject.com/Articles/224754/Guide-to-Win32-Memory-DC)? У него HDC, но нет окна. – SigTerm

+0

Вы правы, таким образом, утверждаете. Это может работать, только если вы можете предположить, что это не память DC. Это плохое решение, но единственное, что я придумал. – dagur