C++------流星雨
用C++实现模拟数字、字母流星雨,其主要用到链表、win32编程基础。
demo实例:
// DataRainDemo.cpp : 定义应用程序的入口点。
// #include "stdafx.h"
#include "DataRainDemo.h"
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#define STRMINLEN 8
#define STRMAXLEN 25 //双向链表的每一个节点
typedef struct MyList
{
struct MyList *prev; //前一节点
struct MyList *pNext; //下一节点
char ch; //数据保存
} MyList,*pMyList;
//处理数据
typedef struct MyListColum
{
MyList *phead; //整个链表的头
MyList *pCurent; //链表所在当前的位置
MyList *pTemp; //临时变量
int listStrLen; //整个链表的长度
int x, y; //链表的位置
int iStopTimes;
int iMusStopTimes;
}StrColum,*pStrColum; #define MAX_LOADSTRING 100 // 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 // 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_DATARAINDEMO, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
srand(time(NULL));//以时间为种子
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DATARAINDEMO)); MSG msg; // 主消息循环:
while (GetMessage(&msg, nullptr, , ))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
}
//宽字节 两个字节代表一个字符
TCHAR randomChar()
{
return (rand() % + );//0-9的ASCII
} //
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DATARAINDEMO));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wcex.lpszMenuName = NULL;//MAKEINTRESOURCEW(IDC_DATARAINDEMO);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);
} //
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中 /*HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);*/
/*
API 函数原型:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, // 窗口类名称
_In_opt_ LPCTSTR lpWindowName, // 窗口标题
_In_ DWORD dwStyle, // 窗口风格,或称窗口格式
_In_ int x, // 初始 x 坐标
_In_ int y, // 初始 y 坐标
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜单句柄
_In_opt_ HINSTANCE hInstance, // 程序实例句柄
_In_opt_ LPVOID lpParam // 创建参数
); 注:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数(不是说没有参数,而是可以利用宏搭配参数)。
*/
HWND hWnd = CreateWindowW(szWindowClass, NULL, WS_DLGFRAME|WS_THICKFRAME|WS_POPUP,
, , GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), nullptr, nullptr, hInstance, nullptr); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
} //
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
//初始化每个链表
void init(StrColum *cc, int cyScreen, int x)
{
int j;
cc->listStrLen = rand() % (STRMAXLEN - STRMINLEN) + STRMINLEN;
cc->x = x+;
cc->y = rand() % ? rand() % cyScreen : ;
cc->iMusStopTimes = rand() % ;
cc->iStopTimes = ;
cc->phead = cc->pCurent = (pMyList)calloc(cc->listStrLen,sizeof(MyList));
for ( j = ; j < cc->listStrLen-; j++)
{
cc->pCurent->prev = cc->pTemp;
cc->pCurent->ch = '\0';
cc->pCurent->pNext = cc->pCurent + ;
cc->pTemp = cc->pCurent++;
}
cc->pCurent->prev = cc->pTemp;
cc->pCurent->ch = '\0';
cc->pCurent->pNext = cc->phead;
cc->phead->prev = cc->pCurent;
cc->pCurent = cc->pTemp = cc->phead;
cc->phead->ch = randomChar();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
int i, j, temp, ctn;
static HDC hdcMem;
HFONT hFont;
static HBITMAP hBimtmap;
static int cxScreen, cyScreen;
static int iFontWidth = , iFontHeight = , iColumCount;
static StrColum *ccChain;
switch (message)
{
case WM_CREATE:
{
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
SetTimer(hWnd, , , NULL);
hdc = GetDC(hWnd);
hdcMem = CreateCompatibleDC(hdc);
hBimtmap = CreateCompatibleBitmap(hdc, cxScreen, cyScreen);
SelectObject(hdcMem, hBimtmap);
ReleaseDC(hWnd, hdc); hFont = CreateFont(iFontHeight, iFontWidth - , , ,
FW_BOLD, , , , DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DRAFT_QUALITY, FIXED_PITCH | FF_SWISS,
TEXT("Fixedsys"));
SelectObject(hdcMem,hFont);
DeleteObject(hFont);
SetBkMode(hdcMem,TRANSPARENT);
//设置显示的列数
iColumCount = cxScreen / (iFontWidth * / );
ccChain = (pStrColum)calloc(iColumCount,sizeof(StrColum));
for (int i = ; i < iColumCount; i++)
{
init(ccChain + i,cyScreen,(iFontWidth*/)*i);
}
return ;
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
EndPaint(hWnd, &ps);
}
break; case WM_DESTROY:
KillTimer(hWnd,);
DeleteObject(hBimtmap);
DeleteDC(hdcMem);
for ( i = ; i < iColumCount; i++)
{
free((ccChain+i)->pCurent);
}
free(ccChain);
PostQuitMessage();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_TIMER:
{
hdc = GetDC(hWnd);
PatBlt(hdcMem, , , cxScreen, cyScreen, BLACKNESS);
for (int i = ; i < iColumCount; i++)
{
ctn = (ccChain + i)->iStopTimes++ >(ccChain + i)->iMusStopTimes;
(ccChain + i)->pTemp = (ccChain + i)->phead;
SetTextColor(hdcMem,RGB(,,));
TextOut(hdcMem,(ccChain+i)->x,(ccChain+i)->y,&((ccChain+i)->pTemp->ch),);
j = (ccChain + i)->y;
(ccChain + i)->pTemp = (ccChain + i)->pTemp->pNext;
temp = ;
//temp 绿色过度到黑色
while ((ccChain+i)->pTemp!=(ccChain+i)->phead
&&(ccChain+i)->pTemp->ch)
{
SetTextColor(hdcMem,RGB(,-(*(temp++)
/(ccChain+i)->listStrLen),));
TextOut(hdcMem,(ccChain+i)->x,j-=iFontHeight,
&((ccChain+i)->pTemp->ch),);
(ccChain + i)->pTemp = (ccChain + i)->pTemp->pNext;
}
if (ctn)
(ccChain + i)->iStopTimes = ;
else
continue;
(ccChain + i)->y += iFontHeight;//下次开始显示的地方
if ((ccChain+i)->y-(ccChain+i)->listStrLen*iFontHeight>cyScreen)
{
free((ccChain+i)->pCurent);
init(ccChain+i,cyScreen,(iFontWidth*/)*i);
}
(ccChain + i)->phead = (ccChain + i)->phead->prev;
(ccChain + i)->phead->ch = randomChar();
} BitBlt(hdc,,,cxScreen,cyScreen,hdcMem,,,SRCCOPY);
ReleaseDC(hWnd,hdc);
}
//case WM_RBUTTONDOWN:
// KillTimer(hWnd,1);
// return 0;
//case WM_RBUTTONUP:
// SetTimer(hWnd,1,10,NULL);
// return 0; }
return ;
} // “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
实现效果展示
C++------流星雨的更多相关文章
- POJ 3669 Meteor Shower(流星雨)
POJ 3669 Meteor Shower(流星雨) Time Limit: 1000MS Memory Limit: 65536K Description 题目描述 Bessie hears ...
- BZOJ_1611_[Usaco2008_Feb]_Meteor_Shower流星雨_(bfs)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1611 网格图起始位置(0,0),不同时间会有流星落下,导致之后的时间里,该点以及周围四个点都不 ...
- BZOJ1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 904 Solved: 393 ...
- BZOJ 1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Description 去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个 ...
- [Usaco2008 Feb]Meteor Shower流星雨
去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...
- [Usaco2008 Feb]Meteor Shower流星雨[BFS]
Description 去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的 ...
- 1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1010 Solved: 44 ...
- 用 CSS3 做一个流星雨动画
昨天 UI 提交过来一个登录页的设计稿,要求背景有一个流星雨动画,做完之后觉得挺有趣,分享一下~ 一.流星动画 首先创建一个 div 作为画布 <div id="stars" ...
- bzoj1611 / P2895 [USACO08FEB]流星雨Meteor Shower
P2895 [USACO08FEB]流星雨Meteor Shower 给每个点标记一下能够走的最迟时间,蓝后bfs处理一下 #include<iostream> #include<c ...
- 撩妹技能 get,教你用 canvas 画一场流星雨
开始 妹子都喜欢流星,如果她说不喜欢,那她一定是一个假妹子. 现在就一起来做一场流星雨,用程序员的野路子浪漫一下. 要画一场流星雨,首先,自然我们要会画一颗流星. 玩过 canvas 的同学,你画圆画 ...
随机推荐
- 人脸三维建模A Morphable Model For The Synthesis Of 3D Faces(三维人脸合成的变形模型)
Abstract摘要 In this paper, a new technique for modeling textured 3D faces is introduced. 3D faces can ...
- [BZO3572][HNOI2014]世界树:虚树+倍增
分析 思维难度几乎为\(0\)的虚树码农(并不)题. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register int i=( ...
- android intent调用系统camera
利用android的camera通常有两种方式:利用intent调用系统的camera,或者结合surfaceview实现自己定制的camera.先分别对这两种方法说明如下: 一.使用系统自配的cam ...
- hibernate UML图
- Getting CFNetwork SSLHandshake failed (-9806) error
平常个人打测试包一切OK,今天突然不能联网了 How to handle "CFNetwork SSLHandshake failed" in iOS 参考1 Getting CF ...
- @清晰掉 qsort()
qsort函数描述: http://www.cnblogs.com/sooner/archive/2012/04/18/2455011.html qsort()函数实现: /*** *qsort.c ...
- Hibernate一级缓存之懒加载问题
Hibernate的懒加载: 当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性. 目的,为提高程序执行效率. 查询操作:get()方法/load()方法 (1)get()方法,及时 ...
- eclipse添加约束文件
DTD 类型约束文件 1. Window->Preferences->XML->XML Catalog->User Specified Entries窗口中,选择Add ...
- 全局namespace与模块内的namespace
declare global{ declare namespace xxx } 相当于 在一个js文件的顶级部分 declare namespace xxx 声明的都是全局的namespace, 如果 ...
- IntToHex
IntToHex是一种函数,功能是将一个值转换成16进制形式的字符串. IntToHex(int Value, int Digits) 来源: 在Delphi.Pascal或C++ Builder中使 ...