原文请看《键盘方向键控制鼠标光标移动,并智能调节速度和绘制速度曲线》,解释的很详细。我在这里就不解释了,不过在写代码的时候遇到了一个问题,就是按键消息不响应,后来解决了,请看《MFC中响应按键消息WM_KEYDOWN不响应的原因》。下面给上代码:
void C速度曲线Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
PAINTSTRUCT ps;
CDC *pDC=BeginPaint(&ps);
GetClientRect(&rect);
for(int i=0; i<speedlist.size();i++)
{
//pDC->MoveTo(i*2,0);
pDC->LineTo(i*2,speedlist[i]*5);
}
EndPaint(&ps);
CDialogEx::OnPaint();
}
}
BOOL C速度曲线Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message==WM_KEYDOWN)
{
GetCursorPos(&pt);
//移动速度自动调节
iAcc2++;//累计iAcc2
step=iAcc*rand()%3+iAcc2+rand()%10;//移动的幅度计算
if(iAcc2>20)
{
//Acc2累计到20,则加速一级
iAcc++;//线性加速一级
iAcc2=0;//重新计数
}
if (iAcc>5)
{
//如果速度太快,控制速度,回归速度
iAcc--;//线性递减
}
speedlist.push_back(step);
if(pMsg->wParam==VK_UP)
{
pt.y+=-step;
}
if(pMsg->wParam==VK_DOWN)
{
pt.y+=step;
}
if(pMsg->wParam==VK_LEFT)
{
pt.x+=-step;
}
if(pMsg->wParam==VK_RIGHT)
{
pt.x+=step;
}
SetCursorPos(pt.x,pt.y);
Invalidate();
}
return CDialogEx::PreTranslateMessage(pMsg);
}
代码实现是一样的,我就不发图了。