Почему окно окрывается и сразу закрывается в MS 2005 VC++?
//-----------------------------------------------------------------------------------
// InitialDirect3D.CPP
// Инициализируем Direct3D
//-----------------------------------------------------------------------------------
#include <windows.h> // Подключаем заголовочный файл Windows
#include <d3d9.h> // Подключаем заголовочный файл DirectX 9 SDK
//-----------------------------------------------------------------------------------
// Глобальные переменные
//-----------------------------------------------------------------------------------
LPDIRECT3D9 pDirect3D = NULL; // Direct3D объект
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; // Устройство
//-----------------------------------------------------------------------------------
// Функция
// InitialD3D()
// Инициализация Direct3D
//-----------------------------------------------------------------------------------
HRESULT InitialDirect3D( HWND hwnd )
{
if( NULL == ( pDirect3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DDISPLAYMODE Display;
if( FAILED( pDirect3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &Display ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS Direct3DParametr;
ZeroMemory( &Direct3DParametr, sizeof(Direct3DParametr) );
Direct3DParametr.Windowed = TRUE;
Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
Direct3DParametr.BackBufferFormat = Display.Format;
if( FAILED( pDirect3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&Direct3DParametr, &pDirect3DDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
//-----------------------------------------------------------------------------------
// Функция
// RenderingDirect3D()
//
//-----------------------------------------------------------------------------------
VOID RenderingDirect3D()
{
if(pDirect3DDevice == NULL) // Проверяем ошибки
return;
pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,0), 1.0f, 0 );
// Начало сцены
pDirect3DDevice->BeginScene();
// Здесь происходит прорисовка сцены
pDirect3DDevice->EndScene();
//Конец сцены
pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------------
// Функция
// DeleteDirect3D()
// Освобождает захваченные ресурсы
//-----------------------------------------------------------------------------------
VOID DeleteDirect3D()
{
if( pDirect3DDevice != NULL)
pDirect3DDevice->Release();
if( pDirect3D != NULL)
pDirect3D->Release();
}
//-----------------------------------------------------------------------------------
// Функция
// MainWinProc()
// Здесь происходит обработка сообщений
//-----------------------------------------------------------------------------------
LRESULT CALLBACK MainWinProc(HWND hwnd, //Дескриптор окна
UINT msg, //идентификатор сообщение
WPARAM wparam, //Дополнительная информация
LPARAM lparam) //Дополнительная информация
{
switch(msg)
{
case WM_PAINT:
RenderingDirect3D();
ValidateRect( hwnd, NULL );
return(0);
case WM_DESTROY:
DeleteDirect3D();
PostQuitMessage(0);
return(0);
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
//-----------------------------------------------------------------------------------
// Функция
// WinMain
// Входная точка приложения
//-----------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX windowsclass; // Создаем класс
HWND hwnd; // Создаем дескриптор окна
MSG msg; // Идентификатор сообщения
// Определим класс окна WNDCLASSEX
windowsclass.cbSize = sizeof(WNDCLASSEX);
windowsclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
windowsclass.lpfnWndProc = MainWinProc;
windowsclass.cbClsExtra = 0;
windowsclass.cbWndExtra = 0;
windowsclass.hInstance = hinstance;
windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName = NULL;
windowsclass.lpszClassName = "WINDOWSCLASS";
windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
// Зарегистрируем класс
if (!RegisterClassEx(&windowsclass))
return(0);
// Теперь когда класс зарегестрирован можно создать окно
if (!(hwnd = CreateWindowEx(NULL, // стиль окна
"WINDOWSCLASS", // класс
"Урок 3. Инициализация Direct3D", // название окна
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
300,150, // левый верхний угол
500,400, // ширина и высота
NULL, // дескриптор родительского окна
NULL, // дескриптор меню
hinstance, // дескриптор экземпляра приложения
NULL))) // указатель на данные окна
return(0);
if( SUCCEEDED( InitialDirect3D( hwnd ) ) )
{
ShowWindow( hwnd, SW_SHOWDEFAULT );
UpdateWindow( hwnd );
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return 0;
}
Это пример из книги по DirectX на С++. Автор предлагает набирать в ручную текст создания окна.
Ты гонишь. Пример вполне работоспособный.