Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 06-07-2007 05:16 » |
|
(система - XP ) как создать и показать вот такое сообщение (не только в трее, а вообще) ? и, кстати, как оно называется по научному ?
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #1 : 06-07-2007 08:53 » |
|
Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по етому поводу называется "Using ToolTip Controls". Я искал ее по ключевому слову ToolTips. Там и примеры создания есть.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #2 : 06-07-2007 08:57 » |
|
Вот именно такое? А просто CToolTipCtrl не может спасти гиганта мысли?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 06-07-2007 09:44 » |
|
Sands, спасибо за на наводку ) , полезу в мсдн Джон, нее, хочу как в коммиксах
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #4 : 06-07-2007 09:59 » |
|
|
|
« Последнее редактирование: 06-07-2007 10:13 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 06-07-2007 10:16 » |
|
Джон, вау, Джон, спасибо )) Всё, оказывается, элементарно... надо всего лишь добавить к тултипу стиль TTS_BALLOON , но самый прикол, что стиль почему то не описан в commctrl.h , а значение его, как сказано в тексте по ссылке TTS_BALLOON==0x40 и такая лепота
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 06-07-2007 10:27 » |
|
и ещё наткнулся на одну полезную инфу ) CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время появится на экране после наведения курсора
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 11-07-2007 08:43 » |
|
а вот многострочная подсказка никак не получается, "\r\n" не катит... тут как быть ?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #8 : 11-07-2007 09:28 » |
|
Вторую ниже выводи
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 11-07-2007 09:56 » |
|
nikedeforest, в смысле ?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #10 : 11-07-2007 10:01 » |
|
вторую подсказку делай и ниже выводи
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 11-07-2007 10:03 » |
|
nikedeforest, ну, во первых, там она автоматом выскакивет ) Хотелось бы просто текст задать, типа "строка1\r\nстрока2". А кроме того - баллоны друг под другом - это не то...
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #12 : 11-07-2007 10:56 » |
|
Да ты прикинь, может это будет твоя фича
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 11-07-2007 10:58 » |
|
nikedeforest, всё шЮтишь а тем временем, это ведь возможно, только как ?
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #14 : 11-07-2007 14:39 » |
|
У нас в проекте используется вот такое обьявление HWND hwndToolTips = CreateWindowEx(WS_EX_TOPMOST ,TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_BALLOON | TTS_CLOSE, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
if (hwndToolTips) { // Do the standard ToolTip coding. TOOLINFO ti; ti.cbSize = sizeof(ti); ti.uFlags = TTF_TRANSPARENT | TTF_TRACK | NIF_INFO | TTF_PARSELINKS; ti.hwnd = GetSafeHwnd(); ti.uId = 0; ti.lpszText = strInfo.GetBuffer(); ::SendMessage(hwndToolTips, TTM_ADDTOOL, 0, (LPARAM) &ti ); ::SendMessage(hwndToolTips, TTM_TRACKPOSITION, 0, (LPARAM) (DWORD) MAKELONG (wtaskX, wtaskY)); ::SendMessage(hwndToolTips, TTM_SETTITLE, 1, (LPARAM) strCaption.GetBuffer()); ::SendMessage(hwndToolTips, TTM_TRACKACTIVATE, true, (LPARAM) &ti); }
При етом strCaption - ето типа заголовок окна(отобразится жирным), а strInfo - собственно строка с текстом. Обе переменные имеют тип CString. Так вот если в тексте strInfo вставить стандартный сишный разделитель строки "\n", то текст получится многострочным(по крайней мере получается у нас) И если я правильно понял, то MAKELONG (wtaskX, wtaskY) - ето установка позиции откудова появится сама подсказка.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 11-07-2007 15:48 » |
|
Sands, во, спасибо ) Кое какие продвижения есть 1) во первых, непонятно, почему - некоторые константы просто не определены в VC .... вот два, нам нужных enum { TTS_BALLOON = 0x40, TTM_SETTITLE = (WM_USER + 32), }
2) многострочность появляется (по подсказке Sands) так ::SendMessage(m_ToolTip.m_hWnd, (WM_USER + 32),//TTM_SETTITLE 1, (LPARAM) "заголовок");
3) теперь осталось суметь убрать надпись из заголовка и значок, который там появился (хотя, в принципе, можно в качестве заголовка положить первую строку текста, тогда только с иконкой надо бороться) 4) научиться бы также менять иконку ) Там явно не только "i" можно зажечь 5) ещё хотелось бы узнать, как показать подсказку принудительно, а не когда курсор над контролом. Скажем - щёлкнули правой кнопкой мыши по контролу, и показываем подсказку
|
|
« Последнее редактирование: 11-07-2007 15:56 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 12-07-2007 03:37 » |
|
4) с иконками разобрался ::SendMessage(m_ToolTip.m_hWnd, (WM_USER + 32),//TTM_SETTITLE 1, //индекс иконки (LPARAM) "заголовок");
0 - No icon. 1 - Info icon. 2 - Warning icon 3 - Error Icon
Однако избавится от заголовка, не потеряв многострочность - не получается... Можно, конечно, поставить заголовок " " , но тогда сверху пустое место получается. Наверное, всё же нужно будет каждому контролу сопоставить свой тултип, гда в заголовке будет первая строка подсказки 5) показ подсказки по правой кнопке смог сделать так BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) { if(m_ToolTip.m_hWnd) { MSG m=*pMsg; if(m.message==WM_RBUTTONDOWN) { m.message=WM_MOUSEMOVE; m_ToolTip.RelayEvent(&m); } } return CDialog::PreTranslateMessage(pMsg); }
|
|
« Последнее редактирование: 12-07-2007 03:51 от Алексей1153++ »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #17 : 12-07-2007 12:09 » |
|
Я тут нафлудил, мне стало стыдно и я кое что нашел. Думаю это стоит знать цитата из РСДН Первый "скользкий" момент связан с новым видом подсказки – balloon. Дело в том, что в Windows XP есть возможность отключить показ таких подсказок на уровне самой системы. Отвечает за это параметр реестра EnableBalloonTips (тип DWORD): HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced. Так вот, если пользователь выставил этот параметр в 0, а вы приравняете ToolTip.IsBalloon true, то такой пользователь не увидит никакой подсказки – ни balloon, ни обычной прямоугольной. В своем демо-примере я решаю этот вопрос путем проверки указанного параметра
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 12-07-2007 14:17 » |
|
щас надёргаем с народа инфы , в кучу соберём - и в ФАК статейку
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 21-11-2008 06:00 » |
|
хм, вдркг столкнулся с тем, что нужно показывать подсказки для элементов, которые Disabled. По крайней мере для едита и комбы вот это BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) не срабатывает, так как прилетает WM_CANCELMODE решил так: BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) { if(m_ToolTip.m_hWnd) { if(pMsg->message==WM_MOUSEMOVE) { //для WM_MOUSEMOVE
//координаты относительно родителя POINT pnt_r; ::GetCursorPos(&pnt_r); ::MapWindowPoints(0,m_hWnd,&pnt_r,1);
//смотрим - есть ли под курсором окно контрола HWND hw=0; hw=::ChildWindowFromPoint(m_hWnd,pnt_r); if(hw) { if(!::IsWindowEnabled(hw)) { //имитируем WM_MOUSEMOVE для disabled-контрола MSG MsgMM=*pMsg; MsgMM.hwnd=hw;
m_ToolTip.RelayEvent(&MsgMM); } else { //штатно, контрол не disabled m_ToolTip.RelayEvent(pMsg); } } } else { //для всех других сообщений мыши
m_ToolTip.RelayEvent(pMsg); } }
return CDialog::PreTranslateMessage(pMsg); }
так можно и для невидимых контролов тоже "всплыть" подсказки )) (вечером в факе обновлю, кстати)
|
|
« Последнее редактирование: 21-11-2008 06:05 от Алексей1153++ »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #20 : 21-11-2008 09:37 » |
|
Ну раз пошла такая пьянка, тоже как-то недавно народ вдруг решил, что для презентаций MessageBox это как-то не спортивно, все вдруг сразу начинают пальцами тыкать и зубоскальничать дескать "аха, а у вас молоко убежало". Дан был приказ заменить их на окошки типа тултипов. Короче вот такое решение используется (требуется наличие HtnlHelp) - стандартное окошко помощи для контролов - помните такой курсорчик со стрелочкой и вопросом? Короче эту ф-ю можно использовать для показа окошка (прямоугольного) с тенью. Преимущество перед ТТ - в первое время (несколько секунд, точно не знаю) необходимо кликнуть непосредственно в окошко, чтобы его закрыть, те оно быстро не исчезнет, по истечении этого времени оно работает как простой тултип, те само закроется при клике на любой другой элемент (хотя это свойство детально не изучалось): CWnd* pWnd - например окошко диалога POINT pt - примерно точка где должно появится окошко сообщения (точные координаты зависят от длинны сообщения, выбраных границ, выбирается ф-ей) CString stMsg - текст сообщения void ShowContextHelp(CWnd* pWnd, POINT pt, CString stMsg) { HH_POPUP hPop; // HTML Help popup structure memset(&hPop, 0, sizeof(hPop)); hPop.cbStruct = sizeof(hPop); hPop.clrBackground = RGB(255, 255, 208); // цвет фона окошка - я выбрал желтоватый hPop.clrForeground = -1;
// тут понятно - отступы для текста внутри окошка hPop.rcMargins.top = 10; hPop.rcMargins.left = 10; hPop.rcMargins.bottom = 10; hPop.rcMargins.right = 10;
// тут тоже я думаю всё ясно hPop.pt = pt; hPop.pszText = stMsg; hPop.pszFont = NULL;
HtmlHelp(pWnd->GetSafeHwnd(), NULL, HH_DISPLAY_TEXT_POPUP, (DWORD_PTR)&hPop); }
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|