(MFC)动态创建的工具栏,当鼠标移动上去时,如何改变光标类型?

时间:2021-10-11 22:55:50
我在VS2010中建立了一个基于对话框的MFC工程,然后我在对话框上动态创建了个工具栏,当鼠标移动到工具栏上默认是箭头型光标,那么如何改为手型呢?
我试过WM_CURSOR,代码如下:
if(pWnd==GetDlgItem(ID_BTN_EDIT))//ID_BTN_EDIT是我工具栏上一个按钮的图标
{
::SetCursor(LoadCursor(NULL,ID_HAND));
return TRUE;
}
调试发现当移动到该工具栏按钮上时无法进入这个判断。
而如果我将ID_BTN_EDIT改成IDOK(系统默认生成的一个按钮,对话框上的),确实可以实现该功能。
请问我该如何实现工具栏按钮图标改变?

1 个解决方案

#1


本帖最后由 CometNet 于 2015-09-11 12:31:15 编辑
GetDlgItem是针对子控件(按钮、编辑框、整个工具条等)
而你要的是针对工具条里的某个按钮,这个按钮没有单独的窗口句柄,不应该用GetDlgItem
你可以用TB_GETRECT(CToolBarCtrl::GetItemRect)来获取某个按钮的矩形区域,再对比鼠标坐标。

未尝试,给你提供点思路吧:
在工具条的鼠标移动事件(WM_MOUSEMOVE)里,用TB_GETRECT遍历所有按钮的区域,对比鼠标坐标,然后SetCursor

int m_nCurIndex=-1;
void CToolBarCtrl::OnMouseMove(POINT pt)
{
    int nIndex=-1;
    int nCount=GetButtonCount();
    for(int i=0;i<nCount;i++)
    {
        //获取按钮的矩形区域
        RECT rc;
        GetItemRect(i,&rc);
        //判断鼠标是否在矩形里面
        if(PtInRect(&rc,&pt))
        {
            nIndex=i;
        }
    }
    if(m_nCurIndex!=nIndex)
    {
        m_nCurIndex=nIndex;
        SetCursor(xxxx);//设置鼠标指针
    }
}

#1


本帖最后由 CometNet 于 2015-09-11 12:31:15 编辑
GetDlgItem是针对子控件(按钮、编辑框、整个工具条等)
而你要的是针对工具条里的某个按钮,这个按钮没有单独的窗口句柄,不应该用GetDlgItem
你可以用TB_GETRECT(CToolBarCtrl::GetItemRect)来获取某个按钮的矩形区域,再对比鼠标坐标。

未尝试,给你提供点思路吧:
在工具条的鼠标移动事件(WM_MOUSEMOVE)里,用TB_GETRECT遍历所有按钮的区域,对比鼠标坐标,然后SetCursor

int m_nCurIndex=-1;
void CToolBarCtrl::OnMouseMove(POINT pt)
{
    int nIndex=-1;
    int nCount=GetButtonCount();
    for(int i=0;i<nCount;i++)
    {
        //获取按钮的矩形区域
        RECT rc;
        GetItemRect(i,&rc);
        //判断鼠标是否在矩形里面
        if(PtInRect(&rc,&pt))
        {
            nIndex=i;
        }
    }
    if(m_nCurIndex!=nIndex)
    {
        m_nCurIndex=nIndex;
        SetCursor(xxxx);//设置鼠标指针
    }
}