2010-05-09 4 views
1

sur WM_PAINT i effectuer les opérations suivantes:GDI + pas effacer ma fenêtre sur repeindre pour vista

//RectF mNameRect; 
//WCHAR* mName; 
//HWND mWin; // this is the window handle 
{ 
PAINTSTRUCT ps; 

HDC hdc = BeginPaint(mWin, &ps); 
Graphics g(hdc); 
g.Clear(Color::White); 

StringFormat stringForm; 
stringForm.SetLineAlignment(StringAlignmentCenter); 
stringForm.SetAlignment(StringAlignmentCenter); 

// set the rectangle to the size of the whole window 

mNameRect.Width = static_cast<float>(size.cx); 
mNameRect.Height = static_cast<float>(size.cy); 

g.DrawString(mName, -1, &mNameFont, mNameRect, &stringForm, &mNameBrush); 

EndPaint(mWin, &ps); 
} 

Dans XP cela fonctionne très bien, le MNAME est affiché au milieu de la fenêtre. Cependant sur Vista le texte ne bouge pas, il reste dans son emplacement peu importe comment je redimensionne la fenêtre. le g.Clear(Color::White) ne semble pas faire la moindre différence. Le texte ne change même pas de position lorsque la fenêtre est cachée derrière une autre fenêtre et que le focus doit être repeint.

Comment faire pour que mName change de position dans Vista?

Edit: Le code de peinture est appelée par WM_PAINT et par WM_SIZE de la manière suivante:

// WndProc function 
switch (msg){ 
    case WM_SIZE: 
    // intentionally call paint when WM_SIZE is triggered 
    case WM_PAINT: 
     paint(); 
    break; 
+0

Avez-vous vérifié que 'size' valeur change sur Vista? – Thomas

+0

@Thomas: J'ai ajouté le code qui appelle la peinture. La taille est collectée via GetWindowRect() au début de paint(). Donc oui - la taille change ..:/ – Default

Répondre

3

Vous appelez explicitement votre fonction paint() lorsque la fenêtre est redimensionnée. Cependant, votre fenêtre n'est pas invalidée, il se peut donc que le système limite vos efforts de peinture à la région marquée "sale". Au lieu d'appeler directement le paint(), il est préférable d'utiliser InvalidateRgn pour déclencher un repeint au lieu de l'appeler paint(). Cela entraînera l'envoi d'un WM_PAINT qui sera traité par votre application de la manière normale. En prime, vous pouvez aussi dire InvalidateRgn pour effacer l'arrière-plan pour vous

InvalidateRgn(hWnd, NULL, TRUE); 
+0

Génial, vous avez résolu deux de mes problèmes de tête en quelques minutes. Merci! – Default

+0

BTW, savez-vous la raison pour laquelle cela fonctionne pour XP, mais pas pour Vista? – Default

+0

Apparemment, Vista fait une optimisation plus agressive pour minimiser la quantité de peinture. Je suis vraiment surpris que ça marche sur XP. – Thomas

Questions connexes