用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++------流星雨的更多相关文章

  1. POJ 3669 Meteor Shower(流星雨)

    POJ 3669 Meteor Shower(流星雨) Time Limit: 1000MS    Memory Limit: 65536K Description 题目描述 Bessie hears ...

  2. BZOJ_1611_[Usaco2008_Feb]_Meteor_Shower流星雨_(bfs)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1611 网格图起始位置(0,0),不同时间会有流星落下,导致之后的时间里,该点以及周围四个点都不 ...

  3. BZOJ1611: [Usaco2008 Feb]Meteor Shower流星雨

    1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 904  Solved: 393 ...

  4. BZOJ 1611: [Usaco2008 Feb]Meteor Shower流星雨

    1611: [Usaco2008 Feb]Meteor Shower流星雨 Description 去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个 ...

  5. [Usaco2008 Feb]Meteor Shower流星雨

    去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...

  6. [Usaco2008 Feb]Meteor Shower流星雨[BFS]

    Description 去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的 ...

  7. 1611: [Usaco2008 Feb]Meteor Shower流星雨

    1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1010  Solved: 44 ...

  8. 用 CSS3 做一个流星雨动画

    昨天 UI 提交过来一个登录页的设计稿,要求背景有一个流星雨动画,做完之后觉得挺有趣,分享一下~ 一.流星动画 首先创建一个 div 作为画布 <div id="stars" ...

  9. bzoj1611 / P2895 [USACO08FEB]流星雨Meteor Shower

    P2895 [USACO08FEB]流星雨Meteor Shower 给每个点标记一下能够走的最迟时间,蓝后bfs处理一下 #include<iostream> #include<c ...

  10. 撩妹技能 get,教你用 canvas 画一场流星雨

    开始 妹子都喜欢流星,如果她说不喜欢,那她一定是一个假妹子. 现在就一起来做一场流星雨,用程序员的野路子浪漫一下. 要画一场流星雨,首先,自然我们要会画一颗流星. 玩过 canvas 的同学,你画圆画 ...

随机推荐

  1. 配置:Uri

    URI是网络资源的定义,代表了要操作的数据,Uri主要包含了两部分信息: 1>需要操作的ContentProvider  2>对ContentProvider中的什么数据进行操作   一个 ...

  2. POJ 2186 挑战 --牛红人 强连通分量——Tarjan

    题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目.#i ...

  3. [BZOJ3796]Mushroom追妹纸:后缀自动机+KMP

    分析 这道题有个\(O(n)\)的后缀自动机做法,感觉很好理解就在这说一下. 先对\(s1\)和\(s2\)求最长公共子串,对于\(s2\)的每一个下标\(i\),求一个\(f[i]\)表示以\(s2 ...

  4. Eclipse怎样对项目进行重命名?

    当创建一个项目时,可能会随便命名一个项目名,如果想要项目名更有意义,或者为了方便后续项目的命名,怎么重命名项目名呢? 第一步在我们的电脑打开eclipse软件,找到需要重命名的项目,如下图所示: 第二 ...

  5. android开机引导界面的几种实现

    不少应用在设计的时候都会有几个引导界面,这里总结一下几个典型实现: 之前自己做过仅具有一个引导界面的应用,在welcomeActivity中设置一张图片,更复杂的为该图片设置一个渐入渐出的动画,然后利 ...

  6. 《Effective Java》读书笔记 - 4.类和接口

    Chapter 4 Classes and Interfaces Item 13: Minimize the accessibility of classes and members 一个好的模块设计 ...

  7. jQuery-validate插件初级篇

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  8. 举例讲解Python中的死锁、可重入锁和互斥锁

    举例讲解Python中的死锁.可重入锁和互斥锁 一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一 ...

  9. 判断Ctrl Shift Alt 键当前是否被按下

    Control.ModifierKeys.HasFlag(Keys.Shift) 以此类推

  10. SecureCRT Linux系统ssh连接终端最常用快捷键

    CecureCRT连接工具常用快捷键总结: 查看 Alt + Enter 全屏 菜单 Alt + f + n 克隆会话窗口 Alt + c 在新窗口中连接,连接窗口中勾选open in a tab可以 ...