[ad_1]
Je veux pouvoir cliquer sur un bouton dans la zone client et redessiner la zone client.
Mon principal problème est que je n’arrive pas à le faire fonctionner correctement.
ce que j’obtiens, c’est un scintillement après avoir appuyé sur le bouton.
Ce que j’ai essayé :
J’ai essayé.
void CButtonTestView::OnButtonClicked() { AfxMessageBox(L"Button clicked"); Clicked = TRUE; Invalidate(); UpdateWindow(); } void CButtonTestView::OnDraw(CDC* pDC) { CButtonTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: add draw code for native data here pDC->TextOutW(800, 100, _T("Button test")); if (Clicked) { InvalidateRect(nullptr, TRUE); } }
studio visuel 2017.
Toute contribution est appréciée
Solution 1
Pour autant que je sache, tu ne devrais pas appeler InvalidateRect
à l’intérieur OnDraw
parce qu’au final, ça reprogramme OnDraw
encore.
Solution 2
Un CPallini l’a mentionné, vous n’avez pas besoin de l’appel InvalidateRect dans votre gestionnaire OnDraw. Vous vous préparez à une boucle sans fin en procédant de cette façon. À tout le moins, définissez Clicked sur false pour arrêter la boucle.
La cause du scintillement est l’appel à Invalidate() car il a un argument par défaut, delete, défini sur true, ce qui signifie qu’il efface toute la fenêtre. Cela provoque l’appel de OnEraseBkgnd qui remplit toute la fenêtre avec la couleur d’arrière-plan, puis la méthode OnDraw est appelée. Tout cela entraîne un scintillement.
Il existe (au moins) deux manières possibles d’éviter le scintillement. La première consiste à appeler Invalidate et à lui transmettre false afin qu’il n’efface pas l’arrière-plan. Cela ne fonctionnera que si votre méthode OnDraw dessine complètement toute l’image de premier plan, ce qui n’est généralement pas le cas. Une autre façon consiste à s’inspirer du contexte d’un périphérique de mémoire. MFC dispose d’une classe intégrée appelée CMemDC pour vous aider. Il y a aussi ici un article écrit par Keith Rule avec une implémentation simple d’un DC mémoire qui fonctionne très bien. Pour cela, votre gestionnaire OnDraw doit également dessiner l’arrière-plan et vous souhaitez avoir un gestionnaire OnEraseBkgnd qui renvoie simplement TRUE pour indiquer qu’il a été dessiné, mais il ne fait rien.
Solution 3
J’ai un problème avec la boîte de dialogue Modless affichée dans le fil de discussion de l’interface utilisateur. La boîte de dialogue lors de l’activation avec Créer affiche le mode superposé avec une autre boîte de dialogue. Même si je réduis ou agrandis, la boîte de dialogue superposée s’agrandit également. Comment résoudre ça
[ad_2]
コメント