实现星空流动效果
代码如下
#include<windows.h>
#include<stdio.h>
const int StarNum = 300;
void DrawStar (HWND hwnd);
int cxClient, cyClient;
short arr[StarNum][3];
HDC hdc;
static int num= 0;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
static TCHAR szAppName[] = TEXT("wndclass by lxy");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
//窗口类初始化
wndclass.style = CS_VREDRAW | CS_HREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
//注册窗口类
if (!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("分配窗口类失败!"),szAppName,MB_ICONERROR);
return 0;
}
//创建窗口
hwnd = CreateWindow(szAppName,
TEXT("信息显示"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while (TRUE)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
if ( msg.message == WM_QUIT)
break;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
else
{
DrawStar(hwnd);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
int i;
for (i = 0; i < StarNum; i++)
{
arr[i][0] = rand()%cxClient;
arr[i][1] = rand()%cyClient;
arr[i][2] = rand()%255;
}
return 0;
case WM_DESTROY:
PostQuitMessage(message);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
void DrawStar (HWND hwnd)
{
int i;
for (i = 0; i < StarNum; i++)
{
if (++arr[i][0] > cxClient)
{
arr[i][0] = rand()%cxClient/3;
arr[i][1] = rand()%cyClient;
arr[i][2] = rand()%255;
}
}
hdc = GetDC (hwnd);
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
Rectangle(hdc, 0, 0, cxClient, cyClient);
SetBkMode(hdc, RGB(255,255,255));
for (i = 0; i < StarNum; i++)
{
SetPixel(hdc, arr[i][0], arr[i][1], RGB(arr[i][2],arr[i][2],arr[i][2]));
}
ReleaseDC (hwnd, hdc);
Sleep(10);
}