共有回帖数 0 个
-
纯C WINSDK
在XP SP3下编译通过,贴上代码
-------------------------------------------------------------------
#include "windows.h"
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"gdi32.lib")
const int Matrix_Width=300;
const int Matrix_Height=200;
typedef struct _MATRIX_COLUMN
{
BOOL bActive;
int nCounter;
int nCounterMax;
char prev;
}MATRIX_COLUMN,*PMATRIX_COLUMN;
#define GET_RANDOM(min,max) ((rand()%(int)(((max)+1)-(min)))+(min))
LPCTSTR szClassName="Matrix";
HDC hMemDC=NULL;
HBITMAP hMemBitmap=NULL;
HGDIOBJ pBitmapOld=NULL;
HGDIOBJ pFontOld=NULL;
HFONT hFont=NULL;
int nTextWidth,nTextHeight;
int nCols,nRows;
int nActiveColumns=0;
PMATRIX_COLUMN pMatrixColumns=NULL;
void Matrix_OnCreate(HWND hwnd)
{
HDC hdc;
RECT rcClient;
SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME);
hdc=GetDC(hwnd);
if(hdc)
{
hMemDC=CreateCompatibleDC(hdc);
if(hMemDC)
{
TEXTMETRIC tm;
hFont=CreateFont(14,0,0,0,FW_BOLD,FALSE, FALSE, 0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS, "Courier");
hMemBitmap=CreateCompatibleBitmap(hdc,Matrix_Width,Matrix_Height);
pBitmapOld=SelectObject(hMemDC,hMemBitmap);
pFontOld=SelectObject(hMemDC,hFont);
GetTextMetrics(hMemDC,&tm);
nTextWidth=tm.tmAveCharWidth+8;
nTextHeight= tm.tmHeight;
nCols=Matrix_Width/nTextWidth+1;
nRows=Matrix_Height/nTextHeight+1;
pMatrixColumns=(PMATRIX_COLUMN)malloc(sizeof(MATRIX_COLUMN)*nCols);
if(pMatrixColumns) RtlZeroMemory(pMatrixColumns,sizeof(MATRIX_COLUMN)*nCols);
SetTimer(hwnd,1,80,NULL);
}
ReleaseDC(hwnd,hdc);
}
GetClientRect(hwnd,&rcClient);
InvalidateRect(hwnd,&rcClient,FALSE);
}
void Matrix_OnPaint(HWND hwnd)
{
if(pBitmapOld)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hwnd,&ps);
BitBlt(hdc,0,0,Matrix_Width,Matrix_Height,hMemDC,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
}
}
void Matrix_InitBackgroundCharacters(int col)
{
const int bottomOffset = 3;
pMatrixColumns[col].nCounter = 0;
if(GET_RANDOM(1,2) == 1)
pMatrixColumns[col].nCounter=GET_RANDOM(0,nRows-bottomOffset);
pMatrixColumns[col].nCounterMax=nRows;
if(GET_RANDOM(1,2)==1)
{
pMatrixColumns[col].nCounterMax=pMatrixColumns[col].nCounter+GET_RANDOM(bottomOffset,nRows-pMatrixColumns[col].nCounter);
if(pMatrixColumns[col].nCounterMax nRows)
pMatrixColumns[col].nCounterMax=nRows;
}
pMatrixColumns[col].prev=(GET_RANDOM(1,5)==1?' ':GET_RANDOM('a', 'z'));
}
void Matrix_DrawActiveString(HDC hdc,int row,int col,char* str,int len,COLORREF color)
{
if (len 0)
{
SIZE size;
RECT r;
GetTextExtentPoint32(hdc,str,len,&size);
r.left=col*nTextWidth,r.top=row*nTextHeight;
r.right=(col+len)*nTextWidth,r.bottom=(row+1)*nTextHeight;
if(len 1)
r.right=r.left+size.cx;
if(len == 1 && str[0]==0x01)
{
SetBkColor(hdc,color);
ExtTextOut(hdc,0,0,ETO_OPAQUE,&r,NULL,0,NULL);
}
else
{
SetBkColor(hdc,RGB(0,0,0));
ExtTextOut(hdc,0,0,ETO_OPAQUE,&r,NULL,0,NULL);
SetTextColor(hdc,color);
TextOut(hdc,col*nTextWidth + (len1?0:(nTextWidth - size.cx)/2),row * nTextHeight,str,len);
}
}
}
void Matrix_DrawActiveBackgroundChar(int col)
{
if (pMatrixColumns[col].prev != ' ')
pMatrixColumns[col].prev=GET_RANDOM('a', 'z');
Matrix_DrawActiveString(hMemDC,pMatrixColumns[col].nCounter,col,&pMatrixColumns[col].prev,1,RGB(0,210,0));
}
void Matrix_DrawFadedBackgroundChar(int col)
{
int row=pMatrixColumns[col].nCounter-1;
SIZE size;
GetTextExtentPoint32(hMemDC,&pMatrixColumns[col].prev,1,&size);
SetTextColor(hMemDC,RGB(0,GET_RANDOM(60,100),0));
TextOut(hMemDC,col * nTextWidth+(nTextWidth - size.cx)/2,row * nTextHeight,&pMatrixColumns[col].prev,1);
}
void Matrix_UpdateBackground()
{
int i;
if(nActiveColumns nCols)
{
int nStartColumn,nSafetyCounter = 0;
do
{
nStartColumn = rand()%nCols;
nSafetyCounter++;
if(nSafetyCounter nCols)
break;
}
while(pMatrixColumns[nStartColumn].bActive);
if (!pMatrixColumns[nStartColumn].bActive)
{
pMatrixColumns[nStartColumn].bActive = TRUE;
Matrix_InitBackgroundCharacters(nStartColumn);
Matrix_DrawActiveBackgroundChar(nStartColumn);
pMatrixColumns[nStartColumn].nCounter++;
nActiveColumns++;
}
}
for(i=0;inCols;i++)
{
if (pMatrixColumns.bActive && pMatrixColumns.nCounter = pMatrixColumns.nCounterMax)
{
Matrix_DrawFadedBackgroundChar(i);
pMatrixColumns.bActive = FALSE;
nActiveColumns--;
}
else if (pMatrixColumns.bActive)
{
Matrix_DrawFadedBackgroundChar(i);
Matrix_DrawActiveBackgroundChar(i);
pMatrixColumns.nCounter++;
}
}
}
void Matrix_OnTimer(HWND hwnd,UINT nEvent)
{
switch(nEvent)
{
case 1:
if(pMatrixColumns)
{
RECT r;
Matrix_UpdateBackground();
GetClientRect(hwnd,&r);
InvalidateRect(hwnd,&r,FALSE);
}
break;
}
}
void Matrix_OnClose(HWND hwnd)
{
PostQuitMessage(0);
//
// 销毁GDI资源
if(pBitmapOld)
SelectObject(hMemDC,pBitmapOld);
if(pBitmapOld)
SelectObject(hMemDC,pFontOld);
if(hMemDC)
DeleteDC(hMemDC);
if(pMatrixColumns)
free(pMatrixColumns);
}
LRESULT CALLBACK MatrixWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
Matrix_OnCreate(hwnd);
break;
case WM_PAINT:
Matrix_OnPaint(hwnd);
break;
case WM_TIMER:
Matrix_OnTimer(hwnd,(UINT)wParam);
break;
case WM_ERASEBKGND:
return TRUE;
case WM_CLOSE:
Matrix_OnClose(hwnd);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
WNDCLASSEX wcex;
HWND hwnd;
MSG message;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)MatrixWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon =
wcex.hCursor = NULL;
wcex.hbrBackground = GetStockObject(BLACK_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szClassName;
wcex.hIconSm = NULL;
srand((unsigned int)time(NULL));
RegisterClassEx(&wcex);
hwnd=CreateWindow(szClassName,szClassName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,Matrix_Width,Matrix_Height,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOW);
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return 0;
}
楼主 2015-12-18 13:34 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知