最近在用MFC做一个游戏,其中每个物品都有相应的Bitmap图片资源,显示在Dialog上。现在我想通过鼠标点击拿起物品,并移动物品位置,但是不知道怎么样把光标设置成相应的图片。
主体框架就是在Dialog里定义一个
HCURSOR m_hCursor;
成员,在OnLButtonDown里把它设置成相应的光标句柄,最后在OnSetCursor函数里设置光标。
现在关键就是OnLButtonDown里设置m_hCursor的代码不成功。
我试过LoadCursor,发现如果资源本身是cursor类型的,可以成功;而我的资源都是bmp,它的返回值就是0了(没有hot spot?)。
用CreateCursor创建的似乎是黑白光标,看msdn也没看懂怎么把指定的bmp创建成光标。
msdn在SetCursor文档里还提到用LoadImage,可是我试了几次,不知是传的参数不对还是怎么的,也是不能成功。现在我也想不到什么别的办法了,暂时用BitBlt把图片画出来,跟着鼠标走,并且在OnMouseMove里不停的
Invalidate();
效果自然是很差了。
望了解MFC的人指点一二,谢谢!:)void CDlgCharItems::OnPaint()
{
    CPaintDC dc(this);
    DrawItemCursor(&dc,m_pMouse);    //画拿起的物品,暂时用BitBlt实现的
}
void CDlgCharItems::OnMouseMove(UINT nFlags, CPoint point)
{
    if(m_pPickedItem){        //鼠标有拿起物品
        Invalidate();    //更新物品图片的位置
    }else{
        //画系统光标
    }
}
void CDlgCharItems::OnLButtonDown(UINT nFlags, CPoint point)
{
    if(HitTestOnItem()){    //点击在物品上
        m_hCursor = AfxGetApp()->LoadCursor(BMP_RES_INDEX);
        //m_hCursor还是为0
    }
}
BOOL CDlgCharItems::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
    if(nHitTest == HTCLIENT){
        ::SetCursor(m_hCursor);
        return TRUE;
    }
    return CPropertyDialog::OnSetCursor(pWnd, nHitTest, message);
}