Исчерпывающее руководство по написанию всплывающих подсказок
Шрифт:
CTitleTipListBox::~CTitleTipListBox {
ASSERT(!m_bMouseCaptured);
}
int CTitleTipListBox::GetIdealItemRect(int nIndex, LPRECT lpRect) {
// Вычислить размеры идеальной строки. Размеры зависят
// от длины строки. Это работает только для обычных элементов
// "список"(без пользовательской отрисовки)
ASSERT(lpRect);
ASSERT(nIndex >= 0);
DWORD dwStyle = GetStyle;
int nStatus = GetItemRect(nIndex, lpRect);
if (nStatus != LB_ERR && !(dwStyle & LBS_OWNERDRAWFIXED) && !(dwStyle & LBS_OWNERDRAWVARIABLE)) {
CString strItem;
GetText(nIndex, strItem);
if (!strItem.IsEmpty) {
//
Вычислить длину идеального текста.
CClientDC DC(this);
CFont* pOldFont = DC.SelectObject(GetFont);
CSize ItemSize = DC.GetTextExtent(strItem);
DC.SelectObject(pOldFont);
// Взять максимум от обычной ширины и идеальной ширины.
const int cxEdgeSpace = 2;
lpRect->right = max(lpRect->right, lpRect->left + ItemSize.cx + (cxEdgeSpace * 2));
}
} else {
TRACE("Owner-draw listbox detected – override CTitleTipListBox::GetIdeaItemRect\n");
}
return nStatus;
}
void CTitleTipListBox::AdjustTitleTip(int nNewIndex) {
if (!::IsWindow(m_TitleTip.m_hWnd)) {
VERIFY(m_TitleTip.Create(this));
}
if (nNewIndex == m_nNoIndex) {
m_TitleTip.Hide;
} else {
CRect IdealItemRect;
GetIdealItemRect(nNewIndex, IdealItemRect);
CRect ItemRect;
GetItemRect(nNewIndex, ItemRect);
if (ItemRect == IdealItemRect) {
m_TitleTip.Hide;
} else {
// Поправить координаты рядом с краем экрана.
ClientToScreen(IdealItemRect);
int nScreenWidth = ::GetSystemMetrics(SM_CXFULLSCREEN);
if (IdealItemRect.right > nScreenWidth) {
IdealItemRect.OffsetRect(nScreenWidth – IdealItemRect.right, 0);
}
if (IdealItemRect.left < 0) {
IdealItemRect.OffsetRect(-IdealItemRect.left, 0);
}
m_TitleTip.Show(IdealItemRect, nNewIndex);
}
}
if (m_TitleTip.IsWindowVisible) {
//
Удостовериться, что мышь захвачена, чтобы отследить
// момент отключения подсказки.
if (!m_bMouseCaptured && GetCapture != this) {
CaptureMouse;
}
} else {
// Подсказка невидима, поэтому освободить мышь.
if (m_bMouseCaptured) {
VERIFY(ReleaseCapture);
m_bMouseCaptured = FALSE;
}
}
}
void CTitleTipListBox::CaptureMouse {
ASSERT(!m_bMouseCaptured);
CPoint Point;
VERIFY(GetCursorPos(&Point));
ScreenToClient(&Point);
m_LastMouseMovePoint = Point;
SetCapture;
m_bMouseCaptured = TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CTitleTipListBox message handlers
LONG CTitleTipListBox::OnContentChanged(UINT, LONG) {
// Turn off title tip.
AdjustTitleTip(m_nNoIndex);
return Default;
}
void CTitleTipListBox::OnMouseMove(UINT nFlags, CPoint point) {
if (point != m_LastMouseMovePoint && IsAppActive) {
m_LastMouseMovePoint = point;
int nIndexHit = m_nNoIndex;
CRect ClientRect;
GetClientRect(ClientRect);
if (ClientRect.PtInRect(point)) {
// Hit test.
for (int n = 0; nIndexHit == m_nNoIndex && n < GetCount; n++) {
CRect ItemRect;
GetItemRect(n, ItemRect);
if (ItemRect.PtInRect(point)) {
nIndexHit = n;
}
}
}
AdjustTitleTip(nIndexHit);
Поделиться:
Популярные книги
Метатель
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Магия чистых душ
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Барон Дубов
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Попытка возврата. Тетралогия
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Долгий путь домой
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Гардемарин Ее Величества. Инкарнация
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Завод-3: назад в СССР
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Камень. Книга пятая
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Отдельный танковый
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Метатель. Книга 3
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Боярышня Евдокия
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00