【Windows编程——API】简单按键指令识别
作者:互联网
//windows.h文件中包含应用程序中所需的数据类型和数据结构的定义 #include <windows.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <stdio.h> #include <math.h> #define PI acos(-1) LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口函数说明 //---------以下初始化窗口类-------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName[] = "窗口"; //窗口类名 char lpszTitle[] = "My_Windows"; //窗口标题名 //窗口类的定义 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类型为默认类型 wndclass.lpfnWndProc = WndProc; //窗口处理函数为WndProc wndclass.cbClsExtra = 0; //窗口类无扩展 wndclass.cbWndExtra = 0; //窗口实例无扩展 wndclass.hInstance = hInstance; //当前实例句柄 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为默认图标 wndclass.hCursor = LoadCursor( NULL, IDC_ARROW); //窗口 采用箭头光标 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口 背景为 白色 wndclass.lpszMenuName = NULL ; //窗口 中无菜单 wndclass.lpszClassName = lpszClassName; //窗口类名为“窗口示例” //-----------以下进行窗口类的注册 if (!RegisterClass(&wndclass))//如果注册失败则发出警吿声音 { MessageBeep (0); return FALSE; } //创建窗口 hwnd = CreateWindow( lpszClassName, //窗口类名 lpszTitle, //窗口实例的标题名 WS_OVERLAPPEDWINDOW, //窗口 的风格 CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐标为默认值 CW_USEDEFAULT, CW_USEDEFAULT, //窗口的髙和宽为默认值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口应用程序的当前句柄 NULL //不使用该值 ); ShowWindow( hwnd, nCmdShow); //显示窗口 UpdateWindow(hwnd); //绘制用户区 while( GetMessage(&Msg, NULL, 0, 0)) //消息循环 { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; //程序终止时将信息返回系统 } //窗口函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hDC, hdc_old; HBITMAP hBmp; RECT rect; HBRUSH hBrush; PAINTSTRUCT Ps; TEXTMETRIC tm; HFONT hf; HPEN hPen; SIZE Sz; COLORREF color[7] = {RGB(255,0,0), RGB(255,165,0), RGB(255,255,0), RGB(0,255,0), RGB(0,255,255), RGB(0,0,255), RGB(139,0,255)}; static bool isshift = false, isctrl = false, isctrlR = false, isshiftB = false, isup = false, isR = false, isG = false, isB = false; char *textbuf[] = { "您按下了UP键", "您按下了CTRL键" }; HBITMAP hBkBmp; int i; switch (message) { case WM_KEYDOWN: { switch (wParam) { case VK_UP: isup = true; break; case VK_SHIFT: isshift = true; break; case VK_CONTROL: isctrl = true; break; default: break; } } return 0; case WM_KEYUP: InvalidateRect(hWnd, NULL, 1); return 0; case WM_ERASEBKGND: return 1; case WM_CHAR: if (GetAsyncKeyState(VK_CONTROL)&&GetAsyncKeyState('R')) { if (isctrl == true) { isctrlR = true; isctrl = false; } } else if (GetAsyncKeyState(VK_SHIFT)&&GetAsyncKeyState('B')) { if (isshift) { isshift = false; isshiftB = true; } } else if (GetAsyncKeyState('B')) { isB = true; } else if (GetAsyncKeyState('R')) { isR = true; } else if (GetAsyncKeyState('G')) { isG = true; } return 0; case WM_PAINT: hDC = BeginPaint(hWnd, &Ps); // hdc_old = BeginPaint(hWnd, &Ps); // hDC = CreateCompatibleDC(hdc_old); GetClientRect(hWnd,&rect); // hBmp = CreateCompatibleBitmap(hdc_old,rect.right,rect.bottom); // SelectObject(hDC,hBmp); if (isup) { hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); hBrush = CreateSolidBrush(RGB(255,255,255)); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); DrawText(hDC, textbuf[0], -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); isup = false; } else if (isctrlR) { hPen = CreatePen(PS_SOLID, 1, color[1]); hBrush = CreateSolidBrush(color[1]); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); isctrlR = false; } else if (isctrl) { hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); hBrush = CreateSolidBrush(RGB(255,255,255)); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); DrawText(hDC, textbuf[1], -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); isctrl = false; } else if (isshiftB) { hPen = CreatePen(PS_SOLID, 1, color[6]); hBrush = CreateSolidBrush(color[6]); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); isshiftB = false; } else if (isR) { hPen = CreatePen(PS_SOLID, 1, color[0]); hBrush = CreateSolidBrush(color[0]); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); isR = false; } else if (isG) { hPen = CreatePen(PS_SOLID, 1, color[3]); hBrush = CreateSolidBrush(color[3]); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); isG = false; } else if (isB) { hPen = CreatePen(PS_SOLID, 1, color[5]); hBrush = CreateSolidBrush(color[5]); SelectObject(hDC, hBrush); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom); isB = false; } // BitBlt(hdc_old,0,0,rect.right,rect.bottom,hDC,0,0,SRCCOPY); // DeleteObject(hBmp); DeleteObject(hBrush); DeleteObject(hPen); // DeleteDC(hDC); ReleaseDC(hWnd, hDC); //释放 EndPaint(hWnd, &Ps); //结束缓制 return 0; case WM_DESTROY: PostQuitMessage(0); //调用 PostQuitMessage 发出 WM_QUIT 消息 return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); //默认时采用系统消息默认处理函数 } }
标签:窗口,Windows,编程,API,hDC,false,hPen,rect,255 来源: https://www.cnblogs.com/Vikyanite/p/12639025.html