MFC: changement dynamique de contrôle de la taille de la police?
J'ai une CListCtrl classe que j'aimerais être en mesure de facilement modifier la taille de police. Je sous-classé CListCtrl comme MyListControl. Je peux définir correctement la police à l'aide de ce code dans le PreSubclassWindow gestionnaire d'événement:
void MyListControl::PreSubclassWindow()
{
CListCtrl::PreSubclassWindow();
//from http://support.microsoft.com/kb/85518
LOGFONT lf; //Used to create the CFont.
memset(&lf, 0, sizeof(LOGFONT)); //Clear out structure.
lf.lfHeight = 20; //Request a 20-pixel-high font
strcpy(lf.lfFaceName, "Arial"); // with face name "Arial".
font_.CreateFontIndirect(&lf); //Create the font.
//Use the font to paint a control.
SetFont(&font_);
}
Cela fonctionne. Cependant, ce que je voudrais faire est de créer une méthode appelée SetFontSize(int taille) qui va tout simplement changer la taille de la police (en laissant le visage et d'autres caractéristiques comme l'est). Je pense donc que cette méthode aurait besoin pour obtenir les polices existantes et de modifier la taille de police, mais mes tentatives ont échoué (il tue mon programme):
void MyListControl::SetFontSize(int pixelHeight)
{
LOGFONT lf; //Used to create the CFont.
CFont *currentFont = GetFont();
currentFont->GetLogFont(&lf);
LOGFONT lfNew = lf;
lfNew.lfHeight = pixelHeight; //Request a 20-pixel-high font
font_.CreateFontIndirect(&lf); //Create the font.
//Use the font to paint a control.
SetFont(&font_);
}
Comment puis-je créer cette méthode?
Il y a un mfc AFFIRMER que cela échoue.
OriginalL'auteur User | 2011-10-01
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution qui fonctionne. Je suis ouvert à toute suggestion d'amélioration:
Les deux clés de l'obtention de ce travail ont été:
font_.DeleteObject();
avant de créer une nouvelle police. Apparemment, il ne peut pas être un objet de police déjà. Il y a certains AFFIRMENT dans le MFC code qui vérifie pour un pointeur. Que dire, c'est ce qui causait mon code à l'échec.font_ est de type CFont et il est une variable de membre de ma classe MyListControl.
font_.DeleteObject() est une vraie bouée de sauvetage. Il y a une assertion dans wingdi.cpp autour de la ligne de 1113 qui vérifie pour un objet joint.
OriginalL'auteur User