Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: модернизация ToolTipа  (Прочитано 10878 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« : 17-05-2008 12:40 » 

Здравствуйте. Опять возник вопросик, который без помощи никак не решу, наверное.
У меня есть диалог, а на нем много контролов и у каждого куча свойств, которые мне нужно вывести на тултип.
ТулТип у меня сделан так:
Код:
// при инициализации диалога вызвал EnableToolTips(TRUE), а потом

BOOL CDlg::OnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
    UINT nID = pNMHDR->idFrom;

    if (pTTT->uFlags & TTF_IDISHWND)
    {
        // idFrom is actually the HWND of the tool
        nID = ::GetDlgCtrlID((HWND)nID);
        CToolTipCtrl* ptt = AfxGetThreadState()->m_pToolTip;

  ptt->SetMaxTipWidth(400);
  ptt->SetTipBkColor(RGB(255,255,255));
  ptt->SetDelayTime(TTDT_INITIAL, 100);
  ptt->SetDelayTime(TTDT_AUTOPOP, 10000);
       
        CString str;
        str.Format("%s %s %s %s %s", m_str1, m_str2, m_str3, m_str4, m_str5);
        // здесь все параметры добавляются в строчку для вывода

  pTTT->lpszText = str.GetBuffer(0);
  return TRUE;
    }
    return FALSE;
}
Этот код взял с какого-то форума, но к сожалению точно не помню где именно Жаль
Так вот вопрос. Можно ли каким-то образом по разному мои параметры отобразить. В смысле "джирный / курсив / подчеркнутый" или может цвета разного стандартными средствами? Или много писать нужно?
И если кто-то знает, как сделать этот ТулТип активным - типа нажал на какой-то параметр и открывается окно с редактированием соответствующее?
Буду благодарен за любую помощь Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 17-05-2008 15:09 » 

детали расписать сейчас не могу - это надо сидеть и вспоминать (редко пользуюсь, на память - туго)

можно выводить текст при помощи метода
CDC::DrawState

