¿Código fuente del programa C Meteor Shower?
#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 ; p>
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, p>
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)
{ p>
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!