本程序vs2013 测试通过,不排除其他测试通过用例,主要是windows API的应用

#include <windows.h> #define ID_TIMER    1
#define STRMAXLEN  25 //一个显示列的最大长度
#define STRMINLEN  8  //一个显示列的最小长度 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
typedef struct tagCharChain //整个当作屏幕的一个显示列,这是个双向列表
{struct tagCharChain *prev; //链表的前个元素 TCHAR  ch;                  //一个显示列中的一个字符 struct tagCharChain *next; //链表的后个元素
}CharChain, *pCharChain;typedef struct tagCharColumn
{CharChain *head, *current, *point;int x, y, iStrLen; //显示列的开始显示的x,y坐标,iStrLen是这个列的长度 int iStopTimes, iMustStopTimes; //已经停滞的次数和必须停滞的次数,必须停滞的次数是随机的
}CharColumn, *pCharColumn;int main(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT("matrix");HWND            hwnd;MSG            msg;WNDCLASS    wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)){MessageBox(NULL, TEXT("此程序必须运行在NT下!"), szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName, NULL,WS_DLGFRAME | WS_THICKFRAME | WS_POPUP,0, 0,GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),NULL, NULL, hInstance,NULL);ShowWindow(hwnd, SW_SHOWMAXIMIZED); //最大化显示 UpdateWindow(hwnd);ShowCursor(FALSE); //隐藏鼠标光标 srand((int)GetCurrentTime()); //初始化随机数发生器 while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}ShowCursor(TRUE); //显示鼠标光标 return msg.wParam;
}TCHAR randomChar() //随机字符产生函数
{return (TCHAR)(rand() % (126 - 33) + 33); //33到126之间
}int init(CharColumn *cc, int cyScreen, int x) //初始化
{int j;cc->iStrLen = rand() % (STRMAXLEN - STRMINLEN) + STRMINLEN; cc->x = x + 3;      cc->y = rand() % 3 ? rand() % cyScreen : 0;cc->iStopTimes = 0;cc->head = cc->current =(pCharChain)calloc(cc->iStrLen, sizeof(CharChain)); for (j = 0; j < cc->iStrLen - 1; j++){cc->current->prev = cc->point; //cc->point一个显示列的前个元素 cc->current->ch = '\0';cc->current->next = cc->current + 1; //cc->current+1一个显示列的后个元素 cc->point = cc->current++; //cc->point = cc->current; cc->current++; }cc->current->prev = cc->point; //最后一个节点 cc->current->ch = '\0';cc->current->next = cc->head;cc->head->prev = cc->current; //头节点的前一个为此链的最后一个元素 cc->current = cc->point = cc->head; //free掉申请的内存要用current当参数 cc->head->ch = randomChar(); // 对链表头的 元素填充 return 0;
}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 hBitmap;static  int cxScreen, cyScreen; //屏幕的宽度 高度. static  int iFontWidth = 10, iFontHeight = 15, iColumnCount; //字体的宽度 高度, 列数 static  CharColumn *ccChain;switch (message){case WM_CREATE:cxScreen = GetSystemMetrics(SM_CXSCREEN); //屏幕宽度 cyScreen = GetSystemMetrics(SM_CYSCREEN);SetTimer(hwnd, ID_TIMER, 10, NULL);hdc = GetDC(hwnd);hdcMem = CreateCompatibleDC(hdc);hBitmap = CreateCompatibleBitmap(hdc, cxScreen, cyScreen);SelectObject(hdcMem, hBitmap);ReleaseDC(hwnd, hdc);//创建字体 hFont = CreateFont(iFontHeight, iFontWidth - 5, 0, 0, FW_BOLD, 0, 0, 0,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DRAFT_QUALITY, FIXED_PITCH | FF_SWISS, TEXT("Fixedsys"));SelectObject(hdcMem, hFont);DeleteObject(hFont);SetBkMode(hdcMem, TRANSPARENT); //设置背景模式为 透明 iColumnCount = cxScreen / (iFontWidth * 1 / 2); //屏幕所显示字母雨的列数 ccChain = (pCharColumn)calloc(iColumnCount, sizeof(CharColumn));for (i = 0; i < iColumnCount; i++){init(ccChain + i, cyScreen, (iFontWidth * 3 / 2)*i);}return 0;case WM_TIMER:hdc = GetDC(hwnd);PatBlt(hdcMem, 0, 0, cxScreen, cyScreen, BLACKNESS); //将内存设备映像刷成黑色 for (i = 0; i < iColumnCount; i++){ctn = (ccChain + i)->iStopTimes++ > (ccChain + i)->iMustStopTimes;// (ccChain + i)->point = (ccChain + i)->head; //point用于遍历整个显示列 //第一个字符显示为绿 SetTextColor(hdcMem, RGB(0, 255, 0));TextOut(hdcMem, (ccChain + i)->x, (ccChain + i)->y, &((ccChain + i)->point->ch), 1);j = (ccChain + i)->y;(ccChain + i)->point = (ccChain + i)->point->next;//遍历整个显示列,将这个显示列里的字符从下往上显示 temp = 0; //temp绿色过度到黑色之用 while ((ccChain + i)->point != (ccChain + i)->head && (ccChain + i)->point->ch){SetTextColor(hdcMem, RGB(0, 255 - (255 * (temp++) / (ccChain + i)->iStrLen), 0));TextOut(hdcMem, (ccChain + i)->x, j -= iFontHeight, &((ccChain + i)->point->ch), 1);(ccChain + i)->point = (ccChain + i)->point->next;}if (ctn)(ccChain + i)->iStopTimes = 0;else continue;(ccChain + i)->y += iFontHeight; //下次开始显示的y坐标 为当前的y坐标加上 一个字符的高度 //如果开始显示的y坐标减去 整个显示列的长度超过了屏幕的高度 if ((ccChain + i)->y - (ccChain + i)->iStrLen*iFontHeight > cyScreen){free((ccChain + i)->current);init(ccChain + i, cyScreen, (iFontWidth * 3 / 2)*i);}//链表的头 为此链表的前个元素,因为下次开始显示的时候 就相当与在整个显示列的开头添加个元素,然后在开始往上显示 (ccChain + i)->head = (ccChain + i)->head->prev;(ccChain + i)->head->ch = randomChar();}BitBlt(hdc, 0, 0, cxScreen, cyScreen, hdcMem, 0, 0, SRCCOPY);ReleaseDC(hwnd, hdc);return 0;case WM_RBUTTONDOWN:KillTimer(hwnd, ID_TIMER);return 0;case WM_RBUTTONUP:SetTimer(hwnd, ID_TIMER, 10, NULL);return 0;//处理善后工作 case WM_KEYDOWN:case WM_LBUTTONDOWN:case WM_DESTROY:KillTimer(hwnd, ID_TIMER);DeleteObject(hBitmap);DeleteDC(hdcMem);for (i = 0; i < iColumnCount; i++){free((ccChain + i)->current);}free(ccChain);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

黑客帝国之酷炫屏保数字雨相关推荐

  1. Centos7.6 安装cmatrix黑客帝国代码屏保

    想在自己的Linux上安装炫酷的屏保吗?cmatrix就可以帮你实现高大上的效果,而且只需要几步就可以完成,非常简单! 1.下载软件包:cmatrix-1.2a.tar.gz并上传到服务器 下载地址: ...

  2. 10 分钟学会 5 个酷炫 Linux 命令

    注意:此教程无需安装任何软件,实验楼官网提供完整的Linux在线操作环境. Windows 可能给了你电脑启蒙,但在计算机世界里,Linux 的地位比 Windows 更加重要. 迄今为止,80% 以 ...

  3. 安装黑客帝国字母雨屏保教程(让你的屏保更加炫酷)

    1.上传文件 这里是直接上传了文件的,所有就不演示了,有想要的可以私信作者 2.给文件赋予执行权限 chmod 700 cmatrix 3.执行文件 ./cmatrix 4.给屏保文件设置软链接(作用 ...

  4. 【炫酷秀】仅用4行代码再现《黑客帝国》数字雨,可立即在终端实现!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 提到<黑客帝国>,字符雨可谓是让人印象深刻. 这种科技感爆棚的特效,你 ...

  5. 【黑客帝国数字雨屏保】基于Win32的黑客帝国数字雨屏幕保护程序(附VS工程代码文件和可执行文件)

    运行效果 代码结构 //黑客帝国数字雨 花心胡萝卜 #包含 <windows.h> #包含 <stdlib.h>#define 时钟编号 1 #define 最大长度 25 / ...

  6. 安装屏保软件(Linux终端演示 “黑客帝国” 字母雨界面)和Linux修改管理员密码...

    1.Linux修改管理员密码: 打开终端: 1. 重启 reboot 2.进入内核登陆系统点击e 3.进入系统救援界面,定位Linux16所在行,找到ro 后删除,在此位置添加一条命令: rw ini ...

  7. 安装屏保软件(Linux终端演示 “黑客帝国” 字母雨界面)和Linux修改管理员密码

    1."黑客帝国" 字母雨: 1>.下载屏保软件: wget http://archive.ubuntu.com/ubuntu/pool/universe/c/cmatrix/ ...

  8. Hyperspace 炫酷太空隧道穿梭屏保

    Hyperspace 是mac上一款炫酷的太空隧道穿梭屏保,可让您在太空的远处巡游,在恒星之间飞行,越过渗出的宇宙飞机并穿越无尽的波光粼粼的隧道.您可以选择调整速度,视图深度,视野,星星的数量和大小以 ...

  9. 好玩的linux命令--cmatrix炫酷屏保软件

    好玩的linux命令--cmatrix炫酷屏保软件 链接:https://pan.baidu.com/s/1837d9HjUg6Ek8RxOa9ohAg  密码:vuzh tar xvf cmatri ...

  10. Linux命令-cmatrix炫酷屏保软件

    cmatrix软件安装包: 链接:https://pan.baidu.com/s/1I0XrajEkX0wv98ewCVpKIQ 提取码:s5wg tar xf cmatrix-1.2a.tar.gz ...

最新文章

  1. OpenCV读写视频文件解析(二)
  2. disk boot failure,insert system disk and press enter
  3. Spring_Spring@Transactional
  4. 全球及中国语音拾音耳机行主要产品及营销模式分析报告业2022-2028年版
  5. Cisco路由器AAA配置
  6. Elasticsearch(一)架构及一般性应用
  7. Codeforces Round #368 (Div. 2) problem: (C) Pythagorean Triples
  8. Apple 的CEO 吹响了战斗的号角啦!
  9. 【经典回放】JavaScript学习详细干货笔记之(二)
  10. 有一个小白程序员,写了一个只能对5个数字进行排序的函数,现在有25个不重复的数字,
  11. 中国电信学院c语言题库,电脑题库试题精编版.doc
  12. 基于visual Studio2013解决C语言竞赛题之1010计算
  13. 异常处理:你不可能总是对的 - 零基础入门学习Python032
  14. 苹果支付招聘业务开发经理 需有加密货币支付工作经验
  15. 微课系列(四):Python中map对象的几种用法和注意事项
  16. 关于图像傅里叶变换得到的频谱图的通俗理解
  17. stm32开发板调试问题记录----去除flash读保护以及debug进不去main.c的问题
  18. 如何注册gmail邮箱
  19. 超声波测深仪工作原理
  20. java选择,智力,数量,推理

热门文章

  1. sql mysql 删除数据库_如何清除SQL数据库中的数据?
  2. SAP HR工资核算基础(转)
  3. mplayer+科大讯飞离线语音包
  4. SwitchHosts修改hosts利器
  5. fiddler4苹果手机证书无法使用的问题解决方案
  6. win7 gho封装教程
  7. Android SDK下载失败解决
  8. LabView实战笔记——贪吃蛇游戏设计
  9. 常见的下载工具有哪些?BT下载软件哪个好
  10. 免费正版 Win 10/8/7操作系统虚拟机镜像下载