(а именно вариант)
Код:
BOOL DrawState(
   CPoint pt,
   CSize size,
   LPCTSTR lpszText,
   UINT nFlags,
   BOOL bPrefixText = TRUE,
   int nTextLen = 0,
   CBrush* pBrush = NULL

режим фона текста -
CDC::SetBkMode()

цвет текста и фона -
CDC::SetTextColor()
CDC::SetBkColor()

шрифт устанавливать для окна через CWnd::SetFont()

размер выводимого определять при помощи
GetTextExtentPoint32()

пробуй, если что - задавай вопросы по деталям Улыбаюсь
Записан

tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 17-05-2008 18:03 » 

Сорри. Я наверное не правильно выразился Жаль
Я имел ввиду разное форматирование внутри строки.
Ну допустим так:
_________________________
|Параметр 1 : параметродин   |
|Параметр 2 : пареметрдва       |
|Параметр 3: параметртри       |
|_________________________|
Я такое вроде видел в винде, чтоб внутри ToolTipа выводилась строка с разным форматированием.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 17-05-2008 18:22 » 

всё равно придётся использовать всё, что я написал, либо искать в интернете уже готовый контрол Улыбаюсь
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #4 : 17-05-2008 21:05 » 

Думаю проще свой контрол написать, и он у тебя хоть трехмерную графику выводить будет, было б время и желание. Хотя... можно как я предлагал тут https://forum.shelek.ru/index.php/topic,8193.msg127161#msg127161, тебе надо (речь естественно о Win API) в своей функции обработки сообщений сделать то что предлагает Алексей, только на API и все. А можно наверное (ну не знаю я MFC, никогда почти))) его не использовал) унаследоваться от стандартного тултипа (если он есть и это реально выполнить) и просто заюзать в отрисовке именно то, что предложил Алексей (тот который пушистый и ушастый) вместо стандартной отрисовке - это сгарантией быстрее всего (если конечно это возможно)
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 17-05-2008 21:26 » 

lapulya, всё, что я написал в посте выше - это всё элементарно переделывается в АПИ:

Код:
BOOL DrawState(
  HDC hdc,                     // handle to device context
  HBRUSH hbr,                  // handle to brush
  DRAWSTATEPROC lpOutputFunc,  // callback function
  LPARAM lData,                // image information
  WPARAM wData,                // more image information
  int x,                       // horizontal location
  int y,                       // vertical location
  int cx,                      // image width
  int cy,                      // image height
  UINT fuFlags                 // image type and state
);

int SetBkMode(
  HDC hdc,      // handle to DC
  int iBkMode   // background mode
);

цвет текста и фона -
COLORREF SetTextColor(
  HDC hdc,           // handle to DC
  COLORREF crColor   // text color
);

COLORREF SetBkColor(
  HDC hdc,           // handle to DC
  COLORREF crColor   // background color value
);

-------------

An application sends a WM_SETFONT message to specify the font that a control is to use when drawing text.
Syntax

To send this message, call the SendMessage function as follows.
lResult = SendMessage(      // returns LRESULT in lResult     (HWND) hWndControl,      // handle to destination control     (UINT) WM_SETFONT,      // message ID     (WPARAM) wParam,      // = (WPARAM) () wParam;    (LPARAM) lParam      // = (LPARAM) () lParam; ); 

---------------

GetTextExtentPoint32() - это уже АПИ

Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 17-05-2008 21:43 » 

Да это понятно, только я так понял из кода интересующегося товарища tom4ik85, что он MFC использует, так и пусть использует, это будет для его кода и однороднее и понятнее и быстрее в разработке (одну функцию переопределить это быстро, а вот со скальпелем в кишки лезть это дольше, хотя и не намного)
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 18-05-2008 08:20 » 

lapulya, на самом деле,разницы практически нет, так так MFC-шные варианты функций сделают то же, что и АПИ-шные. Поэтому можно спокойно смешивать
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 18-05-2008 11:41 » 

Да в этом у меня и сомнений нет, поскольку любое действие (над ресурсами ОС имеется ввиду) в конечном итоге реализовано через АПИ причем на людбой платформе. Я говорил про конкретный случай, если уж используется MFC, так и надо по возможности использовать ее, ну а АПИ в случае невозможности реализации через объекты библиотели или при необходимости увеличения производительности.

Ну а в общем случае конечно, можно используя MFC, можно используя АПИ, а можно хоть на асме писать.
Записан

С уважением Lapulya
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #9 : 20-05-2008 14:12 » 

А можно пожалуйста поподробнее насчет того, что конкретно нужно сделать?
В моем коде.
Где мне переопроеделять DrawState()?
Я класс подсказки использую только для задания цвета, временных задержек и максимальной длины.
Сам то текст (в смысле указатель) я в структуру TOOLTIPTEXT ввожу.
Или она как раз связана с тем ТулТипом, который я извлекаю из AfxGetThreadState()??
Но тогда мне нужно свой класс, наследник CToolTipCtrl писать, и не уверен получится ли привести то что я достаю из
AfxGetThreadState() к моему новому классу.
И пожалуйста если не сложно кто может киньте примерчик элементарный, только чтоб там допустим строка выводилась типа
aaabbbaaa
Или мне просто создавать отдельно ТулТип на основе нового класса и с ним разбираться?
Я просто когда начал пробовать с этими Тулами работать, у меня по-умолчанию дебаг стояла конфигурация, и когда запускаешь exe, то никакого ТулТипа не появляется. Потом погуглил, нашел этот код и еще нашел, что у кого-то аналогичные проблемы были. Если Дебаг + F5, то всплывает. Если Дебаг F9 - ничего. Если Релиз - то тоже нормально.
Поэтому и остановился на нем. Т.е. не делал явного экземпляра CToolTipCtrl, а только то что в моем коде.
Если нельзя так делать, а только учить предков этого класса все делать, то это другой разговор.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 20-05-2008 20:39 » new

tom4ik85, я никогда не делал свой тултип. По идее, там должен быть стиль внешней отрисовки. А если нету - поизведи класс от CToolTipCtrl , и сам всё нарисуй в OnPaint Улыбаюсь

а переопределять DrawState() не надо - это уже готовая функция
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines