Вперед:
Вверх: Курсовая работа 1
Назад: Литература
  Содержание
Файл resource.h
#define IDR_MENU 102
#define IDM_EXIT 40001
Файл program.cpp
#define NAME "Подсистема1"
#define TITLE "Подсистема визуализации стереоскопического растра"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <stdlib.h>
#include <stdarg.h>
#include "resource.h"
#include <process.h>
#define TIMER_ID 1
#define TIMER_RATE 5
LPDIRECTDRAW lpDD; // Объект DirectDraw
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw первый кадр
LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw второй кадр
BOOL bActive;
BOOL vbs;
HRESULT ddrval;
static int letsend=0;
static int letsendok=0;
HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP
hbm, int x, int y, int dx, int dy)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
DDSURFACEDESC ddsd;
HRESULT hr;
if (hbm == NULL || pdds == NULL)
return E_FAIL;
//
// восстановление поверхности
//
pdds->Restore();
//
// загрузка растра в память
//
hdcImage = CreateCompatibleDC(NULL);
if (!hdcImage)
OutputDebugString(TEXT("createcompatible dc failed\n"));
SelectObject(hdcImage, hbm);
GetObject(hbm, sizeof(bm), &bm);
dx = dx == 0 ? bm.bmWidth : dx;
dy = dy == 0 ? bm.bmHeight : dy;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
pdds->GetSurfaceDesc(&ddsd);
if ((hr = pdds->GetDC(&hdc)) == DD_OK)
{
BitBlt (hdc, 0, 0, 640, 480, hdcImage, x, y, SRCCOPY);
pdds->ReleaseDC(hdc);
}
DeleteDC(hdcImage);
return hr;
}
void __cdecl othertask (void* args) {
for (;;) {
ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );
do {
lpDD->GetVerticalBlankStatus (&vbs);
} while (vbs==TRUE);
if( ddrval == DD_OK )
{
}
if (letsend) break;
}
letsendok=1;
}
/* освобождение памяти */
static void finiObjects( void )
{
letsend=1;
while (!letsendok);
if( lpDD != NULL )
{
if( lpDDSPrimary != NULL )
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
char szMsg[] = "Page Flipping Test: Press F12 to exit";
char szFrontMsg[] = "Front buffer (F12 to quit)";
char szBackMsg[] = "Back buffer (F12 to quit)";
HWND hwnd;
long FAR PASCAL WindowProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
RECT rc;
SIZE size;
static BYTE phase = 0;
HDC hdc;
switch( message )
{
case WM_ACTIVATEAPP:
bActive = wParam;
break;
case WM_CREATE:
break;
case WM_SETCURSOR:
SetCursor(NULL);
return TRUE;
case WM_TIMER:
if( bActive )
{
static int state=0;
BOOL vbs;
HRESULT ddrval;
if (!state) {
KillTimer (hwnd,TIMER_ID);
_beginthread (othertask,4096,NULL);
state=1;
}
}
break;
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
case VK_F12:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_PAINT:
BeginPaint( hWnd, &ps );
GetClientRect(hWnd, &rc);
GetTextExtentPoint( ps.hdc, szMsg, lstrlen(szMsg), &size );
SetBkColor( ps.hdc, RGB( 0, 0, 255 ) );
SetTextColor( ps.hdc, RGB( 255, 255, 0 ) );
TextOut( ps.hdc, (rc.right - size.cx)/2,
(rc.bottom - size.cy)/2,
szMsg, sizeof( szMsg )-1 );
EndPaint( hWnd, &ps );
break;
case WM_DESTROY:
finiObjects();
PostQuitMessage( 0 );
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
/*
* doInit - инициализация, создание окна.
*/
static BOOL doInit( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASS wc;
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
HRESULT ddrval;
HDC hdc;
char buf[256];
letsend=0;
letsendok=0;
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 );
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 );
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, 8 );
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 )
{
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps,
&lpDDSBack);
if( ddrval == DD_OK )
{
if (lpDDSPrimary->GetDC(&hdc) == DD_OK)
{
HBITMAP hbm;
BitBlt (hdc,0,0,640,480,NULL,0,0,BLACKNESS);
hbm = (HBITMAP)LoadImage(NULL, "C:\\1.bmp",
IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
lpDDSPrimary->ReleaseDC(hdc);
DDCopyBitmap(lpDDSPrimary, hbm, 0, 0,
640, 480);
lpDDSPrimary->GetDC (&hdc);
DeleteObject(hbm);
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szFrontMsg,
lstrlen(szFrontMsg) );
lpDDSPrimary->ReleaseDC(hdc);
}
if (lpDDSBack->GetDC(&hdc) == DD_OK)
{
HBITMAP hbm;
BitBlt (hdc,0,0,640,480,NULL,0,0,WHITENESS);
hbm = (HBITMAP)LoadImage(NULL, "C:\\2.bmp",
IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
lpDDSBack->ReleaseDC(hdc);
DDCopyBitmap(lpDDSBack, hbm, 0, 0, 640, 480);
lpDDSBack->GetDC(&hdc);
DeleteObject(hbm);
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szBackMsg,
lstrlen(szBackMsg) );
lpDDSBack->ReleaseDC(hdc);
}
// Create a timer to flip the pages
if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) )
{
return TRUE;
}
}
}
}
}
}
wsprintf(buf, "Direct Draw Init Failed (%08lx)\n", ddrval );
MessageBox( hwnd, buf, "ERROR", MB_OK );
finiObjects();
DestroyWindow( hwnd );
return FALSE;
}
/*
* WinMain - цикл сообщений
*/
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
lpCmdLine = lpCmdLine;
hPrevInstance = hPrevInstance;
if( !doInit( hInstance, nCmdShow ) )
{
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
|