سؤال

Tried to write text, but program does not work.

P.S. program uses multibyte encoding.

Code:

#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. Why did you create font in Cleanup function? it won't be called unit you quit, and when you quit, you will see nothing.
  2. Don't use D3DXCOLOR(1.0,1.0,1.0,1.0), that's white color which was same as your window's background, you will see nothing.
  3. Don't forgot to call OMSetRenderTargets after you create the rendertargetview, or you will see nothing.

By the way, Do not use non-English comments, StackOverFlow is a world wide web site, English is the first choice since most people here know English

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top