DirectX10不写文本

时间:2013-08-13 18:25:11

标签: text directx directx-10

试图写文字,但程序不起作用。

P.S。程序使用多字节编码。

代码:

#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);
}

1 个答案:

答案 0 :(得分:1)

  1. 为什么要在清理功能中创建字体?它不会被称为单位 你放弃了,当你戒烟时,你什么也看不见。
  2. 不要使用D3DXCOLOR(1.0,1.0,1.0,1.0),那是与白色相同的白色 你的窗口背景,你什么也看不见。
  3. 在创建rendertargetview之后,或者您没有忘记调用OMSetRenderTargets 什么也看不见。
  4. 顺便说一句,不要使用非英语评论,StackOverFlow是一个全球网站,英语是首选,因为这里的大多数人都懂英语