MDI ChildFrame Caption Redraw Problème (Office 2007 Thèmes)

cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 - 26 avril 2011 à 19:07
cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 - 27 avril 2011 à 17:04
Bonjour,

Je rencontre un problème d'affichage sur la barre de titre de mes fenêtres enfant MDI quand je suis en thème Office (Bleu,Noir,Argenté ou Cyan).

J'ai le bandeau inférieur qui se redessine mal (Sur quelques pixel). cf Screens





Quand je suis en thème XP sa semble Ok.



Voici la déclaration : (Fenêtre principale)

	
// crée la fenêtre frame MDI principale
pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame;
return FALSE;
}

m_pMainWnd = pMainFrame;


J'ai laissé intact le code généré par VS2010 pour la gestion des thèmes
(Je n'ai pas c/c la fonction raison de longueur OnApplicationLook(theApp.m_nAppLook);)

CMainFrame::CMainFrame()
{
theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"),            ID_VIEW_APPLOOK_VS_2008);

}


OnCreate du MainFrame :

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
   return -1;

   OnApplicationLook(theApp.m_nAppLook);


Je crée ma fenêtre comme cela : (Child est la class dérivé de CMDIChildWndEx)

	

MainChild = new Child;

if (MainChild->Create("MDICLIENT",Network,
WS_CHILD|WS_OVERLAPPEDWINDOW,
CRect(0,0,800,400),((CMainFrame*)Parent))==0)
    return false;


J'ai essayé plusieurs choses :

Dans le OnPaint() ou OnNcPaint()
J'ai utiliser InvalidateRect() , Invalidate() , DrawCaption()
Mais rien à faire !

Je n'utilise pas de CDocument , j'ai remarqué que les fenêtre MDI crée par un CDocument n'avait pas de genre de problème , mais je ne veux les utiliser

Voila si avez des idées ,

Merci d'avance.

Ciao
A voir également:

4 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
26 avril 2011 à 23:15
salut,

Peut-être une idée:
A la fin de ta fonction WndProc, rappelles-tu la fonction Windows par défaut ou retournes-tu en indiquant à Windows que le traitement est terminé.

@++
0
cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 2
27 avril 2011 à 13:10
Je ne gère pas la WndProc , c'est peut être sa le problème ! (J'utilise les MFC)

LRESULT Child::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
return CMDIChildWndEx::WindowProc(message, wParam, lParam);
}
0
cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 2
27 avril 2011 à 15:09
J'ai trouvé une solution alternative , j'ai remarqué que par rapport à un thème classique le caption est un peu plus grand de 2 pixel , ce qui explique peut être le problème de dessin.

J'ai implémenté dans le NCPAINT ceci:

void Child::OnNcPaint()
{
// TODO: Add your message handler code here
// Do not call CMDIChildWndEx::OnNcPaint() for painting messages
CMDIChildWndEx::OnNcPaint();

CWindowDC dc(this);
CRect rect;
GetWindowRect(rect);
COLORREF c = GetPixel(dc,10,28);
        CRect r = CRect(10,30,rect.Width()-10,32);
dc.FillSolidRect(r, c);
        ReleaseDC(&dc);
}


Je dessine la ligne en prenant la couleur du pixel du dessus.

Je suis toujours preneur d'autre solution.

Merci pour l'aide.

Ciao
0
cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 2
27 avril 2011 à 17:04
Je complète mon code ,
C'est peu être un bug mais en attendant pour les intéressés :

void Child::OnNcPaint()
{
CMDIChildWndEx::OnNcPaint();	
        UpdateCaption();
}
BOOL Child::OnNcCreate(LPCREATESTRUCT lpCreateStruct)
{
if (!CMDIChildWndEx::OnNcCreate(lpCreateStruct))
return FALSE;

        UpdateCaption();

return TRUE;
}
void Child::UpdateCaption()
{
CWindowDC dc(this);
COLORREF c = GetPixel(dc,1,30);
if (c!=CLR_INVALID)
{
 CRect rect;
 GetWindowRect(rect);
         CRect r = CRect(10,30,rect.Width()-10,32);
         dc.FillSolidRect(r, GetPixel(dc,1,30));
}
ReleaseDC(&dc);
}


Ciao
0
Rejoignez-nous