문제

나는 파생 된 수업이 있습니다 CTreeCtrl. ~ 안에 OnCreate() 기본값을 교체합니다 CToolTipCtrl 사용자 정의와 객체 :

int CMyTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
        return -1;

    // Replace tool tip with our own which will
    // ask us for the text to display with a TTN_NEEDTEXT message
    CTooltipManager::CreateToolTip(m_pToolTip, this, AFX_TOOLTIP_TYPE_DEFAULT);
    m_pToolTip->AddTool(this, LPSTR_TEXTCALLBACK);
    SetToolTips(m_pToolTip);

    // Update: Added these two lines, which don't help either
    m_pToolTip->Activate(TRUE);
    EnableToolTips(TRUE);

    return 0;
}

내 메시지 핸들러는 다음과 같습니다.

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMyTreeCtrl::OnTtnNeedText)

그러나 나는 결코받지 못한다 TTN_NEEDTEXT 메시지. 나는 Spy ++로 보았고이 메시지가 전송되지 않는 것처럼 보입니다.

여기서 문제는 무엇입니까?

업데이트

이것이 관련이 있는지 확실하지 않습니다 CTreeCtrl의 부모 창은 유형입니다 CDockablePane. 이것이 작동하는 데 필요한 추가 작업이있을 수 있습니까?

도움이 되었습니까?

해결책

드디어! 나는 (부분적으로) 해결했다 :

CdockablePane의 부모 창이 실제로이 문제를 일으킨 것처럼 보입니다 ...

먼저 Ctreectrl 유래 클래스에서 모든 툴팁 별 코드를 제거했습니다. 모든 것이 부모 창 창에서 이루어집니다.

그런 다음 부모 창을 편집했습니다 OnCreate() 방법:

int CMyPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
        return -1;

const DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
    TVS_CHECKBOXES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
    TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS;

// TREECTRL_ID is a custom member constant, set to 1
if(!m_tree.Create(dwStyle, m_treeRect, this, TREECTRL_ID ) )
{
    TRACE0("Failed to create trace tree list control.\n");
    return -1;
}

// m_pToolTip is a protected member of CDockablePane
m_pToolTip->AddTool(&m_tree, LPSTR_TEXTCALLBACK, &m_treeRect, TREECTRL_ID);
m_tree.SetToolTips(m_pToolTip);


return 0;

}

불행하게도 우리는 단순히 전화 할 수 없습니다 AddTool() 기본 클래스가 ASSERT ~에 관하여 uFlag 도구 ID 세트가없는 경우 멤버. 또한 ID를 설정해야하므로 사각형도 설정해야합니다. 나는 a CRect 회원으로 설정하십시오 (0, 0, 10000, 10000) CTOR에서. 나는 아직 도구의 직장 크기를 변경하는 작업 방법을 찾지 못했기 때문에 이것은 매우 추악한 해결 방법입니다. 이것이 제가이 솔루션을 부분적으로 부르는 이유이기도합니다. 업데이트: 나는 이것에 관한 질문을했다.

마지막으로 툴팁 정보를 얻을 수있는 핸들러가 있습니다.

// Message map entry
ON_NOTIFY(TVN_GETINFOTIP, TREECTRL_ID, &CMobileCatalogPane::OnTvnGetInfoTip)


// Handler
void CMyPane::OnTvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);

    // This is a CString member
    m_toolTipText.ReleaseBuffer();
    m_toolTipText.Empty();

    // Set your text here...

    pGetInfoTip->pszText = m_toolTipText.GetBuffer();

    *pResult = 0;
}

다른 팁

내장을 교체하고 있지만 여전히 툴팁을 활성화해야한다고 생각합니다.

EnableToolTips(TRUE);

