我这个LoadCursor为何不听话
我用LoadCursor和SetCursor,设置在客户区矩形四个部分分为四种光标,
可是奇怪的是,它并不听话。
我是在MouseMove中调用的,根本鼠标处于不同位置点装载不同的光标形状。
左右倒是很正常,可上下光标就不听话,从上到下时光标保持不变,还是向
上的箭头,或从下到上时,保持向下的箭头。
我在判断语句里增加了一条MessageBox,来测试是否计算错误,可发现没有错误,
确实在相应的区域里执行了相应的LoadCursor语句,可就是不能正常地用LoadCursor,究竟是什么原因呢?
问题点数:40、回复次数:10Top
1 楼kaden()回复于 2002-03-13 17:21:53 得分 5
相应WM_SETCURSOR消息,在这里面设置光标.
否则请你在PreCreateWindow中修改Window的Class,将窗口的光标设为NULLTop
2 楼chen_jun_fen(穷的只能抽白粉)回复于 2002-03-13 17:44:42 得分 5
在OnSetCursor()中写上对应的代码,Top
3 楼diablon(波罗)回复于 2002-03-13 20:54:52 得分 0
是在OnSetCursor里写代码,可是那些参数是怎么设置的呢,
比如想在(200,200)至(400,400)之间采用我指定的光标,我该
怎么做呢?Top
4 楼diablon(波罗)回复于 2002-03-13 20:56:02 得分 0
是在OnSetCursor里写代码,可是那些参数是怎么设置的呢,
比如想在(200,200)至(400,400)之间采用我指定的光标,我该
怎么做呢?Top
5 楼gstan(潇逍岚风)回复于 2002-03-13 22:00:10 得分 5
老兄,LoadCursor和SetCursor确实不灵,我也曾经遇到过这样的问题.
你必须用全局函数.即 ::LoadCursor(),::SetCursor(),参数与LoadCursor和SetCursor有点区别,自己查一查msdn吧!
至于你说在不同的位置显示不同的光标,我没有做过,不过我印象中记得好象OnSetCursor好象有一个参数表示位置,但愿是这样,记不清了......
如果不是这样,你只有通过GetClientRect获得控件或者视图的大小,然后再想办法得到鼠标的位置判断......比较烦琐.
写了这么多,但愿对你有帮助.
Top
6 楼diablon(波罗)回复于 2002-03-14 10:34:52 得分 0
void CMonitorDialog::OnMouseMove(UINT nFlags, CPoint point)
{
HCURSOR newIcon;
CRect rect;
GetClientRect(&rect);
int x,y;
x=point.x;
y=point.y;
if(y<200)
{
newIcon=::LoadCursor(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDC_MOVEUP));
::SetCursor(newIcon);
}
if(y>=200)
{
newIcon=::LoadCursor(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDC_MOVEDOWN));
::SetCursor(newIcon);
}
CDialog::OnMouseMove(nFlags, point);
}
我就简化成这样做,结果也不行,经常是进去的时候全屏都是上箭头,而下
一次进去时全屏都是下箭头,真搞不懂啊
Top
7 楼diablon(波罗)回复于 2002-03-14 11:43:09 得分 0
void CMonitorDialog::OnMouseMove(UINT nFlags, CPoint point)
{
HCURSOR newIcon;
CRect rect;
GetClientRect(&rect);
int x,y;
x=point.x;
y=point.y;
if(y<200)
{
newIcon=::LoadCursor(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDC_MOVEUP));
::SetCursor(newIcon);
}
if(y>=200)
{
newIcon=::LoadCursor(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDC_MOVEDOWN));
::SetCursor(newIcon);
}
CDialog::OnMouseMove(nFlags, point);
}
我就简化成这样做,结果也不行,经常是进去的时候全屏都是上箭头,而下
一次进去时全屏都是下箭头,真搞不懂啊
Top
8 楼kaden()回复于 2002-03-14 12:51:38 得分 5
当然会出现这种情况,
应为MouseMove消息也是断断续续发出的,
很有可能由于你鼠标移动的快,让你>200的条件形同虚设,根本进不来,
最好是在OnSetCursor中动态判断鼠标位置Top
9 楼diablon(波罗)回复于 2002-03-15 17:15:23 得分 0
原来如此,你说的有道理,那请问OnSetCursor的几个参数是怎么设置的呢?
我看过但没懂Top
10 楼dongang(donggang)回复于 2002-03-15 17:47:06 得分 20
BOOL CCursorTestView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
POINT point;
GetCursorPos(&point);
CRect rect;
GetClientRect(rect);
ScreenToClient(&point);
if (point.y < rect.Height()/2)
{
if (point.x < rect.Width()/2)
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_UPLEFT));
}
else
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_UPRIGHT));
}
}
else
{
if (point.x < rect.Width()/2)
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_DOWNLEFT));
}
else
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_DOWNRIGHT));
}
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
void CCursorTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
this->OnSetCursor(this, HTCLIENT, WM_SETCURSOR);
CView::OnMouseMove(nFlags, point);
}
Top




