⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snow.cpp

📁 迷宫算法.rar
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////////
//	Snow.cpp
//	Date: 2004-8-5 21:16
//	A moving ball.
//
///////////////////////////////////////////////////////////////////////////////

#include <assert.h>
#include "Snow.h"

#define	ID_TIMER	1

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

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, char* cmdParam, int cmdShow )
{
	char className[] = "Snow";
	MovingBall MovingBallClass( WindowsProcedure, className, hInst );
	MovingBallClass.Register();

	WinMaker win( "Snow", className, hInst );
	win.Show( cmdShow );

	MSG msg;
	int status;
	
	while( ( status = ::GetMessage( & msg, NULL, 0, 0 ) ) != 0 )
	{
		if ( status == -1 )
			return -1;
		::TranslateMessage( & msg );
		::DispatchMessage( & msg );
	}

	return msg.wParam;
}

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

MovingBall::MovingBall( WNDPROC wndProc, const char* className, HINSTANCE hInstance )
{
	_class.style = 0;
	_class.lpfnWndProc = wndProc;		// Windows procedure: mandatory
	_class.cbClsExtra = 0;
	_class.cbWndExtra = 0;
	_class.hInstance = hInstance;
	_class.hIcon = 0;			// Owner of class: mandatory
	_class.hCursor = ::LoadCursor( 0, IDC_ARROW );
	_class.hbrBackground = (HBRUSH) ( COLOR_WINDOW + 1 );	// Optional
	_class.lpszMenuName = 0;
	_class.lpszClassName = className;	// Mandatory	
}

WinMaker::WinMaker( const char* szCaption, const char* className, HINSTANCE hInstance )
{
	DWORD	dwStyle = WS_OVERLAPPEDWINDOW;
	dwStyle &= ~WS_SIZEBOX;
	dwStyle &= ~WS_MAXIMIZEBOX;
	dwStyle &= ~WS_MINIMIZEBOX;

	_hWnd = ::CreateWindow(
			className,		// Name of a registered window class
			szCaption,		// Window caption
			dwStyle,		// Window style
			CW_USEDEFAULT,		// x position
			CW_USEDEFAULT,		// y position
			787,			// width
			590,			// height
			0,			// Handle to parent window
			0,			// Handle to menu
			hInstance,		// Application instance
			0 );			// Window creation data
}

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

LRESULT CALLBACK WindowsProcedure( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam )
{
	static	HBITMAP hbmpBkground = NULL,
			hbmpSnow = NULL,
			hbmpMask = NULL;
	static 	Snow	snowFlakes[ 80 ];
	static	int	countSnow = 0;
	static	int	cxClient, cyClient;
	
	HDC		hdc = NULL,
			hdcMem = NULL;
	HINSTANCE	hInst = NULL;

	switch( uMessage )
	{
		case WM_CREATE:
			hInst = ( (LPCREATESTRUCT) lParam )->hInstance;
			assert( hInst );

			hbmpBkground = ::LoadBitmap( hInst, TEXT( "bground" ) );
			assert( hbmpBkground );
			hbmpSnow = ::LoadBitmap( hInst, TEXT( "snow" ) );
			assert( hbmpSnow );
			hbmpMask = ::LoadBitmap( hInst, TEXT( "mask" ) );			
			assert( hbmpMask );

			::SetTimer( hWnd, ID_TIMER, 80, NULL );
			return 0;

		case WM_SIZE:
			cxClient = LOWORD( lParam );
			cyClient = HIWORD( lParam );
			return 0;

		case WM_TIMER:
			if ( countSnow < 80 )
			{
				snowFlakes[ countSnow ].xPos = rand() % cxClient;
				snowFlakes[ countSnow ].yPos = 0;
				snowFlakes[ countSnow ].bIsExist = TRUE;
				countSnow++;
			}

			if ( countSnow == 80 )
				countSnow = 0;

			hdc = ::GetDC( hWnd );
			assert( hdc );
			hdcMem = ::CreateCompatibleDC( hdc );
			assert( hdcMem );

			::SelectObject( hdcMem, hbmpBkground );
			::BitBlt(
				hdc,
				0, 0, 
				cxClient, cyClient,
				hdcMem,
				0, 0,
				SRCCOPY	);

			int i;
			for ( i = 0; i < 80; i++ )
			{
				if ( snowFlakes[ i ].bIsExist )
				{
					::SelectObject( hdcMem, hbmpMask );
					::BitBlt(
						hdc,
						snowFlakes[ i ].xPos, snowFlakes[ i ].yPos,
						20, 20,
						hdcMem,
						0, 0,
						SRCAND );

					::SelectObject( hdcMem, hbmpSnow );
					::BitBlt(
						hdc,
						snowFlakes[ i ].xPos, snowFlakes[ i ].yPos,
						20, 20,
						hdcMem,
						0, 0,
						SRCPAINT );

					if ( rand() % 2 == 0 )
						snowFlakes[ i ].xPos += 3;
					else
						snowFlakes[ i ].xPos -= 3;

					snowFlakes[ i ].yPos += 10;

					if ( snowFlakes[ i ].yPos > cyClient )
					{
						snowFlakes[ i ].xPos = rand() % cxClient;
						snowFlakes[ i ].yPos = 0;
					}
				}
			}

			::ReleaseDC( hWnd, hdc );
			::DeleteDC( hdcMem );
			return 0;
			
		case WM_DESTROY:
			::DeleteObject( hbmpBkground );
			::DeleteObject( hbmpSnow );
			::DeleteObject( hbmpMask );
			::KillTimer( hWnd, ID_TIMER );
			::PostQuitMessage( 0 );
			return 0;
	}

	return ::DefWindowProc( hWnd, uMessage, wParam, lParam );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -