Nie mogłem znaleźć zwięzłego fragmentu kodu, który pozwala mi dodawać/wyświetlać podpowiedzi do kontrolki CStatic (i CLed). Oczywiście standardowy kod, aby to zrobić, nie dotyczy tego rodzaju kontroli. Czy ktoś może publikować fragmenty kodu?Dodaj etykietę narzędzia do CStatic
Odpowiedz
Mam nadzieję, że ten kod rozwiąże Twój problem. Jedną z ważnych rzeczy jest właściwość NOTIFY o CStatic = TRUE.
if(!m_ToolTip.Create(this))
{
TRACE0("Unable to create the ToolTip!");
}
else
{
CWnd* pWnd = GetDlgItem(IDC_STATIC_MASTER_PWD);
m_ToolTip.AddTool(pWnd,"Ok");
m_ToolTip.Activate(TRUE);
}
Daj mi znać, jeśli jakiś problem.
Musiałem to zrobić * plus * zaimplementowałem program obsługi "PreTranslateMessage" zgodnie z opisem w [odpowiedź m_skipper] (https://stackoverflow.com/a/33772406/3549027), zanim to zadziała. Warto również zauważyć, że 'm_ToolTip' jest' CToolTipCtrl'. – dlf
miałem sukces multilinii podpowiedzi wykorzystujących tę prostą klasę:
utworzyć klasę dla podpowiedzi:
class ToolTip
{
public:
static HWND CreateToolTip(int toolID, HWND hDlg, UINT id);
};
Następnie zaimplementować funkcję tworzenia podpowiedzi:
HWND ToolTip::CreateToolTip(int toolID, HWND hDlg, UINT id)
{
if (!toolID || !hDlg || !id)
{
return FALSE;
}
CString strTTText;
strTTText.LoadString(id);
// Get the window handle of the control to attach the TT to.
HWND hwndTool = ::GetDlgItem(hDlg, toolID);
// Create the tooltip window
HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
WS_POPUP |TTS_ALWAYSTIP,// | TTS_BALLOON,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hDlg, NULL,
AfxGetInstanceHandle() , NULL);
if (!hwndTool || !hwndTip)
{
return (HWND)NULL;
}
// Associate the tooltip with the tool.
TOOLINFO toolInfo = { 0 };
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hDlg;
toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
toolInfo.uId = (UINT_PTR)hwndTool;
toolInfo.lpszText = (char*)(LPCTSTR)strTTText;
::SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
::SendMessageA(hwndTip, TTM_SETMAXTIPWIDTH, 0, 40); // force multi-line
return hwndTip;
}
połączenia to gdzieś w swoim InitDialog:
CMyDialog::InitDialog()
{
ToolTip::CreateToolTip(PickAUniqueNumber, m_hWnd, IDS_MY_RESOURCE_STRING);
}
Kiedy dodać CStatic na Dialog oparte aplikacji autocreated MFC, podpowiedzi nie wykazują aż dodam RelayEvent w pretranslate wiadomości dialogowym
BOOL CTooltipStaticDlg::PreTranslateMessage(MSG* pMsg)
{
m_ToolTip.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
Nie wiem, czy to jest nadal potrzebna, ale tutaj jest to, co kiedyś aby rozwiązać problem: po prostu dodaj SS_NOTIFY do dwStyle podczas tworzenia statycznej etykiety. (lub po prostu ustaw "Nofity" "Prawda" we właściwościach). To mi pasowało.
Posiadałem etykietę okna dialogowego z przypisanym niestandardowym ID IDC_PATH. Musiałem włączyć Informuj flagę (SS_NOTIFY) etykiety i musiałem przeciążać metody cwnd OnToolHitTest i obsługiwać testu trafień podpowiedzi tak:
INT_PTR CPath::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
INT_PTR r = CWnd::OnToolHitTest(point,pTI);
this->ClientToScreen(&point);
CRect rcLbl;
GetDlgItem(IDC_PATH)->GetWindowRect(&rcLbl);
if(rcLbl.PtInRect(point))
{
pTI->uFlags |= TTF_IDISHWND;
pTI->uFlags &= ~TTF_NOTBUTTON;
pTI->uId = (UINT_PTR)GetDlgItem(IDC_PATH)->m_hWnd;
return IDC_PATH;
}
return r;
}
Wtedy mój dialog zaczął otrzymywać powiadomienia TTN_NEEDTEXT, które obsługiwane i dynamicznie ustaw tekst dla podpowiedzi.
BOOL CPath::OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
UNREFERENCED_PARAMETER(id);
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT_PTR nID = pNMHDR->idFrom;
BOOL bRet = FALSE;
if (pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
if(nID == IDC_PATH)
{
pTTT->lpszText = (LPSTR)(LPCTSTR)m_FullDestPath;
bRet = TRUE;
}
}
*pResult = 0;
return bRet;
}
Nie wiem, dlaczego to pytanie zostało przyjęte. Operacje na etykietach w MFC nie zawsze są proste lub oczywiste, więc jest to bardzo istotne pytanie. –
@MarkRansom lekkomyślność i ignorancja jest tak smutnym aspektem ludzkiej egzystencji - to jedyne wytłumaczenie. –