Red de conocimiento informático - Computadora portátil - ¿Código fuente del programa C Meteor Shower?

¿Código fuente del programa C Meteor Shower?

#include lt; windows.hgt; #define ID_TIMER 1

#define STRMAXLEN 25 //Muestra la longitud máxima de la columna

#define STRMINLEN 8 //Muestra la longitud mínima de la columna LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

///////////////////////////// //// /////////////////////////////////////

/// ////// ///////////////////////////////////////////// ////////// ///////

typedef struct tagCharChain // Toda la estructura se considera como una columna de visualización en la pantalla, es una lista de dos vías

{

struct tagCharChain *prev; //El elemento anterior de la cadena

TCHAR ch //Muestra un carácter en la columna

struct tagCharChain *next;

}CharChain, *pCharChain; typedef struct tagCharColumn

{

CharChain *head, *current, *point

int x, y, iStrLen; // Muestra las coordenadas x, y del inicio de la columna, iStrLen es la longitud de la columna

int iStopTimes, iMustStopTimes // El número de veces que se ha detenido y el número de veces que se debe detener, el número de veces que se debe detener es aleatorio

}CharColumn, *pCharColumn int main(HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[ ] = TEXT ("matriz");

HWND hwnd; /p>

Mensaje MSG;

WNDCLASS wndclass; wndclass.

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); LoadCursor (NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);

wndclass.lpszMenuName =

wndclass.lpszClassName = szAppName; if(!RegisterClass (amp; wndclass))

{

MessageBox (NULL, TEXT ("Este programa debe ejecutarse

bajo el Nuevo Testamento! "), szAppName, MB_ICONERROR);

Devuelve 0;

} hwnd = CreateWindow (szAppName, NULL,

WS_DLGFRAME | WS_THICKFRAME | WS_POPUP,

0, 0,

GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),

NULL, NULL, hInstance,

ShowWindow (); hwnd, SW_ SHOWMAXIMIZED);

UpdateWindow (hwnd);

ShowCursor(FALSE); // Ocultar puntero del mouse

srand ((int) GetCurrentTime () ) ; // Inicializa el generador de números aleatorios

while (GetMessage (amp; msg, NULL, 0, 0))

{

TranslateMessage (amp; msg);

DispatchMessage (amp; msg);

}

Translate(TRUE); //Configurar la hora actual > ShowCursor(TRUE); / Mostrar el cursor del mouse

return msg.wParam;

}TCHAR randomChar() // Función de generación aleatoria de caracteres

{

return (TCHAR)(rand()(126-33) 33); //entre 33 y 126

} int init(CharColumn *cc, int cyScreen, int x) //inicializar

{

int j;

cc-gt; iStrLen = rand()(STRMAXLEN- gt; iMustStopTimes = rand()6;

cc- gt; iStopTimes = 0;

cc-gt; cabeza = cc-gt; actual =

(pCharChain)calloc(cc-gt; iStrLen, sizeof(CharChain)); /Muestra la coordenada y del inicio de la columna.

sizeof(CharChain)); //generar columna de visualización

for(j=0; jlt; cc-gt; iStrLen-1; j )

{

cc-gt; current-gt; prev = cc-gt; point; //cc-gt.point muestra el elemento anterior de la columna

cc-gt; 0 ';

cc-gt;current-gt;next = cc-gt;current 1; // cc-gt;current 1 muestra el siguiente elemento de la columna

cc-gt;point = cc -gt;actual; //cc-gt;punto = cc-gt;actual; cc-gt;actual;

}

cc-gt;actual-gt; ch = '\0';

cc-gt; actual-gt; siguiente = cc-gt; actual 1.

cc-gt ; actual -gt;prev = cc-gt;punto; //último nodo

cc-gt;current-gt;ch = '\0'; current- gt; next = cc-gt; head; cc-gt; head-gt; prev = cc-gt; //el nodo anterior del encabezado uno es el último elemento de la cadena gt; point = cc-gt; head; // libera la memoria solicitada usando current como parámetro

cc-gt; ch = randomChar(); con los elementos de la cadena

return 0; cc-gt; next = cc-gt; cc-gt; prev = cc-gt; >

return 0;

}LRESULT CALLBACK WndProc (HWND hwnd, mensaje UINT, WPARAM wParam, LPARAM lParam)

