|
|
请大虾们给小弟看看。。
#define INITGUID
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <stdarg.h>
#define TIMER_ID 1
#define TIMER_RATE 500
LPDIRECTDRAW lpDD;
LPDIRECTDRAW7 lpDD7;
LPDIRECTDRAWSURFACE7 lpDDSPrimary;
LPDIRECTDRAWSURFACE7 lpDDSBack;
LPDIRECTDRAWSURFACE7 lpDDopl;
BOOL bActive;
HDC hdc,hdc1;
HBITMAP bitmap;
HRESULT result;
DDSURFACEDESC2 ddsd;
RECT rect;
char szMsg1[] = "Hello World, I am DirectDraw boy !";
char szMsg2[] = "按 ESC 退出";
char szMsg3[] = "按 ffff 退出";
char szMsg4[] = "按 gggg 退出";
void CreateBitmapSurface(LPDIRECTDRAWSURFACE7 lpSurface, char *fname, int xs, int ys);
void DrawHBitmap(IDirectDrawSurface7 *lpSurface, HBITMAP hBitmap, int x, int y, int width, int height);
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
HWND hwnd;
HINSTANCE hINST;
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );
BOOL InitDDraw( void );
void FreeDDraw( void );
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
if ( !InitWindow( hInstance, nCmdShow ) )
return FALSE;
if ( !InitDDraw())
{
MessageBox(GetActiveWindow(), "初始化DirectDraw过程中出错!", "Error", MB_OK );
FreeDDraw();
DestroyWindow(GetActiveWindow());
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hbrBackground=(HBRUSH)(COLOR_BACKGROUND+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "dxHello";
RegisterClass( &wc );
hwnd = CreateWindowEx(
0,
"dxHello",
"",
WS_POPUP,
0, 0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL,
NULL,
hInstance,
NULL );
if( !hwnd ) return FALSE;
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
return TRUE;
}
LRESULT CALLBACK WinProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
RECT rc;
static BYTE phase=0;
PAINTSTRUCT ps;
switch (message)
{
case WM_ACTIVATEAPP:
bActive=wParam;
break;
case WM_CREATE:
break;
case WM_SETCURSOR:
SetCursor(NULL);
return TRUE;
case WM_TIMER:
if(bActive)
{
if(lpDDSBack->GetDC(&hdc)==DD_OK)
{
if(phase)
{
SetBkColor(hdc,RGB(0,0,255));
SetTextColor(hdc,RGB(255,255,0));
TextOut( hdc, 220, 200, szMsg1, lstrlen(szMsg1));
TextOut( hdc, 280, 240, szMsg2, lstrlen(szMsg2));
phase=0;
}
else
{
SetBkColor(hdc,RGB(255,0,0));
SetTextColor(hdc,RGB(255,255,0));
TextOut( hdc, 220, 200, szMsg3, lstrlen(szMsg3));
TextOut( hdc, 280, 240, szMsg4, lstrlen(szMsg4));
phase=1;
}
lpDDSBack->ReleaseDC(hdc);
}
while(1)
{
HRESULT ddrval;
ddrval=lpDDSPrimary->Flip(NULL,0);
if(ddrval==DD_OK)
{
break;
}
if(ddrval==DDERR_SURFACELOST)
{
ddrval=lpDDSPrimary->Restore();
if(ddrval!=DD_OK)
{
break;
}
}
if(ddrval!=DDERR_WASSTILLDRAWING)
{
break;
}
}
}
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,szMsg4,lstrlen(szMsg4),&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,szMsg4,lstrlen(szMsg4));
break;
}
switch( message )
{
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_DESTROY:
FreeDDraw();
PostQuitMessage( 0 );
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
BOOL InitDDraw(void)
{
DDSCAPS ddscaps;
HDC hdc;
if ( DirectDrawCreate( NULL, &lpDD, NULL ) != DD_OK ) return FALSE;
if(FAILED(lpDD->QueryInterface(IID_IDirectDraw7, (LPVOID *)&lpDD7)))
{
MessageBox(NULL,TEXT("DirectDraw QueryInterface error!"),
TEXT("Wrong!"),MB_OK);
return(0);
}
if ( lpDD7->SetCooperativeLevel( GetActiveWindow(),
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) != DD_OK)
return FALSE;
if (lpDD7->SetDisplayMode(800, 600, 16,0,0) != DD_OK) return FALSE;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=1;
if (lpDD7->CreateSurface(&ddsd, &lpDDSPrimary, NULL) == DD_OK)
{
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
if(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBack)==DD_OK)
{
if ( lpDDSPrimary->GetDC(&hdc) != DD_OK) return FALSE;
{
SetBkColor(hdc,RGB(0,0,255));
SetTextColor(hdc,RGB(255,255,0));
TextOut( hdc, 220, 200, szMsg1, lstrlen(szMsg1));
TextOut( hdc, 280, 240, szMsg2, lstrlen(szMsg2));
lpDDSPrimary->ReleaseDC(hdc);
}
if ( lpDDSBack->GetDC(&hdc) != DD_OK) return FALSE;
{
SetBkColor(hdc,RGB(255,0,0));
SetTextColor(hdc,RGB(255,255,0));
TextOut( hdc, 220, 200, szMsg3, lstrlen(szMsg3));
TextOut( hdc, 280, 240, szMsg4, lstrlen(szMsg4));
lpDDSBack->ReleaseDC(hdc);
}
ZeroMemory(&ddsd,sizeof(ddsd));
memset(&ddsd,0,sizeof(ddsd)); //清空结构内容
ddsd.dwSize=sizeof(ddsd); //设置大小
ddsd.dwFlags = DDSD_CAPS |DDSD_HEIGHT|DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;//指定页面类型
ddsd.dwWidth=320;
ddsd.dwHeight=210; //设置离屏页面大小
if (lpDD7->CreateSurface(&ddsd, &lpDDopl, NULL)!=DD_OK)
{
MessageBox(NULL,TEXT("DirectDraw Create offscreen plain error!"),
TEXT("Wrong!"),MB_OK);
}
CreateBitmapSurface(lpDDopl,"saiche.bmp",320,210);
lpDDopl->Release();
if(SetTimer(hwnd,TIMER_ID,TIMER_RATE,NULL))
{
return TRUE;
}
}
}
return TRUE;
}
void FreeDDraw( void )
{
if( lpDD != NULL )
{
if( lpDDSPrimary != NULL )
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if (lpDD7!=NULL)
{
lpDD7->Release();
lpDD7 = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
void DrawHBitmap(IDirectDrawSurface7 *lpSurface, HBITMAP hBitmap, int x, int y, int width, int height)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
if (lpSurface == NULL || hBitmap == NULL)
return;
lpSurface->Restore();
hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hBitmap);
GetObject(hBitmap, sizeof(bm), &bm);
width = width == 0 ? bm.bmWidth : width;
height = height == 0 ? bm.bmHeight : height;
lpSurface->GetDC(&hdc);
BitBlt(hdc, x, y, width, height, hdcImage, 0, 0, SRCCOPY);
lpSurface->ReleaseDC(hdc);
DeleteDC(hdcImage);
}
void CreateBitmapSurface(LPDIRECTDRAWSURFACE7 lpSurface, char *fname, int xs, int ys)
{
HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(NULL, fname, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
DrawHBitmap(lpSurface, hBitmap, 0, 0, xs, ys);
DeleteObject(hBitmap);
}
[em19] [em19] |
|