Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок

Здесь есть возможность читать онлайн «Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Исчерпывающее руководство по написанию всплывающих подсказок: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Исчерпывающее руководство по написанию всплывающих подсказок»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Исчерпывающее руководство по написанию всплывающих подсказок — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Исчерпывающее руководство по написанию всплывающих подсказок», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Класс CTitleTipListBox отвечает за управление элементом TitleTip (см. рис.12). В переменной CTitleTipListBox::m_LastMouseMovePoint хранится последняя позиция курсора мыши. CTitleTipListBox::m_bMouseCaptured показывает, производится ли в данный момент захват мыши (mouse capture). CTitleTipListBox::m_TitleTip – это экземпляр класса CTitleTip, указывающий на показываемую подсказку. CTitleTipListBox::m_nNoIndex – это константа, означающая, что в элементе "список" не отображается подсказка ни для одной строки.

Рис.12. CTitleTipListBox

// TitleTipListBox.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CTitleTipListBox window

#ifndef __TITLETIPLISTBOX_H__

#define __TITLETIPLISTBOX_H__

#include "TitleTip.h"

class CTitleTipListBox : public CListBox { // Construction public:

CTitleTipListBox();

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CTitleTipListBox)

public:

virtual BOOL PreTranslateMessage(MSG* pMsg);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CTitleTipListBox();

protected:

const int m_nNoIndex; // Пустой индекс

CPoint m_LastMouseMovePoint; // Последние координаты курсора мыши

BOOL m_bMouseCaptured; // Захвачена ли мышь?

CTitleTip m_TitleTip; // Показываемый элемент TitleTip

// Этот метод должен быть переопределен элементом "список" с пользовательской отрисовкой.

virtual int GetIdealItemRect(int nIndex, LPRECT lpRect);

void AdjustTitleTip(int nNewIndex);

void CaptureMouse();

BOOL IsAppActive();

// Generated message map functions

protected:

//{{AFX_MSG(CTitleTipListBox)

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnSelchange();

afx_msg void OnKillFocus(CWnd* pNewWnd);

afx_msg void OnDestroy();

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

//}}AFX_MSG

afx_msg LONG OnContentChanged(UINT, LONG);

DECLARE_MESSAGE_MAP()

};

#endif // __TITLETIPLISTBOX_H__

/////////////////////////////////////////////////////////////////////////////

// TitleTipListBox.cpp : implementation file

//

#include "stdafx.h"

#include "TitleTipListBox.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CTitleTipListBox

CTitleTipListBox::CTitleTipListBox() : m_LastMouseMovePoint(0, 0) , m_nNoIndex(-1) {

m_bMouseCaptured = FALSE;

}

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();

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок»

Представляем Вашему вниманию похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


libcat.ru: книга без обложки
Роджер Желязны
Отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок»

Обсуждение, отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x