高分求高手回答VC基本问题
问题一,在进行键盘消息处理的时候,比如按下‘Z’键,响应WM_KEYDOWN消息的时候nChar值为VK_Z,响应WM_CHAR消息的时候nChar值为Z的ASCII码,...
问题一,在进行键盘消息处理的时候,比如按下‘Z’键,响应WM_KEYDOWN 消息的时候nChar值为VK_Z,响应WM_CHAR 消息的时候nChar值为Z
的ASCII码,而我查了一下VK_Z与Z的ASCII是相同的,请问他们有什么区别,为什么不统一。
问题二,我想按下ESCAPE键让程序退出,我响应了WM_KEYDOWN 消息,然后消息响应函数我写道:
if(nChar==VK_ESCAPE)
SendMessage(WM_DESTROY);
发现程序没有正常退出,我把WM_DESTROY换成WM_QUIT,也没有正常退出,我换成WM_CLOSE也没有正常退出,而是弹出一个对话,通知程序将
异常关闭。我想要的效果是点击最大最小化按钮旁边的关闭按钮时的那种关系效果,请问该发送什么消息呢。
问题三,我想响应一个鼠标移动消息WM_MOUSEMOVE让鼠标不停在客户区移动,然后再鼠标的旁边显示鼠标的坐标,实现代码如下:
void CMouseTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
TCHAR SzPoint[20];
_stprintf(SzPoint,"x=%d,y=%d",point.x,point.y);
CClientDC dc(this);
dc.TextOut(point.x+10,point.y+10,SzPoint);
CView::OnMouseMove(nFlags, point);
}
但是效果非常不好,输出字符曾走过的地方,留下了原来的字体,也就是每次重新显示的时候,屏幕没有刷新,把原来字迹留下了,我在
dc.TextOut(point.x+10,point.y+10,SzPoint);语句后面加了一句Invalidate(FALSE);,结果变成了,字迹一闪马上就没有了,我们根本就
来不及看清楚,请问大家该如何解决这个问题。 展开
的ASCII码,而我查了一下VK_Z与Z的ASCII是相同的,请问他们有什么区别,为什么不统一。
问题二,我想按下ESCAPE键让程序退出,我响应了WM_KEYDOWN 消息,然后消息响应函数我写道:
if(nChar==VK_ESCAPE)
SendMessage(WM_DESTROY);
发现程序没有正常退出,我把WM_DESTROY换成WM_QUIT,也没有正常退出,我换成WM_CLOSE也没有正常退出,而是弹出一个对话,通知程序将
异常关闭。我想要的效果是点击最大最小化按钮旁边的关闭按钮时的那种关系效果,请问该发送什么消息呢。
问题三,我想响应一个鼠标移动消息WM_MOUSEMOVE让鼠标不停在客户区移动,然后再鼠标的旁边显示鼠标的坐标,实现代码如下:
void CMouseTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
TCHAR SzPoint[20];
_stprintf(SzPoint,"x=%d,y=%d",point.x,point.y);
CClientDC dc(this);
dc.TextOut(point.x+10,point.y+10,SzPoint);
CView::OnMouseMove(nFlags, point);
}
但是效果非常不好,输出字符曾走过的地方,留下了原来的字体,也就是每次重新显示的时候,屏幕没有刷新,把原来字迹留下了,我在
dc.TextOut(point.x+10,point.y+10,SzPoint);语句后面加了一句Invalidate(FALSE);,结果变成了,字迹一闪马上就没有了,我们根本就
来不及看清楚,请问大家该如何解决这个问题。 展开
3个回答
展开全部
问题一:WM_KEYDOWN 返回的VK是虚拟键盘键值,WM_CHAR 该键盘对应的键符号.他们不一样,每一个键都键值,键值是由系统获得的键盘扫描码翻译了的.一个键值却不一定有键符,或者一个键值对应多个键符,比如大写的Z键,和小写的z键他们的键符就不一样,但键值却一样.再比如某些品牌的键盘他们某些功能键就没有键符.其标准键盘的某些功能键也没有键符
第二个:要理解消息,程序间消息是通信方法,而不是操作方法,你收到关闭消息,你应该做的是关闭窗体的操作,而不是再告诉自己关闭窗口.你发的操作消息本是系统要告诉你的,WM_CLOSE消息是系统通知即将强制关闭.如果你的程序没反应系统认为你程序故障了,就要要强制关闭.结束程序直接exit就行了.
第三个:你可以把dc当作张画布,Invalidate() 执行了擦净画布的作用.你的操作过程应该是先Invalidate后dc.TextOut
第二个:要理解消息,程序间消息是通信方法,而不是操作方法,你收到关闭消息,你应该做的是关闭窗体的操作,而不是再告诉自己关闭窗口.你发的操作消息本是系统要告诉你的,WM_CLOSE消息是系统通知即将强制关闭.如果你的程序没反应系统认为你程序故障了,就要要强制关闭.结束程序直接exit就行了.
第三个:你可以把dc当作张画布,Invalidate() 执行了擦净画布的作用.你的操作过程应该是先Invalidate后dc.TextOut
展开全部
第一个问题:没区别,这样很好,不必统一,统一后反而不伦不类的(个人看法)
第二个:用PostMessage(WM_CLOSE),自己百度一下这个跟SendMessage的区别就知道了
第三个:没做过,不过如果把Invalidate(FALSE);放到dc.TextOut(point.x+10,point.y+10,SzPoint);语句前面可能更好一些
第二个:用PostMessage(WM_CLOSE),自己百度一下这个跟SendMessage的区别就知道了
第三个:没做过,不过如果把Invalidate(FALSE);放到dc.TextOut(point.x+10,point.y+10,SzPoint);语句前面可能更好一些
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
绘制代码一定要写在OnDraw或OnPaint中
你可以这样写
1在类中定义变量
CPoint m_pt;
CString m_szText;
2鼠标移动消息WM_MOUSEMOVE中这样写
OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString szPoint;
szPoint.Format("x=%d,y=%d",point.x,point.y);
this->m_szText=szPoint;
this->m_pt=CPoint(point.x+10,point.y+10);
Invalidate();
CDialog::OnMouseMove(nFlags, point);
}
另外:最好在上面的代码中加入鼠标移动达到一定的量才调用Invalidate这个保证少刷新窗口的次数
3\OnDraw或OnPaint中
这样写
dc.TextOut(m_pt.x,m_pt.y,m_szText);
你可以这样写
1在类中定义变量
CPoint m_pt;
CString m_szText;
2鼠标移动消息WM_MOUSEMOVE中这样写
OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString szPoint;
szPoint.Format("x=%d,y=%d",point.x,point.y);
this->m_szText=szPoint;
this->m_pt=CPoint(point.x+10,point.y+10);
Invalidate();
CDialog::OnMouseMove(nFlags, point);
}
另外:最好在上面的代码中加入鼠标移动达到一定的量才调用Invalidate这个保证少刷新窗口的次数
3\OnDraw或OnPaint中
这样写
dc.TextOut(m_pt.x,m_pt.y,m_szText);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询