tom4ik85
|
|
« : 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; }
Этот код взял с какого-то форума, но к сожалению точно не помню где именно Так вот вопрос. Можно ли каким-то образом по разному мои параметры отобразить. В смысле "джирный / курсив / подчеркнутый" или может цвета разного стандартными средствами? Или много писать нужно? И если кто-то знает, как сделать этот ТулТип активным - типа нажал на какой-то параметр и открывается окно с редактированием соответствующее? Буду благодарен за любую помощь
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #2 : 17-05-2008 18:03 » |
|
Сорри. Я наверное не правильно выразился Я имел ввиду разное форматирование внутри строки. Ну допустим так: _________________________ | Параметр 1 : параметродин | | Параметр 2 : пареметрдва | | Параметр 3: параметртри | |_________________________| Я такое вроде видел в винде, чтоб внутри ToolTipа выводилась строка с разным форматированием.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 17-05-2008 18:22 » |
|
всё равно придётся использовать всё, что я написал, либо искать в интернете уже готовый контрол
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #4 : 17-05-2008 21:05 » |
|
Думаю проще свой контрол написать, и он у тебя хоть трехмерную графику выводить будет, было б время и желание. Хотя... можно как я предлагал тут https://forum.shelek.ru/index.php/topic,8193.msg127161#msg127161, тебе надо (речь естественно о Win API) в своей функции обработки сообщений сделать то что предлагает Алексей, только на API и все. А можно наверное (ну не знаю я MFC, никогда почти))) его не использовал) унаследоваться от стандартного тултипа (если он есть и это реально выполнить) и просто заюзать в отрисовке именно то, что предложил Алексей (тот который пушистый и ушастый) вместо стандартной отрисовке - это сгарантией быстрее всего (если конечно это возможно)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Молодой специалист
Offline
|
|
« Ответ #6 : 17-05-2008 21:43 » |
|
Да это понятно, только я так понял из кода интересующегося товарища tom4ik85, что он MFC использует, так и пусть использует, это будет для его кода и однороднее и понятнее и быстрее в разработке (одну функцию переопределить это быстро, а вот со скальпелем в кишки лезть это дольше, хотя и не намного)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 18-05-2008 08:20 » |
|
lapulya, на самом деле,разницы практически нет, так так MFC-шные варианты функций сделают то же, что и АПИ-шные. Поэтому можно спокойно смешивать
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #8 : 18-05-2008 11:41 » |
|
Да в этом у меня и сомнений нет, поскольку любое действие (над ресурсами ОС имеется ввиду) в конечном итоге реализовано через АПИ причем на людбой платформе. Я говорил про конкретный случай, если уж используется MFC, так и надо по возможности использовать ее, ну а АПИ в случае невозможности реализации через объекты библиотели или при необходимости увеличения производительности.
Ну а в общем случае конечно, можно используя MFC, можно используя АПИ, а можно хоть на асме писать.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
tom4ik85
|
|
« Ответ #9 : 20-05-2008 14:12 » |
|
А можно пожалуйста поподробнее насчет того, что конкретно нужно сделать? В моем коде. Где мне переопроеделять DrawState()? Я класс подсказки использую только для задания цвета, временных задержек и максимальной длины. Сам то текст (в смысле указатель) я в структуру TOOLTIPTEXT ввожу. Или она как раз связана с тем ТулТипом, который я извлекаю из AfxGetThreadState()?? Но тогда мне нужно свой класс, наследник CToolTipCtrl писать, и не уверен получится ли привести то что я достаю из AfxGetThreadState() к моему новому классу. И пожалуйста если не сложно кто может киньте примерчик элементарный, только чтоб там допустим строка выводилась типа aaabbbaaa Или мне просто создавать отдельно ТулТип на основе нового класса и с ним разбираться? Я просто когда начал пробовать с этими Тулами работать, у меня по-умолчанию дебаг стояла конфигурация, и когда запускаешь exe, то никакого ТулТипа не появляется. Потом погуглил, нашел этот код и еще нашел, что у кого-то аналогичные проблемы были. Если Дебаг + F5, то всплывает. Если Дебаг F9 - ничего. Если Релиз - то тоже нормально. Поэтому и остановился на нем. Т.е. не делал явного экземпляра CToolTipCtrl, а только то что в моем коде. Если нельзя так делать, а только учить предков этого класса все делать, то это другой разговор.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 20-05-2008 20:39 » |
|
tom4ik85, я никогда не делал свой тултип. По идее, там должен быть стиль внешней отрисовки. А если нету - поизведи класс от CToolTipCtrl , и сам всё нарисуй в OnPaint а переопределять DrawState() не надо - это уже готовая функция
|
|
|
Записан
|
|
|
|
|