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

📄 ripple.cpp

📁 《Visual C/C++图形图像与游戏编程典型实例解析》所有源代码。特别适合初学者。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
//	___________水波屏保  例子程序__________________
//
//				天恒工作室  唐洁
//
//  Email   : tj@ahpost.com.cn或flyingtjf@sina.com
//
//					      2004年12月9日
//
//  说明:
//      此源程序可作为开发爱好者业余收藏和研究,
//      禁止将其作为任何形式的商业用途。
//
//	! 要正确编译这个程序,你必须拥有DirectX SDK !
// ________________________________________________
//
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ddraw.h>
#include <math.h>

#include "resource.h"
#include "ddutil.h"

#define TITLE	"水波屏保——例子程序"	//窗口标题

LPDIRECTDRAW            lpDD;           // DirectDraw对象
LPDIRECTDRAWSURFACE     lpDDSPrimary;   // 主页面
LPDIRECTDRAWSURFACE     lpDDSPic1;      // 离屏页面1
LPDIRECTDRAWSURFACE     lpDDSPic2;      // 离屏页面1
LPDIRECTDRAWCLIPPER		lpClipper;		//DirectDrawClipper对象

HINSTANCE	hInst;				//应用程序实例句柄
HWND		hwndwin=NULL;		//窗口模式窗口
HWND		hwndful=NULL;		//全屏模式窗口
BOOL		fullscreen=FALSE;	//全屏模式
BOOL		bActive;			//应用程序是否活跃?

int BACKWIDTH=320;		//背景图宽度
int BACKHEIGHT=240;		//背景图高度

short * buf1;			//波能数据缓冲区
short * buf2;			//波能数据缓冲区

//效果
BOOL rain=false;		//下雨
BOOL upripper=true;		//上波源
BOOL downripper=true;	//下波源

//函数声明
BOOL InitSurfaces( void );
void UpdateFrame( void );
void MakeRect(RECT *rect, short left, short top, short right, short bottom);
void DropStone(int x, int y, int stonesize, int stoneweight);
void ShowAbout(void);
HWND ChooseWnd();
void AdjustWindowSize(HWND hwnd);
BOOL InitPreviewWindow( HINSTANCE hInstance, int nCmdShow );
void Say ( LPCSTR word );


//*******************************************************************
//函数:FreeObject
//功能:释放我们用过的所有DirectDraw对象
//*******************************************************************
void FreeObjects( void )
{
    if( lpDD != NULL )//释放DirectDraw对象
    {
        if( lpDDSPrimary != NULL )//释放主页面。
        {
            lpDDSPrimary->Release();
            lpDDSPrimary = NULL;
        }
        if( lpDDSPic1 != NULL )//释放离屏页面。
        {
            lpDDSPic1->Release();
            lpDDSPic1 = NULL;
        }
        if( lpDDSPic2 != NULL )
        {
            lpDDSPic2->Release();
            lpDDSPic2 = NULL;
        }
		if (lpClipper!=NULL)
		{
			lpClipper->Release();
			lpClipper=NULL;
		}
        lpDD->Release();
        lpDD = NULL;
    }
	delete buf1;
	delete buf2;

	DestroyWindow(hwndwin);
	DestroyWindow(hwndful);

	//退出消息循环
	PostQuitMessage( 0 );
} 

//*******************************************************************
//函数:RestoreAll
//功能:页面丢失后,恢复页面内存
//*******************************************************************
HRESULT RestoreAll( void )
{
    HRESULT     ddrval;

	//恢复主页面,这也将恢复换页链中的所有页面
    ddrval = lpDDSPrimary->Restore();
    ddrval = lpDDSPic1->Restore();
    ddrval = lpDDSPic2->Restore();

	InitSurfaces();//重新绘制页面图象
    return ddrval;
}

