Red de conocimiento informático - Consumibles informáticos - Cómo hacer que la lluvia de texto destelle en The Matrix

Cómo hacer que la lluvia de texto destelle en The Matrix

¿Se puede utilizar la programación en lenguaje C para lograr el efecto de lluvia de texto de piratas informáticos? . .

El efecto es el siguiente:

El código es el siguiente, ¿se pasa la compilación de vc?. .

#include?lt;windows.hgt;?

#define?ID_TIMER1?

#define?STRMAXLEN?25?//El valor máximo de un ¿Longitud de la columna de visualización?

#define?STRMINLEN?8?//¿Longitud mínima de una columna de visualización?

LRESULT?CALLBACK?WndProc?(HWND,?UINT,?WPARAM,? LPARAM) ?;?

/////////////////////////////////////// //// ////////////////////////////?

////////// /////// //////////////////////////////////////////// /////////// ?

typedef?struct?tagCharChain?// ¿El conjunto se trata como una columna de visualización en la pantalla? ¿Esta es una lista bidireccional?

{?

struct?tagCharChain? *prev;?//¿El elemento anterior de la lista enlazada?

TCHAR?ch;?//Un carácter en una pantalla column?

struct?tagCharChain?*next;?/ /¿El último elemento de la lista enlazada?

}CharChain,?*pCharChain;?

typedef ?struct?tagCharColumn?

{?

CharChain?*head,?*current,?*point;?

int?x,?y,? iStrLen;?//Muestra las coordenadas x, y de la columna inicial, iStrLen es esta columna ¿La longitud de?

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")?; ?

HWNDhwnd?;?

MSGmsg?;?

WNDCLASSwndclass? ;?

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)?

H)?;?

wndclass.lpszMenuName?=?NULL?;?

wndclass.lpszClassName=?szAppName?;?

if(!RegisterClass? (amp; wndclass))?

