用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. noip模拟题 Market

    题面描述: 数据范围: Solution: 我们发现\(v\)很小,但是\(M\)很大,考虑转化一下一般的背包 我们用\(f[v]\)来表示拿到价值为\(v\)的物品需要付出的最少代价,特别的,当\( ...

  2. Django简单操作

    一.静态文件配置 静态文件配置 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露给 ...

  3. Android系统关机或重启的几种实现方式

    前阵子工作上遇到一些关于Android系统关机或重启的系统修改,于是,做了一些尝试,也搜集了一下资料,现在整理一下,做一些总结,方便学习或者日后工作的需要. 默认的SDK并没有提供应用开发者直接的An ...

  4. (48)LINUX应用编程和网络编程之三Linux获取系统信息

    3.3.1.关于时间的概念 3.3.1.1.GMT时间 (1)GMT是格林尼治时间,也就是格林尼治地区的当地之间. (2)GMT时间的意义?[用格林尼治的当地时间作为全球国际时间],用以描述全球性的事 ...

  5. Linux安装配置redis 、启动redis、redis设置密码

    由于间隔时间较长.机器的环境不同等等原因,所以每次安装redis的时候总是不那么顺利,所以这次我要做个笔记 文章大部分内容源于https://blog.csdn.net/gisredevelopmen ...

  6. kali文件执行的权限不够解决办法

    root@kali:~# ./sql.py bash: ./sql.py: 权限不够 root@kali:~# ./.py Fuzzing PASS with bytes ^CTraceback (m ...

  7. JAVA单例模式的实现伪代码

    什么是单例?:其定义是单例对象的类只能允许一个实例存在 单例的实现基本原理:1.将该类的构造方法定义为私有访问,不对外暴露从而使其他类不能实例化该类对象,只能通过该类的静态方法得到该类的唯一实例 2. ...

  8. 突破css选择器的局限,实现一个css地址选择器?

    首先看一个效果,注意地址栏的变化 然后思考一下,用css如何实现? css选择器的局限 选择器是css中的一大特色,用于选择需要添加样式的元素. 选择器的种类有很多,比如 元素选择器 p {color ...

  9. modern php笔记---1、新时代的php

    modern php笔记---1.新时代的php 一.总结 一句话总结: php有Zend Engine 和 Facebook开发的 HipHop Virtual Machine两套引擎 1.php也 ...

  10. React Native商城项目实战04 - 封装TabNavigator.Item的创建

    1.Main.js /** * 主页面 */ import React, { Component } from 'react'; import { StyleSheet, Text, View, Im ...