Здравствуйте, уважаемые спецмалисты. Пожалуйста, помогите решить проблемку (поиск не помог).
Имеется ListView, стиль Report. Я редактирую текст ячеек этой таблицы дополнительным editbox'ом. Но вот ведь проблема: как поместить текст в эдитбоксе точно по тем же координатам, что он был в SubItem ListView? Чтобы при нажатии мышкой на ячейку просто появлялся курсор и текст редактировался, но не смещался.
Я заглянул в SDK, и нашел там следующие флаги для LVM_GETSUBITEMRECT:
LVIR_BOUNDS==LVIRLABEL — координаты всей ячейки (SubItem), кстати кривовато работает, ну да ладно.
LVIR_ICON — картинок у меня в таблице нет.
То есть нет и намека на координаты (смещение) самого текста. Их как нибудь можно узнать?
Здравствуйте, Antech, Вы писали:
A>Я заглянул в SDK, и нашел там следующие флаги для LVM_GETSUBITEMRECT: A>LVIR_BOUNDS==LVIRLABEL — координаты всей ячейки (SubItem), кстати кривовато работает, ну да ладно.
А в чем кривизна? Делай поправку в пиксель-два на рамку Edit-а. Тогда второй вопрос отпадет сам собой. С размерами рамки придется немного повозиться, зато подмена ячейки ListView на EditText проходит незаметно.
A>То есть нет и намека на координаты (смещение) самого текста. Их как нибудь можно узнать?
Re[2]: Таблица ListView: смещение текста в ячейке.
Здравствуйте, Privalov, Вы писали:
P>А в чем кривизна? Делай поправку в пиксель-два на рамку Edit-а.
Если бы все было так просто... Я уже упарился с этим вопросом . Рамки эдита у меня нет, он по размерам занимает всю ячейку, а ячейкой я считаю итем, не включая линий сетки. Но ведь исходный текст в итеме/сабитеме Винда выводит с некоторым смещением относительно границы ячейки (есть поля). Причем смещение это зависит от размера шрифта. Ну это как MARGINS в эдитбоксе (EM_SETMAGINS/EM_GETMARGINS). Но в эдитбоксе можно узнать хотя бы левое и правое поле (не знаю, как еще Это назвать), а в таблице подобных способов я не нешел. На codeguru и codeproject люди лепят эдитбоксы с постоянным смещением типа rcEdit.left=rcItem.left+5, но это же лажа, друзя .
Re[2]: Таблица ListView: смещение текста в ячейке.
Да, извиняюсь, так и не написал в чем кривизна LVM_GETITEMRECT. Там у rcItem пара границ совпадает с линиями сетки, другие границы почему-то не включают линии сетки, т. е. смещены на 1 пиксель внутрь ячейки.
Re[3]: Таблица ListView: смещение текста в ячейке.
Здравствуйте, Antech, Вы писали:
A>Здравствуйте, Privalov, Вы писали:
P>>А в чем кривизна? Делай поправку в пиксель-два на рамку Edit-а.
A>Если бы все было так просто... Я уже упарился с этим вопросом . Рамки эдита у меня нет,
[...]
Так сделай, чтобы рамка была, да пожирнее, трехмерная. Я вот сейчас посмотрел — действительно есть незначительный сдвиг — пиксель-два. Но если трехмерная рамка ложится точно на клетку, она производит двойной эффект — отвлекает внимание от прыжков и показывает, что именно редактируется. Если бы ты вопрос этот не поднял сейчас, я бы до сих пор никакого сдвига не заметил. А прога уже около года работает, и пока все тихо.
Re[4]: Таблица ListView: смещение текста в ячейке.
Здравствуйте, Privalov, Вы писали:
P>Так сделай, чтобы рамка была, да пожирнее, трехмерная.
Нет, никаких рамок быть не должно, это я так сказал . Ну действительно, не хочу я рамочки добавлять. Хотя мысль с отвлеканием внимания мне понравилась .
А смещение Вы увидите, когда увеличите шрифт в таблице, скажем Arial на 30. У меня раньше было задано постоянное смещение (для стандартного шрифта работало замечательно), сейчас делаю новую версию интерфейсной бибки, устраняю недостатки и т. д.
Итак, есть версии как определить смещение?
Re[4]: Таблица ListView: смещение текста в ячейке.
Кстати, еще важный вопрос, немного оффтопик. У меня в этой таблице еще листбокс используется, он вылезает за границы таблицы, ну и в общем для этого надо SetCapture() делать (окно ListBox не WS_CHILD, при клике вне его надо захлопнуть листбокс и т. д.). Допустим, я сделал SetCapture(hWnd) и в оконной функции hWnd ловлю WM_LBUTTONDOWN. Я ввожу изменения и релизаю мышку ReleaseCapture(). Но вот проблема: если нажимаю на другую ячейку таблицы, окно редактирования-то скрывается, но таблица не получает WM_LBUTTONDOWN, и соответственно не начинается редактирование кликнутой ячейки, что совсем неудобно! Как побороть?