Возможны ли многострочные всплывающие подсказки с помощью CWnd :: EnableTooltips ()? - PullRequest
2 голосов
/ 25 января 2010

Я пытаюсь сделать мои всплывающие подсказки многострочными, но мне не очень везет с этим. Я вызываю CWnd :: EnableTooltips () сразу после создания (в данном случае это поле редактирования) и обрабатываю сообщение TTN_NEEDTEXT. Мои всплывающие подсказки отображаются правильно, но отображаются только одной строкой.

Я попытался добавить '\ n' к строке, которую я передаю при обработке TTN_NEEDTEXT, а также попытался '\ r \ n'. Неудачно. Он просто отображает их как обычный текст в строке всплывающей подсказки.

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

Я немного покопался и обнаружил в Интернете несколько нецензурных ссылок, говорящих о том, что многострочное поведение может не работать при использовании всплывающих подсказок через функции CWnd. Я бы предпочел не заменять CToolTipCtrl (так как это довольно большой проект). Кто-нибудь сталкивался с этим раньше? Если так, есть ли способ обойти это?

Ответы [ 3 ]

6 голосов
/ 26 января 2010

Мне удалось превратить \ n разделенную подсказку в многострочную подсказку, используя следующий код в обработчике TTN_NEEDTEXT

Для DevStudio 6

CToolTipCtrl* pToolTip = AfxGetThreadState()->m_pToolTip;
pToolTip->SetMaxTipWidth(SHRT_MAX);

Вы должны звонить снова каждый раз, когда вызывается TTN_NEEDTEXT, или он не будет зависать.

Я нашел этот трюк, читая код из http://www.codeproject.com/KB/list/CListCtrl_ToolTip.aspx

ПРИМЕЧАНИЕ: код на самом деле выполняет следующее, но он не скомпилируется в VS6, так как ModuleThreadState не имеет члена m_pToolTip в VS6 (я не пробовал следующее в VS2005 +, но я предполагаю, что он будет работать там)

BOOL CListCtrl_EnableToolTip::OnToolNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
...
   // Break tooltip into multiple lines if it contains newlines (/n/r)
   CToolTipCtrl* pToolTip = AfxGetModuleThreadState()->m_pToolTip;
   if (pToolTip)
      pToolTip->SetMaxTipWidth(SHRT_MAX);
...
}
0 голосов
/ 17 марта 2010

Это то, с чем я боролся в своем приложении MFC. У меня есть подклассы всех общих классов представления / диалога, которые имеют дело с моими подсказками для меня. Я обнаружил, что в некоторых (таких как заголовки в CListCtrls или CPropertySheets) не требуется, чтобы вы каждый раз вызывали SetMaxTipWidth (как упоминалось выше), но другие (CView, CDialog, CPropertyPage, CListCtrl, CTreeCtrl) требуют, чтобы вы вызывали его каждый раз время всплывающая подсказка. Это немного глупо, но, похоже, работает.

0 голосов
/ 25 января 2010

Я смутно припоминаю, что заставил это работать. Я немного погуглил, думаю, что я установил SetMaxTipWidth (), чтобы «заставить» всплывающую подсказку быть более узкой, чем текст, который я вводил. Позже я переключился на свой собственный элемент управления всплывающей подсказкой по другим причинам, но я использую тот же «дизайн», вполне вероятно, что я скопировал это поведение из моего старого кода. Я бы сказал, если у вас уже есть CToolTipCtrl:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...