#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <mmsystem.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define WINDOW_CLASS_NAME "WINCLASS1" #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1:0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0:1) //全局变量 HWND main_window_handle = NULL; HINSTANCE hInstance_App = NULL; char buffer[80]; //窗口处理函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPram) { PAINTSTRUCT ps; HDC hdc; RECT rect; char buffer[80]; switch (msg) { case WM_CREATE: { return 0; }break; case WM_PAINT: { hdc = GetDC(hwnd); ReleaseDC(hwnd, hdc); GetClientRect(hwnd, &rect); ValidateRect(hwnd, &rect); return 0; }break; case WM_CLOSE: { if (IDYES != MessageBox(hwnd, "确实要退出应用程序?", "退出", MB_YESNO | MB_ICONEXCLAMATION)) { return 0; } else { PostQuitMessage(0); } }break; case WM_SIZE: { }break; case WM_DESTROY: { PostQuitMessage(0); return 0; }break; default:break; } return DefWindowProc(hwnd, msg, wParam, lPram); } void GameMain() { return; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //定义窗口类 WNDCLASSEX winClass; HWND hWnd; MSG msg; HPEN pen = NULL; int color_change_count = 100; //填充窗口类的各成员 winClass.cbSize = sizeof(WNDCLASSEX); winClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winClass.lpfnWndProc = WindowProc; //窗口消息处理函数 winClass.cbClsExtra = 0; winClass.cbWndExtra = 0; winClass.hInstance = hInstance; winClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winClass.hCursor = LoadCursor(NULL, IDC_ARROW); winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winClass.lpszMenuName = NULL; winClass.lpszClassName = WINDOW_CLASS_NAME; //窗口类名 winClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //保存实例句柄到全局变量 hInstance_App = hInstance; //注册窗口类 if (!RegisterClassEx(&winClass)) { return 0; } //创建窗口类的一个成员 if (!(hWnd = CreateWindowEx(NULL, WINDOW_CLASS_NAME, "时间锁定的屏幕保护程序", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 200, 200, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL))) { return 0; } //保存窗体句柄到全局变量中 main_window_handle = hWnd; //得到设备上下文 HDC hdc = GetDC(hWnd); //设置随机数生成器的种子 srand(GetTickCount()); //线段终点坐标 int x1 = rand() % WINDOW_WIDTH; int y1 = rand() % WINDOW_HEIGHT; int x2 = rand() % WINDOW_WIDTH; int y2 = rand() % WINDOW_HEIGHT; //线段终点的速度 int x1v = -4 + rand() % 8; int y1v = -4 + rand() % 8; int x2v = -4 + rand() % 8; int y2v = -4 + rand() % 8; //消息循环 while (TRUE) { DWORD start_time = GetTickCount(); if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { break; } TranslateMessage(&msg); DispatchMessage(&msg); } //100次变换一次颜色 if (++color_change_count >= 100) { color_change_count = 0; if (pen) { DeleteObject(pen); } pen = CreatePen(PS_SOLID, 1, RGB(rand() % 256, rand() % 256, rand() % 256)); SelectObject(hdc, pen); } //移动线段终点 x1 += x1v; y1 += y1v; x2 += x2v; y2 += y2v; //碰撞检测,看是否碰到窗体的边界 if (x1<0 || x1>WINDOW_WIDTH) { x1v = -x1v; x1 += x1v; } if (y1<0 || y1>WINDOW_HEIGHT) { y1v = -y1v; y1 += y1v; } if (x2<0 || x2>WINDOW_WIDTH) { x2v = -x2v; x2 += x2v; } if (y2<0 || y2>WINDOW_HEIGHT) { y2v = -y2v; y2 += y2v; } MoveToEx(hdc, x1, y1,NULL); LineTo(hdc, x2, y2); //锁定帧率为30fps,1/30秒,约等于33毫秒。 while (GetTickCount() - start_time < 33); //如果用户按了ESC,发送WM_CLOSE消息。退出程序。 if (KEYDOWN(VK_ESCAPE)) SendMessage(hWnd, WM_CLOSE, 0, 0); } ReleaseDC(hWnd, hdc); return msg.wParam; }