2010-03-22 3 views
3

J'essaye de créer un widget qui peint directement au contexte de périphérique de fenêtres en appelant getDC() et peignant un HBITMAP à lui.
Le widget que je peins réside à l'intérieur d'un widget de défilement.
J'ai implémenté le paintEvent() et il semble peindre, mais immédiatement après la peinture, le widget est repeint avec une couleur grise.QT: widget de défilement qui rend directement au DC

J'ai essayé de paramétrer WA_PaintOnScreen et Qt::WA_NoSystemBackground mais aucune d'entre elles ne m'a aidé.
En théorie, cela devrait être possible car c'est essentiellement la façon dont le GLWidget fonctionne.

Qu'est-ce qui me manque?

Répondre

3

trouvé la réponse ici:

http://www.qtchina.net/qt4c++guiprogramming/ch20lev1sec1.html/

void GdiControl::paintEvent(QPaintEvent * /* event */) 
{ 
    RECT rect; 
    GetClientRect(winId(), &rect); 
    HDC hdc = GetDC(winId()); 
    FillRect(hdc, &rect, HBRUSH(COLOR_WINDOW + 1)); 
    SetTextAlign(hdc, TA_CENTER | TA_BASELINE); 
    TextOutW(hdc, width()/2, height()/2, text.utf16(), text.size()); 
    ReleaseDC(winId(), hdc); 
} 

Pour que cela fonctionne, il faut aussi réimplémentez QPaintDevice::paintEngine() pour revenir un pointeur NULL et définir l'attribut Qt::WA_PaintOnScreen dans le le constructeur du widget.