Я сегодня в движении с MFC!: D
У меня есть текстовое поле и элемент управления представлением списка.
Когда пользователь нажимает клавиши VK_UP
и VK_DOWN
в текстовом поле , яхотелось бы, чтобы это произошло:
- Выполните некоторые действия.
- У элемента управления представлением списка также обрабатывается сообщение (для выделения предыдущего / следующего элемента).
- Я хочу, чтобы представление списка охватывало текущий выбор, , если нажатие клавиши будет первым в его последовательности.
- Сделайте еще кое-что.
Я попытался создать подкласс для своего окна редактирования в моем диалоговом окне:
class MyEditBox : public CWnd
{
bool allowWrap;
afx_msg void OnKeyUp(UINT, UINT, UINT) { this->allowWrap = true; }
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CListCtrl &listView = static_cast<CListView *>(
this->GetParent()->GetDlgItem(IDC_LIST_VIEW))->GetListCtrl();
if (nChar == VK_UP || nChar == VK_DOWN)
{
int iSelBefore = listView.GetNextItem(-1, LVNI_SELECTED);
this->GetParent()->GetDlgItem(IDC_LIST_VIEW)
->OnKeyDown(nChar, nRepCnt, nFlags); //Oops! Protected member :(
int iSelAfter = listView.GetNextItem(-1, LVNI_SELECTED);
if (iSelBefore == iSelAfter && // Did the selection reach an end?
this->allowWrap) // If so, can we wrap it around?
{
int i = a == 0 ? listView.GetItemCount() - 1 : 0;
listView.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED,
LVIS_SELECTED | LVIS_FOCUSED);
}
}
this->allowWrap = false;
}
}
, но OnKeyDown()
является защищенным членом, поэтому я не могупросто вызовите его на другом элементе управления.
Есть ли лучший способ решить эту проблему, чем отправка команды вручную с помощью SendMessage
?Должен ли я изменить свой дизайн, например, подкласс что-то еще и т. Д.?