Здравствуйте, BuHHunyx, Вы писали:
BHH>Здравствуйте, Константин Ленин, Вы писали:
КЛ>>>LRESULT CSomeDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) КЛ>>>{ КЛ>>> m_jobToolTips.Create(*this); //OK КЛ>>> m_jobToolTips.AddTool(*this); //TRUE КЛ>>> m_jobList.SetToolTips(m_jobToolTips); //OK КЛ>>>}
КЛ>>в Spy++ в Messages для jobToolTips вижу только TTN_POP и TTN_RELAYEVENT
BHH>Посмотри как сделано здесь BHH>А можно и просто этот классик поюзать...
Проблема была в
КЛ>>> m_jobToolTips.AddTool(*this); //TRUE
Надо было m_jobToolTips.AddTool(m_jobList) тк CToolInfo::Init выглядит так:
Здравствуйте, BuHHunyx, Вы писали:
BHH>Здравствуйте, Константин Ленин, Вы писали:
КЛ>>>LRESULT CSomeDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) КЛ>>>{ КЛ>>> m_jobToolTips.Create(*this); //OK КЛ>>> m_jobToolTips.AddTool(*this); //TRUE КЛ>>> m_jobList.SetToolTips(m_jobToolTips); //OK КЛ>>>}
КЛ>>в Spy++ в Messages для jobToolTips вижу только TTN_POP и TTN_RELAYEVENT
BHH>Посмотри как сделано здесь BHH>А можно и просто этот классик поюзать...
Какой-то он децл глючный, при наведении тултип показывается в одном месте, а потом быстро "перебигает" в другое, под курсор
И еще, есть мысль создавать background окно для обработки сообщений парэнт-окну. WM_TIMER например, чтобы не конфликтовать с таймерами парэнта.
Здравствуйте, Константин Ленин, Вы писали:
КЛ>Здравствуйте, BuHHunyx, Вы писали:
BHH>>Здравствуйте, Константин Ленин, Вы писали:
КЛ>>>>LRESULT CSomeDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) КЛ>>>>{ КЛ>>>> m_jobToolTips.Create(*this); //OK КЛ>>>> m_jobToolTips.AddTool(*this); //TRUE КЛ>>>> m_jobList.SetToolTips(m_jobToolTips); //OK КЛ>>>>}
КЛ>>>в Spy++ в Messages для jobToolTips вижу только TTN_POP и TTN_RELAYEVENT
BHH>>Посмотри как сделано здесь BHH>>А можно и просто этот классик поюзать...
КЛ>Какой-то он децл глючный, при наведении тултип показывается в одном месте, а потом быстро "перебигает" в другое, под курсор КЛ>И еще, есть мысль создавать background окно для обработки сообщений парэнт-окну. WM_TIMER например, чтобы не конфликтовать с таймерами парэнта.
Вообщето для того, чтобы подсовывать типы для ListView надо обрабатывать не TTN_NEEDTEXT а LVN_GETINFOTIP. Это первое, что я заметил. В добавлении ToolItem-а не стал разбираться, возможно у тебя все правильно. Я делаю так:
и у меня все прекрасно работает. Возможно что-то здесь и лишнее, но разбираться было уже лень, т.к. пришел я к такому варианту через огромное количество глюков . Надеюсь, что помог.
Удачи.
Здравствуйте, programmater, Вы писали:
P>Вообщето для того, чтобы подсовывать типы для ListView надо обрабатывать не TTN_NEEDTEXT а LVN_GETINFOTIP. Это первое, что я заметил. В добавлении ToolItem-а не стал разбираться, возможно у тебя все правильно. Я делаю так: P>
Здравствуйте, programmater, Вы писали:
P>Здравствуйте, programmater, Вы писали:
P>>Вообщето для того, чтобы подсовывать типы для ListView надо обрабатывать не TTN_NEEDTEXT а LVN_GETINFOTIP. Это первое, что я заметил. В добавлении ToolItem-а не стал разбираться, возможно у тебя все правильно. Я делаю так: P>>
Здравствуйте, Константин Ленин, Вы писали:
КЛ>Здравствуйте, programmater, Вы писали:
P>>Здравствуйте, programmater, Вы писали:
P>>>Вообщето для того, чтобы подсовывать типы для ListView надо обрабатывать не TTN_NEEDTEXT а LVN_GETINFOTIP. Это первое, что я заметил. В добавлении ToolItem-а не стал разбираться, возможно у тебя все правильно. Я делаю так: P>>>
P>>Да, забыл сказать, что это код функции OnCreate(...).
Причем OnCreate класса, который сабклассится к ListView и обрабатывает отраженные сообщения, соответственно m_hWnd — это хендл окна ListView, а не родительского диалога. Но идею ты понял верно.
КЛ>Не получается(
КЛ>OnToolTipText не вызывается
Да, у меня в таком варианте (см. выделенную строку) тоже не работало, уж не знаю почему. Опытным путем пришел к строке, которая у меня.
RECT RectTool={0,0,1000,1000};
m_jobToolTips.AddTool(m_jobList.m_hWnd,LPSTR_TEXTCALLBACK,&RectTool,1);
КЛ>>OnToolTipText не вызывается P>Да, у меня в таком варианте (см. выделенную строку) тоже не работало, уж не знаю почему. Опытным путем пришел к строке, которая у меня. P>
Компилю под юникод.
Да, работает если только заданы lpRectTool и nIDTool
Причем если почитать документацию по TOOLINFO и посмотреть CToolInfo то вообще-то должно работать и без них. В общем хрень какая-то.
TOOLINFO.hwnd по MSDN должен содержать хэндл парент окна, которое будет получать LVN_GETTIPINFO, а при наших условиях он содержит хэндл листвью контрола. Походу документация врет...
НО, у меня это все равно глючит! Они мне нужны для отображения текста, если он слишком длинный и не помещается в листвью. Но вот как раз на таких айтемах тулипы мигают, либо сразу пропадают, а на коротких все ок.
Вот это х...
Здравствуйте, Константин Ленин, Вы писали:
КЛ>>>OnToolTipText не вызывается P>>Да, у меня в таком варианте (см. выделенную строку) тоже не работало, уж не знаю почему. Опытным путем пришел к строке, которая у меня. P>>
P>>Надеюсь поможет.
КЛ>Компилю под юникод. КЛ>Да, работает если только заданы lpRectTool и nIDTool КЛ>Причем если почитать документацию по TOOLINFO и посмотреть CToolInfo то вообще-то должно работать и без них. В общем хрень какая-то. КЛ>TOOLINFO.hwnd по MSDN должен содержать хэндл парент окна, которое будет получать LVN_GETTIPINFO, а при наших условиях он содержит хэндл листвью контрола. Походу документация врет...
Эй-эй, по-осторожнее! Читай внимательней! по MSDN TOOLINFO.hwnd должен содержать хэндл парент окна, которое будет получать TTN_GETDISPINFO notification messages. Соображаешь? А это именно хэндл листвью контрола, и ни что иное. А листвью контрол уже соображает, над каким айтемом находится мышиный курсор и переводит TTN_GETDISPINFO в LVN_GETINFOTIP с указанием конкретного айтема, чтобы тебе было удобнее обрабатывать. Так что тут все правильно. КЛ>НО, у меня это все равно глючит! Они мне нужны для отображения текста, если он слишком длинный и не помещается в листвью. Но вот как раз на таких айтемах тулипы мигают, либо сразу пропадают, а на коротких все ок. КЛ>Вот это х...
Морганий у меня не было. Возможно потому, что не работал с in-place хинтами (у меня просто подсказка вылезает и все). С юникодом у меня была след трабла (я об этом писал): если текст записывать в буфер, на который указывает pszText структуры NMLVGETINFOTIP, то все нормально, но если самому изменить pszText так, чтобы он указывал на твой буфер, то подсказка не вылезает. С ANSI работает и так и этак. Подробнее здесь
P>Эй-эй, по-осторожнее! Читай внимательней! по MSDN TOOLINFO.hwnd должен содержать хэндл парент окна, которое будет получать TTN_GETDISPINFO notification messages. Соображаешь? А это именно хэндл листвью контрола, и ни что иное. А листвью контрол уже соображает, над каким айтемом находится мышиный курсор и переводит TTN_GETDISPINFO в LVN_GETINFOTIP с указанием конкретного айтема, чтобы тебе было удобнее обрабатывать. Так что тут все правильно.
Спасибо, почитаю.
И где же это написано, что это должне быть именно листвью?
Создал тестовую аппликуху и у меня отлично работает такой вот код
#define TIMER_ID 500
class CListViewTrackTip : public CMessageMap
{
CContainedWindowT<CListViewCtrl> m_ctrlList;
CToolTipCtrl m_ctrlTip;
CWindow m_wndOwner;
TOOLINFO m_Info;
int m_nCurItem;
bool m_bTrackingMouseLeave;
public:
BEGIN_MSG_MAP(CListViewTrackTip)
NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolTip);
ALT_MSG_MAP(1)
END_MSG_MAP()
public:
CListViewTrackTip() : m_ctrlList(this, 1), m_nCurItem(-1), m_bTrackingMouseLeave(false){}
~CListViewTrackTip()
{
if( m_ctrlTip.IsWindow() ) m_ctrlTip.DestroyWindow();
if( m_ctrlList.IsWindow() ) m_ctrlList.UnsubclassWindow();
}
void Attach( CListViewCtrl ctrlList, HWND hwndOwner )
{
HWND hwndList = ctrlList;
ATLASSERT(::IsWindow(hwndOwner));
ATLASSERT(::IsWindow(hwndList));
ATLASSERT(!m_ctrlList.IsWindow()); // Only attach once
m_wndOwner = hwndOwner;
m_ctrlList.SubclassWindow(hwndList);
// Create the tooltip
DWORD dwStyle = WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP;
m_ctrlTip.Create(hwndList, CWindow::rcDefault, NULL, dwStyle, WS_EX_TOPMOST);
ATLASSERT(m_ctrlTip.IsWindow());
m_ctrlTip.SetWindowPos(HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
// Add the ListView as a ToolTip tool...
m_Info = CToolInfo(TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE, hwndList);
m_Info.hwnd = m_wndOwner;//owner may be not a direct parent
m_ctrlTip.AddTool(&m_Info);
m_ctrlTip.TrackActivate(&m_Info, FALSE);
}
LRESULT OnToolTip(int/*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMTTDISPINFO lpnmtdi = (LPNMTTDISPINFO) pnmh;
if( pnmh->hwndFrom != m_ctrlTip )
{
bHandled = FALSE;
return 0;
}
_bstr_t bsText;
m_ctrlList.GetItemText(m_nCurItem, 0, bsText.GetBSTR());
lpnmtdi->lpszText = new TCHAR[ bsText.length() + 1 ];//тут нужно выделять пямять под lpnmtdi->lpszText?
_tcscpy(lpnmtdi->lpszText, (LPCTSTR)bsText);
return 0;
}
};
Так вот в тестовой все работает отлично, а вмоем проекте тултипы показываются за(!) диалогом
Здравствуйте, Константин Ленин, Вы писали:
P>>Эй-эй, по-осторожнее! Читай внимательней! по MSDN TOOLINFO.hwnd должен содержать хэндл парент окна, которое будет получать TTN_GETDISPINFO notification messages. Соображаешь? А это именно хэндл листвью контрола, и ни что иное. А листвью контрол уже соображает, над каким айтемом находится мышиный курсор и переводит TTN_GETDISPINFO в LVN_GETINFOTIP с указанием конкретного айтема, чтобы тебе было удобнее обрабатывать. Так что тут все правильно.
КЛ>Спасибо, почитаю. КЛ>И где же это написано, что это должне быть именно листвью?
Нигде. Это следует из простых логических рассуждений. Листвью получает TTN_GETDISPINFO и форвардит его тебе в виде LVN_GETINFOTIP, чтобы тебе было удобно его обрабатывать. Если листвью не получит TTN_GETDISPINFO, то ты не получишь LVN_GETINFOTIP, только и всего. Это действительно написано. Если же ты работаешь с TTN_GETDISPINFO (или TTN_NEEDTEXT) напрямую, то флаг переполнения тебе в руки (это шутка такая) , тогда TOOLINFO.hwnd может быть действительно любое окно (которое способно обрабатывать это сообщение). Только из твоего примера тестовой апликухи я не понял, откуда ты возьмешь
насколько я понимаю LVN_GETINFOTIP как раз и отвечает за передачу тебе корректного CurItem-а, над которым в данный момент находится курсор, чтобы ты этим не занимался.
КЛ>Так вот в тестовой все работает отлично, а вмоем проекте тултипы показываются за(!) диалогом
Ну....