Использование SubclassDlgItem для изменения типов элементов управления - PullRequest
1 голос
/ 06 мая 2009

У меня есть приложение C ++ MFC с диалоговым окном, в котором я хочу динамически изменять тип элемента управления на основе выбора в поле со списком. Ресурс диалога начинается с простого старого элемента управления редактирования, который я затем вызываю SubclassDlgItem, чтобы изменить его на пользовательский тип элемента управления.

Пока все хорошо. Теперь, когда пользователь меняет выбор в другом Combobox на экране, я хочу изменить этот элемент управления на другой пользовательский тип. Итак, я уничтожаю существующий элемент управления, вызывая delete для указателя на пользовательский класс для этого элемента управления. Затем я вызываю :: CreateEx, чтобы заново создать свой элемент управления для редактирования, и снова вызываю SubclassDlgItem, чтобы создать новый пользовательский элемент управления.

Моя проблема в том, что это немного мигает, и я думаю, что я получаю элемент управления для редактирования, созданный с помощью :: CreateEx поверх моего пользовательского элемента управления. Любые идеи о том, как избавиться от мерцания, особенно если пользователь быстро меняет содержимое поля со списком управления?

Ответы [ 2 ]

3 голосов
/ 06 мая 2009

Вы можете создать набор всех возможных элементов управления в той же области родительского окна, отобразить только соответствующий и скрыть все остальные. Когда пользователь вызывает изменение элемента управления, вы скрываете активный элемент управления и отображаете новый соответствующий элемент. Это должно выглядеть гладко.

0 голосов
/ 06 мая 2009

Мой коллега предложил вызвать CWnd :: LockWindowUpdate (), прежде чем я сделаю переключение. Итак, все сводится к следующему:

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()

Есть немного больше из-за того, что делает мой пользовательский элемент управления. В итоге я вызвал m_pParent-> InvalidateRect (r), чтобы заставить мой элемент управления правильно рисовать в конце.

Также оказывается, что перекрытие элемента управления :: CreateEx произошло потому, что я вызывал UnsubclassDlgItem перед удалением старого пользовательского элемента управления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...