📄 ripple.cpp
字号:
//
// ___________水波屏保 例子程序__________________
//
// 天恒工作室 唐洁
//
// 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 + -