{

HDC

//ctn se utiliza para determinar si la cadena de visualización se mueve hacia abajo. Si el número de esperas excede el número de veces que se debe esperar, ctn indica que se mueve hacia abajo

int i, j. , temp, ctn;

p>

HDC estático hdcMem;

HFONT hFont;

caso WM_CREATE:

cxScreen = GetSystemMetrics(SM_CXSCREEN ); //Ancho de pantalla

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, 0,

DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,

DRAFT_QUALITY, FIXED_PITCH | FF_ SWISS, TEXT("Fixedsys"));

SelectObject(hdcMem, hFont);

DeleteObject (hFont); (hdcMem, TRANSPARENT); //Establece el modo de fondo en transparente

iColumnCount = cxScreen/(iFontWidth*3/2);

for(i=0; ilt; iColumnCount; i )

{

init(ccChain i, cyScreen, (iFontWidth*3/2)*i

}

devolver 0.

Devuelve 0; case WM_TIMER:

hdc = GetDC(hwnd);

PatBlt (hdcMem, 0, 0, cxScreen, cyScreen, BLACKNESS); imagen del dispositivo negro

for(i=0; ilt; iColumnCount; i )

{

ctn = (ccChain i)-gt; iStopTimes gt; ccChain i)-gt; iMustStopTimes;

//

(ccChain i)-gt; point = (ccChain i)-gt //el punto se utiliza para atravesar el toda la columna de visualización

// El primer carácter se muestra en blanco

SetTextColor(hdcMem, RGB(255, 255, 255));

TextOut(hdcMem , ( ccChain i)-gt; -gt;

(ccChain i)-gt; punto = (ccChain i)-gt.point-gt; / Recorre toda la columna de visualización, comenzando desde abajo. Vaya a la parte superior para mostrar los caracteres en la columna de visualización

temp = 0; //temp green cubre negro

while(( ccChain i)-gt; punto != (ccChain i)- gt; cabeza & (ccChain i)-gt; punto-gt;

{

SetTextColor(hdcMem) , RGB(0, 255-(255*(temp )/(ccChain i)) -gt;iStrLen), 0));

TextOut(hdcMem, (ccChain i)-gt;x, j -=iFontHeight, amp; ((ccChain i)- gt; punto-gt; ch), 1));

(ccChain i) -gt; punto = (ccChain i)-gt; gt; siguiente;

}

if(ctn)

(ccChain i)-gt; iStopTimes = 0

(ccChain i) -gt;y = iFontHeight;

//La coordenada y que comienza a mostrarse la próxima vez es la coordenada y actual más la altura de un carácter

//Si la coordenada y que comienza a mostrarse menos La longitud de toda la columna de visualización es más larga que la altura de la pantalla

if ( ( ccChain i)-gt; y- ( ccChain i)-gt; iStrLen*iFontHeight gt; cyScreen)

{

libre( (ccChain i)-gt; actual

init(ccChain); yo, cyScre

es, (iFontWidth*3/2)*i

}

La cabeza de la cadena. SRCCOPY);

ReleaseDC(hwnd, hdc);

devuelve 0; caso WM_RBUTTONDOWN:

KillTimer (hwnd, ID_TIMER); > return 0; case WM_ RBUTTONUP:

SetTimer (hwnd, ID_TIMER, 10, NULL);

return 0 // Manejar las consecuencias

case WM_KEYDOWN; :

caso WM_LBUTTONDOWN:

caso WM_DESTROY:

KillTimer (hwnd, ID_TIMER);

DeleteObject(hBitmap); >

DeleteDC(hdcMem);

for(i=0; ilt. iColumnCount; i )

{

gratis( (ccChain i)- gt; actual);

}

gratis (ccChain);

PostQuitMessage (0); >

}

Devuelve Definición.

return DefWindowProc (hwnd, message, wParam, lParam);

}

A continuación se muestra el código de Digital Rain, ¡mira si te ayuda!