当前位置:C++技术网 > 资讯 > 键盘方向键控制鼠标光标移动,并智能调节速度和绘制速度曲线MFC实现

键盘方向键控制鼠标光标移动,并智能调节速度和绘制速度曲线MFC实现

更新时间:2016-01-17 23:03:19浏览次数:1+次

原文请看《键盘方向键控制鼠标光标移动,并智能调节速度和绘制速度曲线》,解释的很详细。我在这里就不解释了,不过在写代码的时候遇到了一个问题,就是按键消息不响应,后来解决了,请看《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);
}


代码实现是一样的,我就不发图了。