2016-02-15 12 views
2

У меня есть пользовательский класс, полученный из CListCtrl.Как установить положение элемента управления редактированием, когда EditFilter на CHeaderCtrl

Когда пользователь нажимает на заголовок столбца, я хочу, чтобы он вводил текстовое значение. Я обнаружил, что могу это сделать: CHeaderCtrl :: EditFilter. Я ожидал, что редактирование будет находиться на том же месте, что и текст столбца. На самом деле это рев, поэтому видна только часть контроля и текста. также видна часть ярлыка столбца. Как я могу установить редактировать положение, охватываемый прямоугольником прочитан CHeaderCtrl :: GetItemRect

example preview

void Data_list::OnHdnItemclickpointslist(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR); 
    CHeaderCtrl* header = this->GetHeaderCtrl(); 
    CRect rect; 
    header->GetItemRect(phdr->iItem , rect); 
    int iFilter = header->EditFilter(phdr->iItem , TRUE); 

    // how to set position of edit 
    *pResult = 0; 
} 
+0

Я бы предположил, что верхний левый угол ListView составляет около 4 пикселей на 10 пикселей от верхнего левого угла родительского окна. Чтобы найти это смещение, вы должны использовать 'ClientToScreen'. Или убедитесь, что элемент управления ListView является родительским элементом элемента управления Edit. –

+0

ОК, я могу это сделать, но расчет правильной позиции - это не то, что мне нужно. Для меня важнее узнать, как я могу получить указатель на это редактирование. –

+0

На самом деле я не читал вопрос правильно, мой предыдущий комментарий не имеет смысла. Я не знаком с сообщением «HDM_EDITFILTER» и почему он это делает. –

ответ

0

На основе вашего комментария ответа, вы должны рассмотреть вопрос о принятии другого подхода к сбору данных, которые вы хотите. Я сделал что-то очень похожее, используя следующую методологию.

  • Создайте класс управления Edit, который будет использоваться для сбора данных пользователя . Класс должен быть дочерней переменной-членом CListCtrl.
  • Обрабатывать сообщение «Левая кнопка вниз» из списка. В этом обработчике используйте функцию GetItemRect элемента управления списком для определения какой строки и столбца щелкнул пользователь.
  • Создайте динамический элемент управления Edit в верхней части границ ячейки пользователь щелкнул. Это представит элемент управления Edit для пользователя, который должен ввести данные .
  • Определите, когда пользователь закончил ввод данных, либо через потерянный фокус на элементе управления редактированием, либо в некоторой последовательности клавиш (например, Enter key).
  • Сообщите родительскому элементу управления списком, что редактирование завершено. Это может быть выполнено посредством обмена сообщениями или прямого вызова метода. Убедитесь, что значение передает обновленное значение в родительский элемент управления списком.
  • Элемент управления родительским списком должен собирать переданные обновленные значения и уничтожить дочерний элемент управления Edit.
  • Элемент управления родительским списком затем должен перебирать элемент управления списком , обновляя все «ячейки» в выбранном столбце.

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

+0

Я также рассматривал simmilar решение, возможно, я сделаю это таким образом. Некоторое время назад я попытался закодировать его, но я встретил еще одну проблему: появилось редактирование созданного динамического файла, пока пользователь не переместит мышь над заголовком списка.В этом случае заголовок «обновился» и спрячет мое редактирование. –