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

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

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


« : 06-07-2007 05:16 » 

(система - XP )
как создать и показать вот такое сообщение (не только в трее, а вообще) ?


и, кстати, как оно называется по научному ? Улыбаюсь



* context_help.GIF (5.76 Кб - загружено 4461 раз.)
Записан

Sands
Помогающий

ua
Offline Offline

« Ответ #1 : 06-07-2007 08:53 » 

Называется ето сообщение Balloon ToolTip. В МСДН-е есть статейка по етому поводу называется "Using ToolTip Controls". Я искал ее по ключевому слову ToolTips. Там и примеры создания есть.
Записан
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 06-07-2007 09:44 » 

Sands, спасибо за на наводку ) , полезу в мсдн

Джон, нее, хочу как в коммиксах Улыбаюсь

Записан

Джон
просто
Администратор

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

« Ответ #4 : 06-07-2007 09:59 » 

на codeproject посмотри, там большая темка была про такие извращения. Ага

в поиске задай balloon

http://www.codeproject.com/shell/LiviuBirjegaCode.asp

http://www.codeproject.com/useritems/wtlntray.asp
« Последнее редактирование: 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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 06-07-2007 10:16 » 

Джон, вау, Джон, спасибо ))  Всё, оказывается, элементарно...
надо всего лишь добавить к тултипу стиль TTS_BALLOON , но самый прикол, что стиль почему то не описан в commctrl.h , а значение его, как сказано в тексте по ссылке
TTS_BALLOON==0x40

и такая лепота Улыбаюсь
Записан

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

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


« Ответ #6 : 06-07-2007 10:27 » 

и ещё наткнулся на одну полезную инфу )
Код:
CToolTipCtrl::SetDelayTime(TTDT_AUTOPOP,10000);//время горения
CToolTipCtrl::SetDelayTime(TTDT_INITIAL,300);//через какое время
         появится на экране после наведения курсора
Записан

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

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


« Ответ #7 : 11-07-2007 08:43 » 

а вот многострочная подсказка никак не получается, "\r\n" не катит...
тут как быть ?
Записан

nikedeforest
Команда клуба

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

« Ответ #8 : 11-07-2007 09:28 » 

Вторую ниже выводи Улыбаюсь
Записан

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

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


« Ответ #9 : 11-07-2007 09:56 » 

nikedeforest, в смысле ?
Записан

nikedeforest
Команда клуба

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

« Ответ #10 : 11-07-2007 10:01 » 

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

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

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


« Ответ #11 : 11-07-2007 10:03 » 

nikedeforest, ну, во первых, там она автоматом выскакивет )  Хотелось бы просто текст задать, типа "строка1\r\nстрока2". А кроме того - баллоны друг под другом - это не то...
Записан

nikedeforest
Команда клуба

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

« Ответ #12 : 11-07-2007 10:56 » 

Да ты прикинь, может это будет твоя фича Улыбаюсь
Записан

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

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


« Ответ #13 : 11-07-2007 10:58 » 

nikedeforest, всё шЮтишь Улыбаюсь

а тем временем, это ведь возможно, только как ?
Записан

Sands
Помогающий

ua
Offline 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) - ето установка позиции откудова появится сама подсказка.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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++ » Записан

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

ru
Offline 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
Команда клуба

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

« Ответ #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, ни обычной прямоугольной. В своем демо-примере я решаю этот вопрос путем проверки указанного параметра
Записан

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

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


« Ответ #18 : 12-07-2007 14:17 » 

Улыбаюсь щас надёргаем с народа инфы , в кучу соберём - и в ФАК статейку
Записан

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

ru
Offline 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++ » Записан

Джон
просто
Администратор

de
Offline 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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines