|

楼主 |
发表于 2004-9-14 11:35:00
|
显示全部楼层
Re:一个关于DirectDraw的问题
谢谢指点
我设置成narmal,但是一运行窗口就没了
下面是程序的部分代码
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
{
HWND hWnd;
HRESULT hr;
if (FAILED(WinInit(hInst, nCmdShow, &hWnd))) return FALSE;
if(FAILED(hr = DirectDrawCreate(NULL, &g_pDdaw, NULL)))
return E_FAIL;
DWORD dwFlags;
DDSURFACEDESC ddsd;
HRESULT ddrval;
//ÉèÖÃЭ×÷¼¶±ðΪȫÆÁģʽ
dwFlags = DDSCL_NORMAL;//DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT;
g_pDdaw->SetCooperativeLevel(hWnd, dwFlags);
/*DWORD dwStyle = GetWindowStyle( hWnd );
dwStyle &= ~WS_POPUP;
dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX;
SetWindowLong( hWnd, GWL_STYLE, dwStyle );*/
//ÉèÖÃÏÔʾģʽ
//g_pDdaw->SetDisplayMode(640, 480, 16);
//g_pDdaw->SetDisplayMode(GetSystemMetrics(SM_CXSCREEN),
// GetSystemMetrics(SM_CYSCREEN), 0x20);
// ´´½¨Ö÷Ò³Ãæ
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddsd.dwWidth = 320;
ddsd.dwHeight = 240;
ddrval = g_pDdaw->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
if(ddrval != DD_OK) return false;
// ÏûϢѭ»·
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return true;
}
int Render()
{
DDSURFACEDESC ddsd;
HRESULT ddrval;
WORD *GraphBuffer = NULL; // »æÍ¼»º³åÇø
int GraphPitch = 0; // »º³åÇø¿ç¶È
int GraphWidth, GraphHeight; //Ò³Ãæ¿í¶È£¬Ò³Ãæ¸ß¶È
ddsd.dwSize = sizeof(ddsd);
if (!lpDDSPrimary) return false;
// HDC hdc;
//lpDDSPrimary->GetDC(&hdc);
ddrval = lpDDSPrimary->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); //Ëø¶¨
// Ö÷ÒªÓÃlpDDSPrimary½Ó¿ÚLockºóµÄddsd¿í¶ÈºÍ¸ß¶ÈÄ£ÄâFrameBuffer
/*SetBkColor(hdc, RGB(0, 0, 255));
SetTextColor(hdc, RGB(255, 255, 0));
TextOut(hdc, 0, 0, "Hello world", 100);
lpDDSPrimary->ReleaseDC(hdc);*/
GraphBuffer = (WORD *)ddsd.lpSurface; //ÄÚ´æÖ¸Õë
GraphWidth = 320; //¿í¶È
GraphHeight = 240; //¸ß¶È
GraphPitch = ddsd.lPitch >> 1; //lPitchÒÔByteΪµ¥Î»¼ÆÊýµÄ£¬
// ÔÚÕâÀï¿ÉÒÔ×öÄ£ÄâFrameBufferµÄ²Ù×÷
WORD color16 = 0x0;
// Draw a rectangle
for(int i = 20; i < GraphWidth; i++)
for(int j = 30; j < GraphHeight; j++)
GraphBuffer[i * GraphPitch + j] = color16;
ddrval = lpDDSPrimary->Unlock(NULL); //&frac12;&acirc;&Euml;&oslash;
if(ddrval != DD_OK) return(false);
return true;
}
HRESULT WinInit(HINSTANCE hInst, int nCmdShow, HWND* phWnd)
{
WNDCLASS wc;
HWND hWnd;
// Register the Window Class
wc.lpszClassName = TEXT("FrameBuffer");
wc.lpfnWndProc = MainWndProc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if (RegisterClass(&wc) == 0) return E_FAIL;
// Create and show the main window
hWnd = CreateWindow(TEXT("FrameBuffer"), TEXT("FrameBuffer test"),
WS_OVERLAPPEDWINDOW, 0, 0, 400, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
if (hWnd == NULL) return E_FAIL;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
*phWnd = hWnd;
return S_OK;
}
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ switch(msg)
{ case WM_KEYDOWN:
PostMessage(hWnd, WM_CLOSE, 0, 0);
return 0L;
case WM_SYSCOMMAND:
break;
case WM_PAINT: // &raquo;&aelig;&Ouml;&AElig;
Render();
ValidateRect(hWnd, NULL);
break;
case WM_DESTROY:
SAFE_RELEASE(lpDDSPrimary);
SAFE_RELEASE(g_pDdaw);
PostQuitMessage(0);
return 0L;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
} |
|