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

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

ru
Offline Offline

« : 25-06-2013 14:07 » 

Visual Studio 10.
Контрол - MFC Button Control.
Команды
m_TestToolTip.EnableToolTips(true);
m_TestToolTip.SetTooltip("Тестовая кнопка с тестовым тултипом лишь \n"\
   "осталось придумать как переносить его со строчки на строчку.");
Невзирая на все мои усилия конечный результат упорно записывается в одну строчку. Попытался найти какую-нибудь экзотику в отрисовке, вроде никаких мультистринг(тру) нету. Хуже того, сама переменная ТулТипа в данном случае является приватным и даже найди я нужный флаг/размер окна/етк всё равно изменить его напрямую не смог бы.
Собственно минимальный вопрос, как это сделать в этом конкретном случае?
И ещё сложный вопрос. Как сделать привязку ToolTip к любому контролу самостоятельно? То есть не пользоваться готовенькой привязкой мфц. Я подозреваю, что тултип сам должен иметь какой-то механизм ассоциации с другими контролами, тем более, что прописывать целиком маусмувы и таймеры под все случаи совсем не хочется.
Записан
Джон
просто
Администратор

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

« Ответ #1 : 25-06-2013 15:23 » 

Обычно для этого используется объект типа CToolTipCtrl. Смотри MSDN.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
luden
Участник

ru
Offline Offline

« Ответ #2 : 26-06-2013 10:42 » 

Хм, MSDN предлагает здесь следующую привязку.
BOOL AddTool(
   CWnd* pWnd,
   LPCTSTR lpszText = LPSTR_TEXTCALLBACK,
   LPCRECT lpRectTool = NULL,
   UINT_PTR nIDTool = 0
);
Где AddTool - метод CToolTipCtrl. А pWnd - объект привязки.
Я в InitDialog поступаю так
CToolTipCtrl* m_pToolTipCtrl;
m_pToolTipCtrl = new CToolTipCtrl;
int id = IDC_BUTTON1;
CWnd* Wnd = m_TToolTip.GetOwner();
m_pToolTipCtrl->AddTool(Wnd, "ToolTip", NULL, 0);
Всё выполняется до AddTool затем уходя туда и радуя меня сообщением, что заявленного окна не существует.
Записан
Джон
просто
Администратор

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

« Ответ #3 : 26-06-2013 11:10 » 

Нуу по твоему коду не видно, где ты всё это делаешь. В OnInitDialog все окна созданы ПОСЛЕ вызова виртуальной ф-ции базового класса. Эт раз.
Два. Вот это что:

CWnd* Wnd = m_TToolTip.GetOwner();

Что такое m_TToolTip? Если это кнопка, то советую тебе использовать "говорящие" имена переменных, например m_btnTToolTip. Потом, почему ты добавляешь к тултип контролу её "собственника"? Надо добавлять саму кнопку:

m_pToolTipCtrl->AddTool(&m_TToolTip, ...

Ну и если это весь код, то теорию ты, мягко говоря, ооочень бегло просмотрел. Ну, например, общая теория, в Винде, чтобы работать с окошком, достаточно лишь создать экземпляр? Или надо всё-таки ещё что-то сделать? В твоём случае это:

m_pToolTipCtrl = new CToolTipCtrl;

и всё? Или надо ещё что-то?

Так что, ещё раз подчёркиваю - исходя из приведённого кода, у тебя как минимум одно окно, которе точно не существует, как максимум их два. Ну про указатель на owner я даже не знаю.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
luden
Участник

ru
Offline Offline

« Ответ #4 : 26-06-2013 11:38 » 

Хммм, а если в порядке теста вообще вот так?
Код: (C++)
  1. void CKP_contol_finDlg::OnBnClickedButton1()
  2. {
  3.         CToolTipCtrl* m_pToolTipCtrl;
  4.         m_pToolTipCtrl = new CToolTipCtrl;
  5.         m_pToolTipCtrl->Create(this);
  6.         int id = IDC_BUTTON1;
  7.         m_pToolTipCtrl->AddTool(&m_btnToolTip, "ToolTip", NULL, 0);    
  8.         m_pToolTipCtrl->Activate(true);
  9.         m_btnToolTip.EnableToolTips();
  10. }
Запускается, но даже после нажатия не отображается, пойду посмотрю, что ещё не включил или неправильно поставил.
« Последнее редактирование: 26-06-2013 11:44 от Джон » Записан
Джон
просто
Администратор

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

« Ответ #5 : 26-06-2013 12:16 » 

Уже лучше, именно Create я и имел ввиду.

Но, тут есть один маааленький проблем... Согласно теории, этот контрол требует вызова ф-ции RelayEvent, которую надо вызывать в ф-ции диалога PreTranslateMessage. А ты определил m_pToolTipCtrl как локальную переменную в ф-ции обработки нажатия кнопки. Помимо утечки памяти, ты лишился возможности вызывать ф-ю RelayEvent. Поэтому:

1. CToolTipCtrl* m_pToolTipCtrl; переноси в класс.

2. строчки 6 и 9 тебе зачем? Выкидываем. А код переносим в OnInitDialog после вызова ф-ции базового класса:
Код: (C++)
  1. void CKP_contol_finDlg::OnInitDialog()
  2. {
  3.         CDialog::OnInitDialog();
  4.  
  5.         m_pToolTipCtrl = new CToolTipCtrl();
  6.         if(m_pToolTipCtrl->Create(this))
  7.         {
  8.                 m_pToolTipCtrl->SetMaxTipWidth(20); // подбери нужную ширину и будет тебе счастье с переносом строк ;)
  9.                 m_pToolTipCtrl->AddTool(&m_btnToolTip,_T("ToolTip \n ToolTip"));
  10.                 m_pToolTipCtrl->Activate(TRUE);
  11.         }
  12.  
  13.         return TRUE;
  14. }

Обрати внимание на вызов ф-ции SetMaxTipWidth в стр. 8 Ага

3. Добавляем "жизни" контролу:

Код: (C++)
  1. void CKP_contol_finDlg::PreTranslateMessage(MSG* pMsg)
  2. {
  3.         if (m_pToolTipCtrl)            
  4.                 m_pToolTipCtrl->RelayEvent(pMsg);
  5.  
  6.         return CDialog::PreTranslateMessage(pMsg);
  7. }

И... фсё. Ага

зы Аааа ну конечно это "фсё" только чтобы ты увидел тултип. Ещё надо освободить хэндл (теория: на один вызов Create должен быть один вызов Destroy). Ну и почистить память (теория: на один вызов new должен быть один вызов delete) Ага
Вот теперь всё.
« Последнее редактирование: 26-06-2013 12:32 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
luden
Участник

ru
Offline Offline

« Ответ #6 : 26-06-2013 12:52 » 

О, спасибо. Как раз претранслейт не переопределил. А дестрой и делет уже на закрытии окна ставить?
Записан
Джон
просто
Администратор

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

« Ответ #7 : 26-06-2013 12:58 » new

Да, Destroy в OnDestroy, а delete можно в деструкторе вызвать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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