//*******************************************************************
//函数:WindowProc
//功能:主窗口的消息处理过程
//*******************************************************************
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, 
                            WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
    case WM_ACTIVATEAPP://应用程序激活消息
        bActive = wParam;
        break;
	case WM_LBUTTONDOWN://点击鼠标,增加波源
		int x,y;
		RECT rect;
		GetClientRect(ChooseWnd(), &rect);
		x=LOWORD(lParam)*BACKWIDTH/(rect.right-rect.left);
		y=HIWORD(lParam)*BACKHEIGHT/(rect.bottom-rect.top);
		DropStone(x, y, 3, 128);
		break;
	case WM_MOUSEMOVE://点击并移动也可增加波源
		if (wParam==MK_LBUTTON )
		{
			int x,y;
			RECT rect;
			GetClientRect(ChooseWnd(), &rect);
			x=LOWORD(lParam)*BACKWIDTH/(rect.right-rect.left);
			y=HIWORD(lParam)*BACKHEIGHT/(rect.bottom-rect.top);
			DropStone(x, y, 3, 128);
		}
		break;
    case WM_KEYDOWN://击键消息
        switch( wParam )
        {
        case VK_ESCAPE:
			if (fullscreen==TRUE)
			{
				ShowWindow( hwndwin, SW_SHOW);
				ShowWindow( hwndful, SW_HIDE);
				UpdateWindow(hwndwin);
				UpdateWindow(hwndful);

				lpClipper->SetHWnd(0, hwndwin);
				lpDDSPrimary->SetClipper(lpClipper);
				fullscreen=FALSE;
			}
            break;
		case VK_F1://显示关于信息
			ShowAbout();
			break;
        }
        break;
	case WM_CLOSE:
		FreeObjects();
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case ID_FULLSCREEN://切换显示模式
			ShowWindow( hwndful, SW_SHOW);
			ShowWindow( hwndwin, SW_HIDE);
			UpdateWindow(hwndwin);
			UpdateWindow(hwndful);
			lpClipper->SetHWnd(0, hwndful);
			lpDDSPrimary->SetClipper(lpClipper);
			fullscreen=TRUE;
			break;
		case ID_OLDSIZE://恢复原始大小
			AdjustWindowSize(ChooseWnd());
			break;
		case ID_CLOSE:
			FreeObjects();
			break;
		case ID_UP:
			upripper=!upripper;
			break;
		case ID_DOWN:
			downripper=!downripper;
			break;
		case ID_RAIN:
			rain=!rain;
			break;
		case ID_REPEAT:
			InitSurfaces();
			upripper=TRUE;
			downripper=TRUE;
			rain=FALSE;
			break;
		case ID_ABOUT:
			ShowAbout();
			break;
		}
		break;
    }

	//调用缺省的过程处理过程
    return DefWindowProc(hWnd, message, wParam, lParam);
}

//******************************************************************
//函数:InitWindow()
//功能:创建主窗口。
//******************************************************************
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
    WNDCLASS	wc1,wc2;

	wc1.style = 0;
    wc1.lpfnWndProc = WinProc;
    wc1.cbClsExtra = 0;
    wc1.cbWndExtra = 0;
    wc1.hInstance = hInstance;
    wc1.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(ID_APP)); 
    wc1.hCursor = LoadCursor( NULL, IDC_ARROW);
    wc1.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc1.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
	wc1.lpszClassName = "ripplewin";

	wc2.style = 0;
    wc2.lpfnWndProc = WinProc;
    wc2.cbClsExtra = 0;
    wc2.cbWndExtra = 0;
    wc2.hInstance = hInstance;
    wc2.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(ID_APP)); 
    wc2.hCursor = LoadCursor( NULL, IDC_ARROW);
    wc2.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc2.lpszMenuName = NULL;
	wc2.lpszClassName = "rippleful";

	RegisterClass( &wc1 );
    RegisterClass( &wc2 );
    
    hwndwin= CreateWindowEx(
		0,
		"ripplewin",
		TITLE,
		WS_OVERLAPPEDWINDOW|WS_THICKFRAME,
		0,//(GetSystemMetrics(SM_CXFULLSCREEN)-325)/2,
		0,//(GetSystemMetrics(SM_CYFULLSCREEN)-260)/2,
		10,
		10,
		NULL,
		NULL,
		hInstance,
		NULL );

    hwndful = CreateWindowEx(
		0,
		"rippleful",
		TITLE,
		WS_POPUP,
		0,0,
		GetSystemMetrics(SM_CXSCREEN),
		GetSystemMetrics(SM_CYSCREEN),
		NULL,
		NULL,
		hInstance,
		NULL );

    if (!hwndwin)	return FALSE;
	if (!hwndful)	return FALSE;

	//调整窗口的大小
	AdjustWindowSize(hwndwin);

	ShowWindow( ChooseWnd(), SW_SHOW );
    UpdateWindow( ChooseWnd() );

	return TRUE;
}

//******************************************************************
//函数:InitDDraw()
//功能:初始化DirectDraw环境,
//******************************************************************
BOOL InitDDraw(void)
{
    DDSURFACEDESC       ddsd;
    HRESULT             ddrval;

    //创建DirectDraw对象
	ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
    if( ddrval != DD_OK )
        return FALSE;

    ddrval = lpDD->SetCooperativeLevel(NULL, DDSCL_NORMAL);
    if( ddrval != DD_OK )
        return FALSE;

    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS ;

⌨️ 快捷键说明

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