글쎄, 그것은 당신을 위해 일하지 않았고 아무도 아무도 도움을주지 않았기 때문에 여기에 몇 가지 더 많은 제안이 있습니다. 그들은 절름발이이지만 다시 움직일 수 있습니다.

  • OnCreate () Rotine이 실제로 실행되고 있는지 확인하십시오.
  • 도구 팁을 교체하기 전에 툴 팁을 활성화하십시오.
  • 내가 이것을하는 데 사용하는 코드는 다음과 같습니다. (나는 모든 세부 사항을 이해하지 못한다고 고백하고, 샘플 코드에서 그것을 복사했고, 효과가 있었고, 더 이상 그것을 보지 못했습니다.)

    // 표준 툴팁을 활성화합니다

    enabletooltips (true);

    // 내장 툴팁을 비활성화합니다

    ctooltipctrl* ptooltipctrl = (ctooltipctrl*) cwnd :: fromHandle ((hwnd) :: sendMessage (m_hwnd, lvm_getTooltips, 0, 0l));

Ctreectrl에서 시도하지는 않았지만 툴팁 CTRL이 툴팁을 표시 해야하는시기를 알기 위해 Relayevent를 호출해야한다고 생각합니다. 이 시도:

mytreectrl.h :

virtual BOOL PreTranslateMessage(MSG* pMsg);

mytreectrl.cpp :

BOOL CMyTreeCtrl::PreTranslateMessage(MSG* pMsg) 
{
    m_pToolTip.Activate(TRUE);
    m_pToolTip.RelayEvent(pMsg);

    return CTreeCtrl::PreTranslateMessage(pMsg);
}

이 도움이되기를 바랍니다.

ontoolhittest ()를 무시할 필요가 없습니까?

(구) 자원 1

(구) 자원 2 :

HIT (Hit Code)를 반환하는 것 외에도 ToolInfo Struct를 작성해야합니다. Virgil이 cmainframe :: ontoolhittest에서 수행하는 방법은 다음과 같습니다.

 int nHit = MAKELONG(pt.x, pt.y);
 pTI->hwnd = m _ hWnd;
 pTI->uId  = nHit;
 pTI->rect = CRect(CPoint(pt.x-1,pt.y-1),CSize(2,2));
 pTI->uFlags |= TTF _ NOTBUTTON;
 pTI->lpszText = LPSTR _ TEXTCALLBACK;

이 중 대부분은 HWND 및 UID를 설정하는 것과 같이 분명하지만 일부는 적습니다. 마우스 위치를 중심으로 한 2 픽셀, 2 픽셀 높이 사각형으로 직장 멤버를 설정했습니다. 툴팁 컨트롤은이 사각형을 "도구"의 경계 사각형으로 사용합니다. 툴팁이 버튼과 관련이 없기 때문에 uflags에서 ttf _ notbutton을 설정했습니다. 이것은 AFXWIN.H에 정의 된 특수 MFC 플래그입니다. MFC는이를 사용하여 툴팁에 도움이됩니다. 툴팁을위한 또 다른 MFC 확장 플래그 인 TTF _ AlwayStip이 있습니다. 창이 활성화되지 않은 경우에도 MFC가 팁을 표시하려면 사용할 수 있습니다. 지금까지 나는 MFC 나 툴팁 또는 툴 린포에 팁의 실제 텍스트가 무엇인지 말하지 않았다는 것을 알았을 것입니다. 그것이 LPSTR _ TextCallback의 것입니다. 이 특수 값은 텍스트를 얻기 위해 내 창을 다시 호출하도록 툴팁 컨트롤 (MFC가 사용하는 내부 스레드 글로벌)을 알려줍니다. 알림 코드 TTN _ NeedText와 함께 WM _ 알림 메시지를 내 창을 보내면이 작업을 수행합니다.

모든 툴팁 ID를 구체적으로 처리하십시오.

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &CMyTreeCtrl::OnNeedTipText)

그렇지 않은 경우, Pretranslatemessage ()에서 수동으로 Relayevent ()를 호출해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top