.:Публикации:. [www.karlson.ru]


Вперед: Вверх: Курсовая работа 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;

}


...домик на крыше...,поиск,гостевая книга,cv. Be free, use Linux!