最近在用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);
}
主体框架就是在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);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货