📄 ddex1.cpp
字号:
/*==========================================================================
*
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
*
* File: ddex1.cpp
* Content: Direct Draw example program 1. Creates a Direct Draw
* object and then a primary surface with a back buffer.
* Slowly flips between the primary surface and the back
* buffer. Press F12 to terminate the program.
*
***************************************************************************/
#define NAME "DDExample1"
#define TITLE "Direct Draw Example 1"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <stdio.h>
#include "resource.h"
#include "gui16.h"
#define TIMER_ID 1
#define TIMER_RATE 30
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface
LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface
LPDIRECTDRAWSURFACE lpDDSZBuffer;
LPDIRECTDRAWSURFACE lpDDSEndBmp;
char* txt[80];
int lines;
BOOL bActive; // is application active?
BOOL bQuit = false;
BOOL bClear = true;
int phase = 0;
HANDLE thandle;
HWND hwnd;
CPointList p1(2000);
CPointList p2(2000);
CFaceList face(4000);
CONVERT_MATRIX3D m1,m2,m4;
POINT3D pot,pot1;
CPointList p3(200);
CPointList p4(200);
CFaceList face1(400);
CTextureList tex(10);
CONVERT_MATRIX3D m5,m6,m7,m8;
POINT3D pot2,pot3;
DWORD WINAPI demo(LPVOID lpparm);
void lineDemo1(DDSURFACEDESC* ddsd);
void lineDemo2(DDSURFACEDESC* ddsd);
void circleDemo1(DDSURFACEDESC* ddsd);
void circleDemo2(DDSURFACEDESC* ddsd);
void ellipseDemo1(DDSURFACEDESC* ddsd);
void ellipseDemo2(DDSURFACEDESC* ddsd);
void rectDemo1(DDSURFACEDESC* ddsd);
void rectDemo2(DDSURFACEDESC* ddsd);
void polygonDemo1(DDSURFACEDESC* ddsd);
void polygonDemo2(DDSURFACEDESC* ddsd);
void fsDemo1(DDSURFACEDESC* ddsd);
BOOL demo3dInit();
BOOL demo2dInit();
void clearUp();
time_t tt;
long frames,rate,k;
POINT3D potLight;
/*
* finiObjects
*
* finished with all objects we use; release them
*/
static void finiObjects( void )
{
if( lpDD != NULL )
{
if( lpDDSPrimary != NULL )
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if( lpDDSZBuffer != NULL )
{
lpDDSZBuffer->Release();
lpDDSZBuffer = NULL;
}
if( lpDDSEndBmp != NULL )
{
lpDDSEndBmp->Release();
lpDDSEndBmp = NULL;
}
lpDD->Release();
lpDD = NULL;
}
clearUp();
} /* finiObjects */
char szMsg[] = "计算机图形学算法演示 (F12 退出)";
char szMsg1[] = "按↓键前进,按↑键后退";
char szFrontMsg[][40] = { "普通直线",
"反走样直线",
"画圆",
"圆填充",
"画椭圆",
"椭圆填充",
"画矩形",
"矩形填充",
"画多边形",
"多边形填充",
"分形图",
"三维图形",
"纹理贴图",
"The End"
};
char szBackMsg[] = "计算机图形学算发演示 (F12 退出)";
long FAR PASCAL WindowProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
// PAINTSTRUCT ps;
// RECT rc;
// SIZE size;
switch( message )
{
case WM_ACTIVATEAPP:
bActive = wParam;
break;
case WM_CREATE:
break;
case WM_SETCURSOR:
SetCursor(NULL);
return TRUE;
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
case VK_F12:
bQuit = true;
while(WaitForSingleObject(thandle,200) != WAIT_OBJECT_0)
;
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case VK_DOWN:
bClear = true;
if(phase < 13)
phase++;
if(phase == 10)
bClear = false;
break;
case VK_UP:
bClear = true;
if(phase > 0)
phase--;
if(phase == 10|| phase==13)
bClear = false;
break;
}
break;
case WM_PAINT:
break;
case WM_DESTROY:
finiObjects();
PostQuitMessage( 0 );
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
} /* WindowProc */
/*
* doInit - do work required for every instance of the application:
* create the window, initialize data
*/
static BOOL doInit( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASS wc;
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
HRESULT ddrval;
HDC hdc;
char buf[256];
/*
* set up and register window class
*/
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = NULL;
wc.lpszMenuName = NAME;
wc.lpszClassName = NAME;
RegisterClass( &wc );
/*
* create a window
*/
hwnd = CreateWindowEx(
WS_EX_TOPMOST,
NAME,
TITLE,
WS_POPUP,
0, 0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL,
NULL,
hInstance,
NULL );
if( !hwnd )
{
return FALSE;
}
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
// MessageBox( hwnd, "Hello!", "", MB_OK);
/*
* create the main DirectDraw object
*/
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )
{
// Get exclusive mode
ddrval = lpDD->SetCooperativeLevel( hwnd,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if(ddrval == DD_OK )
{
ddrval = lpDD->SetDisplayMode( 640,480, 16 );
if( ddrval == DD_OK )
{
// Create the primary surface with 1 back buffer
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS |
DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval == DD_OK )
{
// Get a pointer to the back buffer
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps,
&lpDDSBack);
if( ddrval == DD_OK )
{
LOGBRUSH brush;
RECT rc;
brush.lbStyle=BS_SOLID ;
brush.lbColor=(COLORREF)0x00000000;
HBRUSH hbrush=CreateBrushIndirect(&brush);
GetClientRect(hwnd, &rc);
// draw some text.
if (lpDDSPrimary->GetDC(&hdc) == DD_OK)
{
FillRect(hdc,&rc,hbrush);
lpDDSPrimary->ReleaseDC(hdc);
}
if (lpDDSBack->GetDC(&hdc) == DD_OK)
{
FillRect(hdc,&rc,hbrush);
lpDDSBack->ReleaseDC(hdc);
}
DeleteObject(hbrush);
//Create Z buffer.
ddsd.dwFlags = DDSD_CAPS |
DDSD_WIDTH|
DDSD_HEIGHT|
DDSD_ZBUFFERBITDEPTH ;
ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY ;
ddsd.dwWidth = 640;
ddsd.dwHeight = 480;
ddsd.dwZBufferBitDepth = 16;
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSZBuffer, NULL );
if(ddrval == DD_OK)
{ lpDDSBack->AddAttachedSurface(lpDDSZBuffer);
if (demo2dInit())
if(demo3dInit())
{ frames=0;
time(&tt);
DWORD tID;
if((thandle = CreateThread(NULL,0,demo,NULL,0,&tID)) != NULL)
return TRUE;
}
}
}
}
}
}
}
wsprintf(buf, "Direct Draw Init Failed (%08lx)\n", ddrval );
MessageBox( hwnd, buf, "ERROR", MB_OK );
finiObjects();
DestroyWindow( hwnd );
return FALSE;
} /* doInit */
void clearUp()
{ for(int i=0;i<lines;i++)
delete[] txt[i];
}
#define MAX_LINE_LENTH 80
#define MAX_LINES 80
BOOL demo2dInit()
{ if(loadBitmap(&lpDDSEndBmp,"end.bmp") == FALSE)
return FALSE;
char buf[MAX_LINE_LENTH];
ifstream ifs("end.txt");
if(!ifs)
return FALSE;
lines = MAX_LINES;
for(int i=0;i<MAX_LINES;i++)
{ ifs.getline( buf,MAX_LINE_LENTH-1);
if((txt[i] = new char[strlen(buf)+1]) == NULL)
{ lines = i;
return FALSE;
}
strcpy(txt[i],buf);
if(ifs.eof())
{ lines = i+1;
break;
}
}
return TRUE;
}
BOOL demo3dInit()
{ POINT3D potp;
TRIANGLE3D trgl;
potp.x = 0, potp.y = 0, potp.z = 0;
p3.addPoint(&potp);
potp.x = 500, potp.y = 0, potp.z = 0;
p3.addPoint(&potp);
potp.x = 500, potp.y = 500, potp.z = 0;
p3.addPoint(&potp);
potp.x = 0, potp.y = 500, potp.z = 0;
p3.addPoint(&potp);
potp.x = 0, potp.y = 0, potp.z = 500;
p3.addPoint(&potp);
potp.x = 500, potp.y = 0, potp.z = 500;
p3.addPoint(&potp);
potp.x = 500, potp.y = 500, potp.z = 500;
p3.addPoint(&potp);
potp.x = 0, potp.y = 500, potp.z = 500;
p3.addPoint(&potp);
potp.x = 200, potp.y = 200, potp.z = 200;
p3.addPoint(&potp);
potp.x = 300, potp.y = 200, potp.z = 200;
p3.addPoint(&potp);
potp.x = 300, potp.y = 300, potp.z = 200;
p3.addPoint(&potp);
potp.x = 200, potp.y = 300, potp.z = 200;
p3.addPoint(&potp);
potp.x = 200, potp.y = 200, potp.z = 300;
p3.addPoint(&potp);
potp.x = 300, potp.y = 200, potp.z = 300;
p3.addPoint(&potp);
potp.x = 300, potp.y = 300, potp.z = 300;
p3.addPoint(&potp);
potp.x = 200, potp.y = 300, potp.z = 300;
p3.addPoint(&potp);
/* trgl.p1=3 , trgl.p2=2 , trgl.p3=1 ;
face1.addTriangle(&trgl);
trgl.p1=3 , trgl.p2=1 , trgl.p3=0 ;
face1.addTriangle(&trgl);
trgl.p1=3 , trgl.p2=0 , trgl.p3=4 ;
face1.addTriangle(&trgl);
trgl.p1=3 , trgl.p2=4 , trgl.p3=7 ;
face1.addTriangle(&trgl);
trgl.p1=0 , trgl.p2=1 , trgl.p3=4 ;
face1.addTriangle(&trgl);
trgl.p1=4 , trgl.p2=1 , trgl.p3=5 ;
face1.addTriangle(&trgl);
trgl.p1=3 , trgl.p2=7 , trgl.p3=6 ;
face1.addTriangle(&trgl);
trgl.p1=3 , trgl.p2=6 , trgl.p3=2 ;
face1.addTriangle(&trgl);
trgl.p1=7 , trgl.p2=4 , trgl.p3=5 ;
face1.addTriangle(&trgl);
trgl.p1=6 , trgl.p2=7 , trgl.p3=5 ;
face1.addTriangle(&trgl);
trgl.p1=6 , trgl.p2=5 , trgl.p3=2 ;
face1.addTriangle(&trgl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -