• 黑客屏保 代码来自网络搜索 做了部分改动


    #include "stdafx.h"
    #include <windows.h>
    #include <locale>
    #include <exception>
    
    #pragma comment (lib,"User32.lib")
    #pragma comment (lib,"Gdi32.lib")
    
    #define ID_TIMER 1 
    #define STRMAXLEN 19 //一个显示列的最大长度 
    #define STRMINLEN 8 //一个显示列的最小长度
    #pragma comment ( linker, "/subsystem:windows /entry:mainCRTStartup" ) //去除启动或退出程序时黑框
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    ////////////////////////////////////////////////////////////////// 
    //////////////////////////////////////////////////////////////////
    
    typedef struct tagCharColumn
    {
    TCHAR letters[STRMAXLEN];
    int x, y, iStrLen; //显示列的开始显示的x,y坐标,iStrLen是这个列的长度 
    int iStopTimes, iMustStopTimes; //已经停滞的次数和必须停滞的次数,必须停滞的次数是随机的 
    }CharColumn, *pCharColumn;
    
    TCHAR randomChar() //随机字符产生函数 
    {
    return (TCHAR)(rand() % 255); //33到126之间 
    }
    
    int init(CharColumn *cc, int cyScreen, int x) //初始化 
    {
    static unsigned int t = 0;
    int j;
    
    
    cc->iStrLen = rand() % (STRMAXLEN - STRMINLEN) + STRMINLEN; //显示列的长度 
    for (int i = 0; i < cc->iStrLen; i++)
    cc->letters[i] = randomChar();
    cc->x = x + 3; //显示列的开始显示的x坐标 
    cc->y = rand() % 3 ? rand() % cyScreen : 0; //显示列的开始显示的y坐标 
    cc->iMustStopTimes = rand() % 6;
    cc->iStopTimes = 0;
    
    if (t % 5 == 0)
    {
    memcpy(cc->letters, _T(" 峰言 制作 "), sizeof(_T(" 峰言 制作 ")));
    cc->iStrLen = sizeof(_T(" 峰言 制作 ")) / sizeof(TCHAR) - 1;
    }
    
    cc->letters[0] = randomChar();
    t++;
    return t;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    HDC hdc;
    //ctn 用来确定一个显示链是否 向下前进,如果等待次数超过必须等待的次数,ctn就代表要向下前进 
    int i, j, temp, ctn; //j为一个显示链中除链表头外的在屏幕上显示的y坐标,temp绿色过度到黑色之用 
    static HDC hdcMem;
    HFONT hFont;
    static HBITMAP hBitmap;
    static int cxScreen, cyScreen; //屏幕的宽度 高度. 
    static int iFontWidth = 19, iFontHeight = 22, iColumnCount; //字体的宽度 高度, 列数 
    static CharColumn *ccChain;
    
    switch (message)
    {
    case WM_CREATE:
    cxScreen = GetSystemMetrics(SM_CXSCREEN); //屏幕宽度 
    cyScreen = GetSystemMetrics(SM_CYSCREEN);
    SetTimer(hwnd, ID_TIMER, 20, 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("Consolas"));
    SelectObject(hdcMem, hFont);
    DeleteObject(hFont);
    SetBkMode(hdcMem, TRANSPARENT); //设置背景模式为 透明 
    iColumnCount = cxScreen / (iFontWidth * 3 / 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++)
    {
    int letterIndex = 0;
    ctn = ccChain[i].iStopTimes++ > ccChain[i].iMustStopTimes;
    
    SetTextColor(hdcMem, RGB(255, 255, 255));
    TextOut(hdcMem, ccChain[i].x, ccChain[i].y, &(ccChain[i].letters[letterIndex]), 1);
    j = (ccChain + i)->y;
    letterIndex++;
    //遍历整个显示列,将这个显示列里的字符从下往上显示 
    temp = 0; //temp绿色过度到黑色之用 
    while (letterIndex < ccChain[i].iStrLen)
    {
    SetTextColor(hdcMem, RGB(0, 255 - (255 * (temp++) / (ccChain + i)->iStrLen), 0));
    TextOut(hdcMem, (ccChain + i)->x, j -= iFontHeight, &((ccChain + i)->letters[letterIndex]), 1);
    letterIndex++;
    }
    if (ctn)
    (ccChain + i)->iStopTimes = 0;
    else continue;
    
    (ccChain + i)->y += iFontHeight; //下次开始显示的y坐标 为当前的y坐标加上 一个字符的高度 
    //如果开始显示的y坐标减去 整个显示列的长度超过了屏幕的高度
    if ((ccChain + i)->y - (ccChain + i)->iStrLen*iFontHeight > cyScreen)
    {
    init(ccChain + i, cyScreen, (iFontWidth * 3 / 2)*i);
    }
    //链表的头 为此链表的前个元素,因为下次开始显示的时候 就相当与在整个显示列的开头添加个元素,然后在开始往上显示 
    (ccChain + i)->letters[0] = randomChar();
    }
    
    
    BitBlt(hdc, 0, 0, cxScreen, cyScreen, hdcMem, 0, 0, SRCCOPY);
    ReleaseDC(hwnd, hdc);
    return 0;
    //处理善后工作 
    case WM_KEYDOWN:
    case WM_LBUTTONDOWN:
    case WM_DESTROY:
    KillTimer(hwnd, ID_TIMER);
    DeleteObject(hBitmap);
    DeleteDC(hdcMem);
    free(ccChain);
    PostQuitMessage(0);
    return 0;
    }
    
     
    
    
    return DefWindowProc(hwnd, message, wParam, lParam);
    
    }
    
    int main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    std::locale::global(std::locale(""));
    setlocale(LC_CTYPE, "");
    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;
    }
    

      

    版本2

    //数字流星雨   作者:Wicrecend
    #include "stdafx.h"
    #include <windows.h>
    #include <locale>
    #include <exception>
    #include <deque>
    
    using namespace std;
    
    #pragma comment (lib,"User32.lib")
    #pragma comment (lib,"Gdi32.lib")
    
    #define USER_INF _T("    作制 言峰")
    #define ID_TIMER    1 
    #define STRMAXLEN  25 //一个显示列的最大长度 
    #define STRMINLEN  8  //一个显示列的最小长度
    #pragma comment ( linker, "/subsystem:windows /entry:mainCRTStartup" ) //去除启动或退出程序时黑框
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    class CharColumn
    {
    public:
    	CharColumn() : x(0),y(0), iStrLen(0), isUserInfo(false),
    		iStopTimes(0), iMustStopTimes(0)
    	{
    
    	}
    	~CharColumn(){}
    	int initNormal(int cyScreen, int cx) {
    		iStrLen = rand() % (STRMAXLEN - STRMINLEN) + STRMINLEN; //显示列的长度 
    		x = cx + 3;        //显示列的开始显示的x坐标 
    		y = rand() % 3 ? rand() % cyScreen : 0; //显示列的开始显示的y坐标 
    		iMustStopTimes = rand() % 6;
    		iStopTimes = 0;
    
    		for (int i = 0; i < iStrLen; i++)
    		{
    			dequeLetters.push_back(randomChar());
    		}
    		return 0;
    	}
    	int initUserInfo(int cyScreen, int cx) {
    		iStrLen = rand() % (STRMAXLEN - STRMINLEN) + STRMINLEN; //显示列的长度 
    		iStrLen = sizeof(USER_INF) / sizeof(TCHAR) - 1;
    		x = cx + 3;        //显示列的开始显示的x坐标 
    		y = rand() % 3 ? rand() % cyScreen : 0; //显示列的开始显示的y坐标 
    		iMustStopTimes = rand() % 6;
    		iStopTimes = 0;
    		TCHAR* str = USER_INF;
    		for (int i = 0; i < iStrLen; i++)
    		{
    			dequeLetters.push_back(*(str+i));
    		}
    		isUserInfo = true;
    		return 0;
    
    	}
    
    	int init(int cyScreen, int cx) {
    		iNum++;
    		if (iNum % 5)
    		{
    			return initNormal(cyScreen,cx);
    		}
    		return initUserInfo(cyScreen, cx);
    	
    	}
    	TCHAR randomChar() //随机字符产生函数 
    	{
    		return (TCHAR)(rand() % (126 - 33) + 33); //33到126之间 
    	}
    	static int iNum;
    	bool isUserInfo;
    	deque<TCHAR> dequeLetters;
    	int x, y, iStrLen; //显示列的开始显示的x,y坐标,iStrLen是这个列的长度 
    	int iStopTimes, iMustStopTimes;
    };
    int CharColumn::iNum = 0;
    
    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;
    }
    
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC          hdc;
    	//ctn 用来确定一个显示链是否 向下前进,如果等待次数超过必须等待的次数,ctn就代表要向下前进 
    	int i, j, temp, ctn; //j为一个显示链中除链表头外的在屏幕上显示的y坐标,temp绿色过度到黑色之用 
    	static  HDC hdcMem;
    	HFONT    hFont;
    	static  HBITMAP hBitmap;
    	static  int cxScreen, cyScreen; //屏幕的宽度 高度. 
    	static  int iFontWidth = 13, iFontHeight = 17, iColumnCount; //字体的宽度 高度, 列数 
    	static  CharColumn *ccChain;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		cxScreen = GetSystemMetrics(SM_CXSCREEN); //屏幕宽度 
    		cyScreen = GetSystemMetrics(SM_CYSCREEN);
    		SetTimer(hwnd, ID_TIMER, 20, 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 * 3 / 2); //屏幕所显示字母雨的列数
    
    		ccChain = new  CharColumn[iColumnCount];
    		for (i = 0; i<iColumnCount; i++)
    		{
    			ccChain[i].init(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++)
    		{
    			int index = 0;
    			ctn = ccChain[i].iStopTimes++ >ccChain[i].iMustStopTimes;
    			SetTextColor(hdcMem, RGB(255, 255, 255));
    			TextOut(hdcMem, ccChain[i].x, ccChain[i].y, &(ccChain[i].dequeLetters[index]), 1);
    			j = ccChain[i].y;
    			index++;
    			temp = 0; //temp绿色过度到黑色之用 
    			while (index < ccChain[i].iStrLen)
    			{
    				SetTextColor(hdcMem, RGB(0, 255 - (255 * (temp++) / (ccChain + i)->iStrLen), 0));
    				TextOut(hdcMem, (ccChain + i)->x, j -= iFontHeight, &( ccChain[i].dequeLetters[index] ), 1);
    				index++;
    			}
    			if (ctn)
    				(ccChain + i)->iStopTimes = 0;
    			else continue;
    			ccChain[i].y += iFontHeight;
    			if ( ccChain[i].y - ccChain[i].iStrLen*iFontHeight > cyScreen)
    			{
    				ccChain[i].dequeLetters.clear();
    				ccChain[i].init(cyScreen, (iFontWidth * 3 / 2)*i);
    			}
    			if (ccChain[i].isUserInfo)
    			{
    				TCHAR l = ccChain[i].dequeLetters.back();   
    				ccChain[i].dequeLetters.pop_back();
    				ccChain[i].dequeLetters.push_front(l);
    			}
    			else
    			{
    				ccChain[i].dequeLetters.push_front(ccChain[i].randomChar());
    				ccChain[i].dequeLetters.pop_back();
    			}
    			
    		}
    		BitBlt(hdc, 0, 0, cxScreen, cyScreen, hdcMem, 0, 0, SRCCOPY);
    		ReleaseDC(hwnd, hdc);
    		return 0;
    
    	case WM_RBUTTONDOWN:
    	case WM_RBUTTONUP:
    	case WM_KEYDOWN:
    	case WM_LBUTTONDOWN:
    	case WM_DESTROY:
    		KillTimer(hwnd, ID_TIMER);
    		DeleteObject(hBitmap);
    		DeleteDC(hdcMem);
    		delete[] ccChain;
    		PostQuitMessage(0);
    		return 0;
    	}
    
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

      

  • 相关阅读:
    Linux下安装nginx
    MySQL基础
    win10 安装MySQL 5.7.27
    Java IO之File
    java并发编程之ThreadLocal
    原生JS 的60秒倒计时!
    vueX 配合路由导航配置动态路由
    JS获取 当前时间是本年的第几天? 第几周?
    vue书写echarts 100px大小问题
    VUE 父组件与子组件双向数据绑定的方法 做弹框绑定列表页数据的举例
  • 原文地址:https://www.cnblogs.com/itdef/p/5685711.html
Copyright © 2020-2023  润新知