{?

MessageBox?(NULL,?TEXT?("¡Este programa debe ejecutarse en 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)?;?//¿Maximizar visualización?

UpdateWindow?(hwnd)?;?

ShowCursor(FALSE);?//¿Ocultar el cursor del mouse?

srand?((int)?GetCurrentTime?()? //¿Inicializar el generador de números aleatorios?

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

{?

¿TranslateMessage?(amp;msg)?;?

¿DispatchMessage?(amp;msg)?;?

}?

ShowCursor(TRUE); ?//¿Mostrar cursor del mouse?

return?msg.wParam?;?

}?

TCHAR?randomChar()?//Caracteres aleatorios Generar función ?

{?

return?(TCHAR)(rand()(126-33) 33);?//¿Entre 33 y 126?

} ?

int?init(CharColumn?*cc, ?int?cyScreen, ?int?x)?//¿Inicialización?

{?

int? j;?

cc-gt;iStrLen?=?rand()(STRMAXLEN-STRMINLEN)? ?STRMINLEN;?//¿Mostrar la longitud de la columna?

cc- gt ; La coordenada y de la columna de visualización donde comienza la visualización /p>

cc-gt;head?=?cc-gt;current?=?

(pCharChain)calloc(cc-gt; ;iStrLen,?sizeof(CharChain));?// ¿Generar columna de visualización?

for(j=0;?jlt;cc-gt;iStr

Len-1;?j )?

{?

cc-gt;current-gt;prev?=?cc-gt;point;?//cc-gt;point ¿El elemento anterior de una columna de visualización?

cc-gt;current-gt;ch?=?'\0';?

cc-gt;current-gt;next? =?cc-gt;current 1;?//cc-gt;current 1¿El último elemento de una columna de visualización?

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

}?

cc-gt;actual-gt;prev?=? -gt;point;?//¿Último nodo?

cc-gt;current-gt;ch?=?'\0';?

cc-gt;current -gt ; next?=?cc-gt;head;? cc-gt;head-gt;prev=?cc-gt;current;?//¿El anterior del nodo principal es el último elemento de esta cadena?

cc-gt; current?=?cc-gt; point?=?cc-gt; head;?//Para liberar la memoria solicitada, ¿es necesario utilizar current como parámetro?

cc-gt ;head-gt;ch?=?randomChar();?//?¿Rellenar los elementos en el encabezado de la lista enlazada?

return?0;?

}?

LRESULT?CALLBACK?WndProc?(HWND?hwnd, ?UINT?message, ?WPARAM?wParam, ?LPARAM?lParam)?

{?HDC?hdc ?;? //ctn?use Para determinar si una cadena de visualización avanza hacia abajo. Si el número de esperas excede el número de veces que se debe esperar, ctn significa que va hacia abajo. temp,?ctn;?//j es una cadena de visualización. La coordenada y que se muestra en la pantalla, excepto el encabezado de la lista vinculada, la temperatura cambia de verde a negro. static?HDC?hdcMem;? static?int?cxScreen,?cyScreen;?// El ancho y alto de la pantalla.? static?int?iFontWidth=10,?iFontHeight=15,?iColumnCount;?//El ancho?alto de la fuente,? ¿número de columnas? ¿Estático?CharColumn?*ccChain;?switch?(mensaje)? {?

case?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);?

//¿Crear fuente?

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);?//¿Establecer el modo de fondo en?Transparent?

iColumnCount?=?cxScreen/(iFontWidth*3/2);? //¿El número de columnas de letras que se muestran en la pantalla?

ccChain?=?(pCharColumn)calloc(iColumnCount,?sizeof(CharColumn));?

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

{?

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

}?

retorno?0?;?

caso?WM_TIMER:?

hdc?=?GetDC(hwnd);?

PatBlt?(hdcMem,?0,?0,?cxScreen,?cyScreen,?BLACKNESS)?;? //¿Pintar la imagen del dispositivo de memoria en negro?

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

{?

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

//?

(ccChain i)-gt;point?=?(ccChain i)-gt;head;?//point se utiliza para recorrer toda la pantalla column?

p>

//El primer carácter se muestra como ?white?

SetTextColor(hdcMem,?RGB(255,?255,?255));? TextOut(hdcMem,?(ccChain i) -gt; x, ?(ccChain i)-gt; y, ?amp; ((ccChain i)-gt; punto-gt; ch), ?1); gt;y;?

(ccChain i)-gt;point?=?(ccChain i)-gt;point-gt;next;?

// Recorre toda la pantalla y mostrar los caracteres en esta columna de visualización de abajo hacia arriba?

temp?=?0?;?//¿temp se usa para la transición de verde a negro?

while( (ccChain i)-gt;punto?=?(ccChain i)-gt;cabeza?amp;amp;?(ccChain i)-gt;punto

t-gt;ch)?

{?

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

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

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

}?

if(ctn)?

(ccChain i)-gt;iStopTimes?=?0?;?

else?continue;?

(ccChain i)-gt;y? =?iFontHeight;?//¿La coordenada y que se mostrará la próxima vez es la coordenada y actual más la altura de un carácter?

//Si es así comienza ¿La coordenada y mostrada menos? ¿La longitud de toda la columna de visualización excede la altura de la pantalla?

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

{?

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

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

}?

//El encabezado de la lista enlazada es el elemento anterior de la lista enlazada, porque se mostrará la próxima vez. ¿Es equivalente a agregar un elemento al principio de toda la columna de visualización y luego mostrarlo hacia arriba?

(ccChain i)-gt;=?(ccChain; i)-gt;head-gt; anterior;?

(ccChain i)-gt;head-gt;ch?=?randomChar();?

}? p>

BitBlt(hdc,?0,?0,?cxScreen,?cyScreen,?hdcMem,?0,?0,?SRCCOPY);?

ReleaseDC(hwnd,?hdc); ?

devolver ?0;?

caso?WM_RBUTTONDOWN:?

KillTimer?(hwnd, ?ID_TIMER)?;?

devolver ?0;?

caso?WM_RBUTTONUP:?

¿SetTimer?(hwnd,?ID_TIMER,?10,?NULL)?;?

regresar? 0;?

//¿Manejar las consecuencias?

caso?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(ccC

hain);?

¿PostQuitMessage?(0)?;?

¿regresar?0?;?

}?

regresar? ¿DefWindowProc?(hwnd,?message,?wParam,?lParam)?;?

}