mars
2008
Le passage de Visual 2005 à Visual 2008 n’est pas sans surprises …
Vous avez du certainement vous rendre compte que pour de vieux projets issus de Visual6 ou autres Visual définissait par défaut la plateforme système à Windows Vista ?
Laisser ce choix par défaut n’est pas sans danger,
En effet certaines API comme SystemParametersInfo ne fonctionneront plus sous windows XP, la fonction renverra NULL!.
Je me sers de cette API pour récupérer la fonte système par défaut, donc par chance je me suis rendu assez vite compte du problème.
ncm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
SetFont(&(ncm.lfMessageFont));
La faute à qui ?
Hé bien la structure utilisée a changé de taille sous Vista, en laissant le paramétrage par défaut sur Vista la taille de la structure évaluée par sizeof correspond donc à la version de l’API sous Vista, et l’appel échouera sous Windows XP.
En cherchant un peu dans les sources de Visual 2008 on trouve une référence à l’ancienne structure que vous pouvez comparer à la nouvelle..
{
UINT cbSize;
int iBorderWidth;
int iScrollWidth;
int iScrollHeight;
int iCaptionWidth;
int iCaptionHeight;
LOGFONT lfCaptionFont;
int iSmCaptionWidth;
int iSmCaptionHeight;
LOGFONT lfSmCaptionFont;
int iMenuWidth;
int iMenuHeight;
LOGFONT lfMenuFont;
LOGFONT lfStatusFont;
LOGFONT lfMessageFont;
};
typedef struct tagNONCLIENTMETRICS {
UINT cbSize;
int iBorderWidth;
int iScrollWidth;
int iScrollHeight;
int iCaptionWidth;
int iCaptionHeight;
LOGFONT lfCaptionFont;
int iSmCaptionWidth;
int iSmCaptionHeight;
LOGFONT lfSmCaptionFont;
int iMenuWidth;
int iMenuHeight;
LOGFONT lfMenuFont;
LOGFONT lfStatusFont;
LOGFONT lfMessageFont;
int iPaddedBorderWidth;
} NONCLIENTMETRICS,
Comment résoudre ce problème ?
Dans les sources de Visual 2008 ils ont résolu le problème pour cette API comme suit :
{
UINT cbSize;
int iBorderWidth;
int iScrollWidth;
int iScrollHeight;
int iCaptionWidth;
int iCaptionHeight;
LOGFONT lfCaptionFont;
int iSmCaptionWidth;
int iSmCaptionHeight;
LOGFONT lfSmCaptionFont;
int iMenuWidth;
int iMenuHeight;
LOGFONT lfMenuFont;
LOGFONT lfStatusFont;
LOGFONT lfMessageFont;
};
const UINT cbProperSize = (_AfxGetComCtlVersion() < MAKELONG(1, 6))
? sizeof(AFX_OLDNONCLIENTMETRICS) : sizeof(NONCLIENTMETRICS);
NONCLIENTMETRICS NonClientMetrics;
NonClientMetrics.cbSize = cbProperSize;
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, cbProperSize, &NonClientMetrics, 0);
m_MenuFont.CreateFontIndirect(&NonClientMetrics.lfMenuFont);
Comme il est difficile de connaitre les autres incompatibilités, il est préférable de définir un niveau de plateforme de Windows compatible au plus près de sa cible.
Dans mon cas j’ai définit dans stdafx.h (au sommet)
#define WINVER 0x0500 // windows 2000
#define _WIN32_WINNT 0x0501 // xp
#endif
Articles récents
Commentaires récents
Archives
- septembre 2010
- mai 2010
- avril 2010
- février 2010
- août 2009
- juin 2009
- mai 2009
- février 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- mars 2006
- février 2006