三四天的问题,今天我能得到满意的答案么

keansun 2003-09-29 01:41:15
在同一窗体中,绘制两个矩形,如何使鼠标移动到各自矩形上时显示不同的Tip。
1。注意,这两个矩形不存在ID资源号。
2。请不要告诉我在WM_MOUSEMOVE中处理即可,如果你实验了,你会发现,从一个矩形上移动到另一个时,Tip不会及时更改;
3。也不要简单告诉我更改DelayTime就行了,因为改短了会使Tip频繁闪动。
4。而且这个Tip也不会像工具栏上的一样,显示一会就消失,那么Destroy它么,你试过这样做么?
感谢你看这张帖子,我经常会积极回答其它人的问题,虽然我只是菜鸟一只,我也希望能从你那里得到解决的方案。
虽然我像多给点分,但是我做的虽然不少,得到的却不多,所以穷,但是我不会使热心的人像我一样失望的。
...全文
69 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
keansun 2003-09-29
  • 打赏
  • 举报
回复
我试试看
wuxfBrave 2003-09-29
  • 打赏
  • 举报
回复
/////////////////////////////////////////////////////////////////////////////
// CMy22View message handlers
BOOL CMy22View::OnToolTipText(UINT id, NMHDR * pNMHDR, LRESULT * pResult)
{
CPoint ptCursorPos;
VERIFY(::GetCursorPos(&ptCursorPos));
ScreenToClient(&ptCursorPos);

CRect rcClient;
GetClientRect(&rcClient);

TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;
pTTT->szText[0] = '\0';

if (!rcClient.PtInRect(ptCursorPos))
return FALSE;

TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

// m_strInfoText.Empty();
// m_pLastHitItem->GetInfoText(m_strInfoText);
//
if (m_nLastHit == 0)
m_strInfoText = "rect 1";
else if (m_nLastHit == 1)
m_strInfoText = "rect 2";

if (m_strInfoText.IsEmpty())
return FALSE;

int nStrLen = 80;
LPCTSTR lpszInfoText = m_strInfoText.GetBuffer(nStrLen);

#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, lpszInfoText, nStrLen);
else
_mbstowcsz(pTTTW->szText, lpszInfoText, nStrLen);
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, lpszInfoText, nStrLen);
else
lstrcpyn(pTTTW->szText, lpszInfoText, nStrLen);
#endif
*pResult = 0;

m_strInfoText.ReleaseBuffer();

return TRUE;
}

BOOL CMy22View::PreTranslateMessage(MSG* pMsg)
{
if (::IsWindow(m_toolTip.m_hWnd) && pMsg->hwnd == m_hWnd)
{
switch(pMsg->message)
{
case WM_LBUTTONDOWN:
case WM_MOUSEMOVE:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
m_toolTip.RelayEvent(pMsg);
break;
}
}

return CView::PreTranslateMessage(pMsg);
}

int CMy22View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

EnableToolTips(TRUE);

CRect rcTool(0, 0, 1000, 1000);

if (m_toolTip.Create(this, TTS_ALWAYSTIP)
&& m_toolTip.AddTool(this, LPSTR_TEXTCALLBACK, &rcTool, TOOLTIP_ID) )
{
m_toolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);
m_toolTip.SendMessage(TTM_SETDELAYTIME, TTDT_AUTOPOP, SHRT_MAX);
m_toolTip.SendMessage(TTM_SETDELAYTIME, TTDT_INITIAL, 200);
m_toolTip.SendMessage(TTM_SETDELAYTIME, TTDT_RESHOW, 200);
}

return 0;
}

void CMy22View::OnMouseMove(UINT nFlags, CPoint point)
{
static CRect rc(1, 1, 20, 20), rc2(50, 50, 70, 70);

int nHit = -1;
if (rc.PtInRect(point))
nHit = 0;
if (rc2.PtInRect(point))
nHit = 1;

if (nHit == -1 || m_nLastHit != nHit)
m_toolTip.Activate(FALSE);
else
{
CRect rcTool(-10, -10, 10, 10);
rcTool.OffsetRect(point);

m_toolTip.SetToolRect(this, TOOLTIP_ID, &rcTool);
m_toolTip.Activate(TRUE);
}

m_nLastHit = nHit;

CView::OnMouseMove(nFlags, point);
}
wuxfBrave 2003-09-29
  • 打赏
  • 举报
回复
void CMy22View::OnDraw(CDC* pDC)
{
CMy22Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

pDC->Rectangle(1, 1, 20, 20);

pDC->Rectangle(50, 50, 70, 70);

// TODO: add draw code for native data here
}
wuxfBrave 2003-09-29
  • 打赏
  • 举报
回复
添加消息映射
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
ON_NOTIFY_EX(TTN_NEEDTEXTW, 0, OnToolTipText)
ON_NOTIFY_EX(TTN_NEEDTEXTA, 0, OnToolTipText)
添加成员变量
CString m_strInfoText;
CToolTipCtrl m_toolTip;
int m_nLastHit;
重写 BOOL PreTranslateMessage(MSG* pMsg);
qwedcxza 2003-09-29
  • 打赏
  • 举报
回复
另外我想告诉你的是,像这样属于软件设计思路而非具体方法的问题,很少有人会去试,你必须根据这些参考,修改出你自己的方法
qwedcxza 2003-09-29
  • 打赏
  • 举报
回复
设置一个时间相应函数
OnTimer1 ,在这个函数里,判断光标位置,显示相应的 tip

在 OnMouseMove 里:
判断当前的 tip, 隐藏它
开启 OnTimer1, 用你希望延迟显示 tip 的时间

没有试过,但维护一个 tip 显示不需要太多的工作
afantict 2003-09-29
  • 打赏
  • 举报
回复
我做的虽然不少,得到的却不多,所以穷,但是我不会使热心的人像我一样失望的。



very good
帮你up
Paris_Luo 2003-09-29
  • 打赏
  • 举报
回复
gz

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