2009-05-06 5 views
1

J'ai une application C++ MFC avec une boîte de dialogue dans laquelle je souhaite modifier dynamiquement le type de contrôle en fonction de la sélection dans une zone de liste déroulante. La ressource de boîte de dialogue commence par un ancien contrôle d'édition simple que j'appelle ensuite SubclassDlgItem pour passer à un type de contrôle personnalisé.Utilisation de SubclassDlgItem pour modifier les types de contrôle

Jusqu'ici tout va bien. Maintenant, quand l'utilisateur change la sélection dans un autre Combobox sur l'écran, je veux changer ce contrôle à un type personnalisé différent. Donc, je détruis le contrôle existant en appelant delete sur le pointeur vers la classe personnalisée pour ce contrôle. J'appelle ensuite :: CreateEx pour recréer mon contrôle d'édition et appelle à nouveau SubclassDlgItem pour créer le nouveau contrôle personnalisé.

Mon problème est que cela scintille un peu, et je pense que je reçois le contrôle d'édition créé avec :: CreateEx au-dessus de mon contrôle personnalisé. Des idées sur la façon de se débarrasser du scintillement, surtout si l'utilisateur change rapidement le contenu de la zone de liste déroulante de contrôle?

+0

Comment puis-je obtenir que de travailler avec un seul ID de contrôle? Ai-je besoin d'appeler à nouveau Unsubclass et Subclass pour changer le contrôle lié à l'ID? – Tyler

Répondre

0

Un de mes collègues a suggéré d'appeler CWnd :: LockWindowUpdate() avant de faire le changement. Donc, cela se résume à quelque chose comme ceci:

CRect r; 
DWORD dwStyle = WS_CHILD|WS_TABSTOP|WS_VISIBLE; 
m_pParent->GetDlgItem(m_nID)->GetWindowRect(&r); 
m_pParent->ScreenToClient(r); 
m_pParent->LockWindowUpdate(); 
m_pParent->InvalidateRect(r); 
delete m_pCust; // Delete the old custom control 
m_pCust = NULL; 
::CreateWindowEx(0, "EDIT", "", dwStyle, r.left, r.top, r.Width(), r.Height(), m_pParent->m_hWnd, (HMENU)m_nID, AfxGetInstanceHandle(), NULL); 
m_pCust = new CustomCtrl(); 
pCust->SubclassDlgItem(m_nID, m_pParent); 
m_pParent->UnlockWindowUpdate() 

Il y a un peu plus involed à cause de ce que fait mon contrôle personnalisé. J'ai fini par appeler m_pParent-> InvalidateRect (r) pour obtenir mon contrôle pour dessiner correctement à la fin.

En outre, il se trouve que le chevauchement du contrôle d'édition :: CreateEx est parce que je l'appelais UnsubclassDlgItem avant de supprimer l'ancien contrôle personnalisé

+0

Encore un autre développeur, qui n'a pas compris, ce que fait 'LockWindowUpdate', et l'a suggéré en fonction de ce qu'il pense faire ([Que fait LockWindowUpdate?] (Https://blogs.msdn.microsoft.com/oldnewthing/ 20070219-00 /? P = 27963)). Ils ont mal deviné, et ce n'est pas une solution à votre problème. L'appel de [CWnd :: ShowWindow] (https://msdn.microsoft.com/en-us/library/72szh9c7.aspx), d'un autre côté, est la solution que vous recherchez. – IInspectable

3

Vous pouvez créer un ensemble de tous les contrôles possibles dans la même zone de la fenêtre parente et n'afficher que le contrôle correspondant et masquer tous les autres. Lorsque l'utilisateur provoque le changement de contrôle, vous masquez le contrôle actif et affichez le nouveau pertinent. Cela devrait avoir l'air plus lisse.

Questions connexes