![]() |
|
![]() ![]() ![]() |
|
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Дело такое: есть комбобокс (редактируемый) в который нужно ввести число типа double.
В момент когда юзер жмёт не на ту клавишу выскакивет тултип (облачко) с текстом ... Вот для появления тултипа ему нужно точку на экране дать, ну и как пологается эта точка должна быть на нижней чясти курсора в комбо. И как найти эту точку? Всем спасибо!!! -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Посмотри GetCaretPos, если под курсором ты имеешь в виду каретку.
Добавлено @ 15:37 Возвращаемое значение будет в клиентских координатах окна, содержащего каретку, т.е. комбобоксного эдита. -------------------- ... |
|||
|
||||
Coocky |
|
||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Я б попробывал следующий вариант. Создал Косбобокс и свои классы, производные от CEdit и СListBox.
Вызвал бы функцию CComboBox::GetComboBoxInfo( PCOMBOBOXINFO pcbi);
HWND hwndItem; HWND hwndList; Итнересующие нас поля я отметил жирным щрифтом. Чем же они меня заинтресовали? Да дело в том. что можно просто засабкласить эти окна CWnd:: SubclassWindow( HWND hWnd ); myEdt.SubclassWindow(hwndItem); myListCtrl.SubclassWindow(hwndList); Это означает, что все сообщения для Edit CListCtrl будут попадать в наши окна. Ну а там сам бог руки развязал. Все сообщения и методы окноные доступны. ![]()
![]() Сам бы сделал минут за 20, но реально нет времени. Даже топик лописать. Извини. Побежал ![]() Это сообщение отредактировал(а) Coocky - 4.7.2006, 16:58 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
||||
|
|||||
Dart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 26.6.2006 Где: Саратов, РФ Репутация: 2 Всего: 2 |
В твоем случае CComboBox абсолютно ни при чем - то, что ты редактируешь в основном поле - это CEdit.
Тебе нужна функция PosFromChar (правда это левый верхний угол, так что придется еще помудрить ![]() А вот как узнать позицию курсора, сейчас не помню. Попробуй GetSel - возможно это поможет. Навскидку MSDN просмотрел - не нашел. Но точно знаю, что можно - года 2 назад такое делал сам Добавлено @ 17:22 Ну, точно, как залез в MSDN - вспомнил ![]() Естественно CWnd::GetCaretPos --------------------
ЦитатаЛюблю смотреть, как другие работают Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Coocky, за идею субкласинга спасибо, пригодится даже очень, огромное спасибо, пришол тот момент когда я понял зачем это нужно .
![]() Earnest, Dart, спасибо, CWnd::GetCaretPos это именно то, что нужно. Одно только удручает, что возвращается верхяя точка курсора а нужна нижняя. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Полученная точка находится по центру символа который находится перед кореткой (но с этим я смогу жить)
А в полученой точке Y == 0. Тут размер шрифта не поможет ![]() Это сообщение отредактировал(а) Rapalex - 5.7.2006, 11:06 -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
У нас такой способ работы на работе называют-"костыль"
Впроде бы использовать нужно всего одну функцию-быстро и халявно. Но всегда возникают проблемы ![]() Лучше не ленится, а всегда делать свои классы. производные от нужных. GetCaretPos-вызывал у меня подозрения. но я промолчал. А что б не парится я б все таки сделал свой вариант. Универсальней не бывает. А вдруг дополнительная функциональность понадобится? ![]() Добавлено @ 11:17 Ты всегда можешь воспользоваться GetWindowRect для получения координат. Тебе нужна вертикаль, а для горизонтали поможет уже полюбившийся в этом топике GetCaretPos . Получи координаты окна, переведи клиентские координаты GetCaretPos в оконые ClientToScreen - и ты получишь координаты для создания окна -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Получаю и привожу, деляю свои классы, всё как надо, щяс делаю CEdit потом субкласю с комбо, надеюсь проблемм не будет.
GetCaretPos работает как надо, но возвращает верхнюю точку каретки. Щяс просто прибовляю к точке (GetCaretPos) высоту клиенткой части окна и получается что подсказка появляется по окном. С этим жить можно но в самой винде немного подругому, вот спрашиваю можно ли узнать нижнюю точку мигающей каретки? Проблемму думаю можно будет закрывать, но потом когда всё заработает, всем спасибо. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Ну вот дошол до субкласинга и нарвался на камни.
В CEdit я перегрузил PreTranslateMessage и там смотрел если подходящяя цифра то вызывал метод родителя, если нет возвращял TRUE. В Выпадающем списке решил отсубкласить едит, а как в мануале делаю это тоже в PreTranslateMessage, вызываю GetComboBoxInfo и оно возвращяет FALSE и никого субкласинга быть не может, немогу получит хендл едита комбобокса. И что делать??? ![]() -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Разобрался, отсубкласил в OnCtlColor.
Остался последний вопрос: Можно-ли узнать нижнюю точку мигающей каретки? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Edit является дочкой комбобокса, так что можно его получить через GetWindow (GW_CHILD).
Насчет перехода от верней части каретки к нижней. Спросить TextMetrics у HDC и вычесть высоту не пробовал? Непонятно, почему это может не получиться. -------------------- ... |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Прбывал, у точки полученой от GetCaretPos y = 0, и прибавив высоту не очень красиво получается, посреди буквы, ну да ладно. Спасибо!!!
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Rapalex |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Возвращяюсь я сново к этой темме.
Напомню я пытаюсь создать контрол который будет позволять вводить чило типа double. Легенда: 1 - сделал я CEdit который содержит функию:
а также:
В едите всё работает в норме. 2 - нужно создать комбобокс с такимиже требованиями И тут как нормальный чел, наследую свой класс CCombobox в нём ТОЛЬКО субкласю его эдит своим едитом, запускаю и проблеммы: а - стрелки влево вправо не выплняют навигацию в эдите б - кнопка дел не работет в - потеря фокуса не отробатывает (не прячет подсказку). ПАМАГИТЕ!!! Есть идеи? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
||||
|
|||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |