试图写文本,但程序不工作。
PS 程序使用多字节编码。
代码:
#include <Windows.h>
#include <d3d10.h>
#include <d3dx10.h>
LPCSTR ClassName = "MyClass";
LPCSTR ProgName = "MyProg";
const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT= 480;
HWND g_hWnd;
D3D10_DRIVER_TYPE g_driverType = D3D10_DRIVER_TYPE_NULL;
ID3D10Device* g_pd3dDevice = NULL;
IDXGISwapChain* g_pSwapChain = NULL;
ID3D10RenderTargetView* g_pRenderTargetView=NULL;
ID3DX10Font* g_pFont=NULL;
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow);
void ResizeBuffers();
HRESULT InitDirect3D10();
HRESULT Cleanup();
void RenderScene();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
// Регистрируем класс окна и создаем окно
if (FAILED( InitWindow(hInstance, nCmdShow)))
return E_FAIL;
// Инициализируем Direct3D 10
if(FAILED( InitDirect3D10()))
{
Cleanup();
return E_FAIL;
}
// Цикл обработки сообщений
MSG msg={0};
while(WM_QUIT != msg.message)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else RenderScene();
}
Cleanup();
return (int) msg.wParam;
}
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow)
{
// Заполняем структуру класса окна
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground= (HBRUSH)COLOR_WINDOW;
wc.lpszMenuName = NULL;
wc.lpszClassName= ClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&wc))
return E_FAIL;
// Создание окна
g_hWnd = CreateWindow(
ClassName,
ProgName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,
NULL,
hInstance,
NULL);
// Если не удалось создать окно - выходим из функции
if (!g_hWnd)
return E_FAIL;
// Отображаем окно на экране
ShowWindow(g_hWnd, nCmdShow);
return S_OK;
}
void ResizeBuffers()
{
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
if (VK_F1==wParam)
{
BOOL InFullScreen;
g_pSwapChain->GetFullscreenState(&InFullScreen, NULL);
g_pSwapChain->SetFullscreenState(!InFullScreen, NULL);
}
break;
case WM_SIZE:
ResizeBuffers();
break;
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
HRESULT InitDirect3D10()
{
D3D10_DRIVER_TYPE driverTypes[] =
{
D3D10_DRIVER_TYPE_HARDWARE,
D3D10_DRIVER_TYPE_REFERENCE
};
UINT numDriverTypes = sizeof(driverTypes) / sizeof(driverTypes[0]);
DXGI_SWAP_CHAIN_DESC sd;
HRESULT hr = S_OK;
//Вычисляем размеры клиентской области окна
RECT rc;
GetClientRect( g_hWnd, &rc);
UINT width = rc.right - rc.left;
UINT height = rc.bottom - rc.top;
//Заполняем структуру цепочки переключений
ZeroMemory(&sd, sizeof(sd)); // Заполняем структуру нулевыми значениями
sd.BufferCount = 1; //Количество вторичных буферов
sd.BufferDesc.Width = width; //Ширина вторичного буфера в пикселах
sd.BufferDesc.Height = height; //Высота вторичного буфера в пикселах
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;//Формат вторичного буфера
sd.BufferDesc.RefreshRate.Numerator = 60;//Частота смены кадров. Игнорируется оконном режиме
sd.BufferDesc.RefreshRate.Denominator = 1;//Минимальное значение количества кадров
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;//Определяет, как испльзовать вторичный буфер
sd.OutputWindow = g_hWnd; //Окно, в которое будет производиться вывод графики
sd.SampleDesc.Count = 1; // параметры сглаживания изображения с использованием
sd.SampleDesc.Quality = 0; // мультисэмплинга. В данном случае не используется
sd.Windowed = TRUE;//Полноэкранный, или экранный режим
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;//Вариант переключения буферов (в данном случае полное
//стирание предыдущего кадра)
// Пытаемся создать устройство и цепочку переключений
for (UINT driverTypeIndex =0; driverTypeIndex<numDriverTypes;driverTypeIndex++)
{
g_driverType = driverTypes[driverTypeIndex];
hr = D3D10CreateDeviceAndSwapChain(NULL,
g_driverType,
NULL,
0,
D3D10_SDK_VERSION,
&sd,
&g_pSwapChain,
&g_pd3dDevice);
if(SUCCEEDED(hr))break;
}
if( FAILED(hr)) // Проверка правильности выполнения предыдущей фунции
return hr;
// Представление данных как буфера визуализации
ID3D10Texture2D *pBackBuffer;
// Получим доступ к вторичному буферу через переменную для текстуры
hr = g_pSwapChain->GetBuffer(0, // Индекс вторичного буфера
__uuidof(ID3D10Texture2D),
(LPVOID*)&pBackBuffer);
if ( FAILED(hr))
return hr;
// Данные о вторичном буфере из текстуры в подходящую переменную
hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL,&g_pRenderTargetView);
// освобождаем "текстурную" переменную в памяти
pBackBuffer->Release();
// Свяжем буфер визуализации с графическим конвейером
D3D10_VIEWPORT vp;
vp.Width = width;
vp.Height = height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDevice->RSSetViewports(1,&vp);
return S_OK;
}
HRESULT Cleanup()
{
if(g_pd3dDevice) g_pd3dDevice->ClearState();
if(g_pFont) g_pFont->Release();
if(g_pRenderTargetView) g_pRenderTargetView->Release();
if(g_pSwapChain) g_pSwapChain->Release();
if(g_pd3dDevice) g_pd3dDevice->Release();
D3DX10CreateFont(g_pd3dDevice, //Указатель на интерфейс устройства, с которым будет связан шрифтовый объект
14, //Высота букв ( в пикселах)
8, //Ширина букв ( в пикселах)
1, //Толщина линий символа шрифта
1, //Количество уровней миммаппинга(при отдалении, приближении камеры)
false, //Наклонное начертание
0, //Код символьного набора шрифта
0, //Настройки согласования размеров шрифтов с оригинальными размерами шрифтов
0, //указывает каким образом система Windows должна согласовывать желаемый и реально используемый шрифт. Приминяется только к растровым шрифтам
DEFAULT_PITCH|FF_MODERN, //Информация о шаги символов в строке и принадлежности к тому или иному семейству
"Verdana", // имя желаемого шрифта
&g_pFont); // Куда записывать результат работы функции
return S_OK;
}
void RenderScene()
{
// Очищаем вторичный буфер
// (компоненты красного, зеленого, синего, прозрачность)
float ClearColor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
// Очищаем буфер
g_pd3dDevice->ClearRenderTargetView(g_pRenderTargetView,ClearColor);
// Размеры прямоугольниа для форматирования текста
RECT Rect;
Rect.left=10;
Rect.top=10;
Rect.right=600;
Rect.bottom=380;
g_pFont->DrawText(NULL, // Указатель на спрайтовый объект. Выбран по умолчанию
"ClearCode",
-1, // Количество символов. В данном случае подсчитано автоматически
&Rect, // Область в которую будет выводиться надпись
DT_CENTER|DT_VCENTER,//Способ форматирования текста
D3DXCOLOR(1.0,1.0,1.0,1.0));//Цвет выводимого текста
g_pSwapChain->Present(0,0);
}