一、消息响应函数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”键绘制正弦图。