为什么改变光标形状的代码在PreTranslateMessage可以,在OnMouseMove中不行?当按下鼠标左键并移动到不同按钮上时,应显示不同光标形状。代码如下:BOOL CCursorDlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
if((pMsg->message ==WM_MOUSEMOVE)&&(pMsg->wParam==MK_LBUTTON))
{
HCURSOR hcur;
POINT pt=pMsg->pt;
ScreenToClient(&pt); CWnd *pwnd=ChildWindowFromPoint(pt);
int nid=pwnd->GetDlgCtrlID();
switch(nid)
{
case IDC_BTNWAIT:
hcur=AfxGetApp()->LoadStandardCursor(IDC_WAIT);
::SetCursor(hcur);
break;
case IDC_BTNCROSS:
hcur=AfxGetApp()->LoadStandardCursor(IDC_CROSS   );
::SetCursor(hcur);
break;
default:
break;

} }
return CDialog::PreTranslateMessage(pMsg);
}
void CCursorDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if(nFlags==MK_LBUTTON)
{
HCURSOR hcur;
CPoint pt=point;
ScreenToClient(&pt); CWnd *pwnd=ChildWindowFromPoint(pt);
ASSERT(pwnd);
if(pwnd!=(CWnd*)this)
{
int nid=pwnd->GetDlgCtrlID();
switch(nid)
{
case IDC_BTNWAIT:
hcur=AfxGetApp()->LoadStandardCursor(IDC_WAIT);
::SetCursor(hcur);
break;
case IDC_BTNCROSS:
hcur=AfxGetApp()->LoadStandardCursor(IDC_CROSS   );
::SetCursor(hcur);
break;
default:
break;

}
}
}
CDialog::OnMouseMove(nFlags, point);
}

解决方案 »

  1.   

    你应该响应 WM_SETCURSOR 消息,然后得到光标位置,设定响应的光标
      

  2.   

    你程序是在点击了你的那些按钮时改变光标的吧!否则是不会改变的。
    直接用SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEWE));就行了。呵呵
    如果有问题因改是你的switch语句有问题。
      

  3.   

    我的问题已经说得很清楚了,拜托仔细看一下,最好试一下代码再发表意见,就是一个对话框,包含两个按钮IDC_BTNWAIT、IDC_BTNCROSS
      

  4.   

    你可以申请HCURSOR为全局
    HCURSOR hCursor = ::AfxGetApp()->LoadCursor(IDC_WAIT);
    m_hOldCursor = ::SetCursor(hCursor);
    另外请不要那么激动,大家都是互相帮忙的。你认为自己写的很清楚但别人就不一定这么认为了。
      

  5.   

    直接写在wm_mousemove会闪烁吧,会调用系统与定义的光标
      

  6.   

    你在OnMouseMove中捕获响应MK_LBUTTON消息?这样行吗?
    如果你是为了在左键点击时响应操作的话,不妨放在响应MK_LBUTTON消息的函数OnLButtonDown(UINT nFlags, CPoint point) 里试试,no problem~~~
      

  7.   

    to snowflyman(一个烧饼2毛5) :
    if(nFlags==MK_LBUTTON)是判断在移动鼠标时左键是否按下
      

  8.   

    那为什么不这样实现呢,在OnLButtonDown(UINT nFlags, CPoint point)中设置光标,然后在OnLButtonUp(UINT nFlags, CPoint point)中销毁光标,不就行了
      

  9.   

    哎2天过后依然没有有价值的回答
    to 各位大虾:
    谢谢各位的建议,我并不是没有实现这个功能,只是想问问在OnMouseMove中为何不灵?还请大家再看一下题
      

  10.   

    你的程序有问题,如果在按钮之外按下鼠标再移动的话,肯定产生断言,因为对话框不是一个子窗口。
    再则,鼠标移到按钮上时,获得OnMouseMove消息的将是按钮控件而不是对话框。
      

  11.   

    if((pMsg->message ==WM_MOUSEMOVE)&&(pMsg->wParam==MK_LBUTTON))
    --------------------------------->
    if((pMsg->message ==WM_MOUSEMOVE)||(pMsg->wParam==MK_LBUTTON))
      

  12.   

    gww918(gww888)说的对,鼠标移到按钮上时,获得OnMouseMove消息的将是按钮控件而不是对话框
      

  13.   

    我在View类你像你一模一样的做过,没有问题,所以肯定不是“OnMouseMove()不灵”的问题对话框中有很多控件,每一个控件都有自己的消息机制,如果你是在控件上移动或者单击的鼠标的话,对话框中的消息是不会触发的,触发的是各控件自己的消息——这一点前面有人说清楚了。所以我估计,如果你是直接在对话框的空白部分进行左键按下移动鼠标的操作的话,应该没有问题,我做过。楼主,如果你认为别人都是冲你的“分”来的,你就错了,这点分全部给一个人都嫌少,更何况现在有那么多人来了,和 yushulei(郁闷中……) 一样,还是提醒你说话注意些,不要把别人都看得那么贱,为了这点分就来帮你