MFC键盘按键响应

一、消息响应函数WM_KEYDOWN

OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):

当某个键盘按键被按下时所触发的事件,如果一直按着不放则会一直触发onkeydown事件。有三个变量,nChar是虚拟键代码

二、虚拟键代码

VK_LWIN 5B Left Windows 键 (Microsoft自然键盘)
VK_RWIN 5C Right Windows 键 (Microsoft自然键盘)
VK_APPS 5D Applications 键 (Microsoft自然键盘)
VK_NUMPAD0 60 数字小键盘上的 0 键
VK_NUMPAD1 61 数字小键盘上的 1 键
VK_NUMPAD2 62 数字小键盘上的 2 键
VK_NUMPAD3 63 数字小键盘上的 3 键
VK_NUMPAD4 64 数字小键盘上的 4 键
VK_NUMPAD5 65 数字小键盘上的 5 键
VK_NUMPAD6 66 数字小键盘上的 6 键
VK_NUMPAD7 67 数字小键盘上的 7 键
VK_NUMPAD8 68 数字小键盘上的 8 键
VK_NUMPAD9 69 数字小键盘上的 9 键
VK_MULTIPLY 6A Multiply 键
VK_ADD 6B Add键
VK_SEPARATOR 6C Separator 键
VK_SUBTRACT 6D Subtract 键
VK_DECIMAL 6E Decimal 键
VK_DIVIDE 6F Divide 键
VK_F1 70 F1 键
VK_F2 71 F2 键
VK_F3 72 F3 键
VK_F4 73 F4 键
VK_F5 74 F5 键
VK_F6 75 F6 键
VK_F7 76 F7 键
VK_F8 77 F8 键
VK_F9 78 F9 键
VK_F10 79 F10 键
VK_F11 7A F11 键
VK_F12 7B F12 键
VK_F13 7C F13 键
VK_F14 7D F14 键
VK_F15 7 E F15 键
VK_F16 7F F16 键
VK_F17 80H F17 键
VK_F18 81H F18 键
VK_F19 82H F19 键
VK_F20 83H F20 键
VK_F21 84H F21 键
VK_F22 85H F22 键
VK_F23 86H F23 键
VK_F24 87H F24 键

// CMFCApplication1View 消息处理程序

#include "bmp.h"
#include "scale.h"
#include "ScaleBilinear.h"
#include "Bmp_Scale.h"

void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	
	Cbmp* pBMP = new Cbmp();
	//要绘制的图像文件名
	char bmpName[] = "1.bmp";
	//左上角坐标
	int offset_left = point.x;
	int offset_top = point.y;
	//读取并绘制图像
	CClientDC dc(this);
	CDC* pDC = &dc;
	pBMP->readAndDrawBMP_seperate(pDC, bmpName, offset_left, offset_top);

}


void CMFCApplication1View::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CClientDC dc(this);
	CDC* pDC = &dc;

	//要绘制的图像文件名
	char bmpName[] = "1.bmp";

	//左上角坐标
	int offset_left = point.x;
	int offset_top = point.y;

	//确定缩放比例
	float scaleX = 0.75;
	float scaleY = 0.80;

	//缩放算法选项
	const int SCALE_NONE = 0;
	const int SCALE_NEARST = 1;
	const int SCALE_BILINEAR = 2;
	const int SCALE_BICUBIC = 3;

	CBmpScale bmpScaler;

	//1. 原图,不缩放SCALE_NONE
	//bmpScaler.read_scale_drawBMP(pDC, bmpName, offset_left + 420 * 0, offset_top, scaleX, scaleY, SCALE_NONE);

	//2. 最近邻 SCALE_BILINEAR
	bmpScaler.read_scale_drawBMP(pDC, bmpName, offset_left + 420 * 0, offset_top, scaleX, scaleY, SCALE_NEARST);

	//3. 双线性 SCALE_BILINEAR
	bmpScaler.read_scale_drawBMP(pDC, bmpName, offset_left + 400 * 1, offset_top, scaleX, scaleY, SCALE_BILINEAR);

	//4. 双三次 SCALE_BICUBIC
	bmpScaler.read_scale_drawBMP(pDC, bmpName, offset_left + 400 * 2, offset_top, scaleX, scaleY, SCALE_BICUBIC);

	CView::OnLButtonDown(nFlags, point);
	
}


void CMFCApplication1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

if(nChar==VK_NUMPAD1)
{Cbmp* pBMP = new Cbmp();
		//要绘制的图像文件名
		char bmpName[] = "1.bmp";
		//左上角坐标
		int offset_left = 100;
		int offset_top = 200;
		//读取并绘制图像
		CClientDC dc(this);
		CDC* pDC = &dc;
		pBMP->readAndDrawBMP_seperate(pDC, bmpName, offset_left, offset_top);
	}
if(nChar==VK_NUMPAD2)
{
	CClientDC dc(this);
	CBrush brush = RGB(0, 255, 0);
	CBrush* pbr = dc.SelectObject(&brush);

	dc.SelectObject(&brush);
	dc.Ellipse(100, 100, 300, 300);
}
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
	if (nChar == VK_NUMPAD3)
	{
		 CPoint point;
		OnRButtonDown(nFlags, point);
	}
	if (nChar == VK_NUMPAD4)
	{
		CClientDC dc(this);
		CDC* pDC = &dc;
		CRect rc;
		GetClientRect(&rc);

		CPen* oldPen;
		CPen newPen(PS_SOLID, 1, RGB(0, 0, 0));
		oldPen = pDC->GetCurrentPen();
		pDC->SelectObject(&newPen);
		int clientWidth = rc.Width();
		int clientHeight = rc.Height();

		CPoint pCenter;									// 坐标系原点
		//pCenter.x = long(clientWidth * 0.4);
		pCenter.x = 300;
		pCenter.y = long(clientHeight / 2);

		//画X轴
	//  pDC->MoveTo(pCenter.x / 4 - 40, pCenter.y);
	//  pDC->LineTo(clientWidth - pCenter.x / 4 + 40, pCenter.y);
		pDC->MoveTo(50, pCenter.y);
		pDC->LineTo(760, pCenter.y);

		//画Y轴
		pDC->MoveTo(pCenter.x, int(pCenter.y / 4));
		pDC->LineTo(pCenter.x, int(pCenter.y * 1.6));


		//画Sin(X)
		const double pi = 3.14;
		//int pstart = int(pCenter.x / 4);				// 曲线第一个点横坐标
		//int pend = int(clientWidth - pCenter.x / 4);	// 曲线最后一个点横坐标
		int pstart = 100;								// 曲线第一个点横坐标
		int pend = 700;									// 曲线最后一个点横坐标

		int y = int(pCenter.y - sin((pstart - pCenter.x) / 180. * pi) * 100);	// 求第一点的纵坐标
		pDC->MoveTo(pstart, y);							// 鼠标移动到第一点处

		for (int i = pstart + 1; i <= pend; i++)		// 画接下来的点
		{
			y = int(pCenter.y - sin((i - pCenter.x) / 180. * pi) * 100);		// 求每个点的纵坐标
			pDC->LineTo(i, y);
		}
	}
}

上述代码使用键盘响应函数,按下数字“1”键显示原图,按下数字“2”键绘制圆形,按下数字“3”键显示使用三种缩放算法后的图像,按下数字“4”键绘制正弦图。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值