2016-10-19 1 views
5

Dans un projet MFC C++ J'utilise CMFCMenuButton en utilisant MSVC 2013.CMFCMenuButton pas correctement repeindre lorsque le basculement haute mode contraste

Quand je bascule le high contrast mode le bouton est pas correctement repeint (à titre de comparaison un bouton normal est affiché) :

broken repaint of CMFCMenuButton after toggling high contrast mode

appel Invalidate() ou ShowWindow(SW_HIDE);ShowWindow(SW_SHOW); semblent avoir aucun effet - même minimiser la boîte de dialogue ne provoque pas de redessiner appropriée. Comment puis-je forcer le bouton à repeindre avec la couleur du système mis à jour?

Mise à jour: Le forçage des couleurs après le basculement du mode de contraste rend le texte du bouton visible, mais le bouton lui-même, la bordure, n'est pas visible.

m_ctrlOkButton.SetFaceColor(::GetSysColor(COLOR_BTNFACE)); 
m_ctrlOkButton.SetTextColor(::GetSysColor(COLOR_BTNTEXT)); 
+1

CMFCMenuButton est dessiné par le propriétaire. Il apperas le contrôle ne détecte pas la modification du schéma de couleurs de l'interface utilisateur, de sorte que vous devrez peut-être détecter le changement de mode de contraste et modifier les couleurs du bouton pour l'afficher. – 1201ProgramAlarm

+0

@ 1201ProgramAlarm Merci pour l'indice, a été en mesure de résoudre ce problème en attendant ... – MrTux

Répondre

3

Cela m'a pris un moment, mais j'ai été capable de résoudre ce problème. Je suis héritant de la classe CMFCMenuButton pour que je puisse gérer certains événements:

  1. obtenir la couleur sur le bouton droit:
    gérer l'événement WM_SYSCOLORCHANGE et appeler GetGlobalData()->UpdateSysColors(); (assurez-vous qu'il est propagé à notre parent avant, par exemple , par __super::OnSysColorChange();)

  2. Obtenez le droit de bordure et le fond:
    Gérer l'événement WM_THEMECHANGED et appelez CMFCVisualManager::GetInstance()->DestroyInstance(); afin de fermer toutes les opened theme data handles.