Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Каким обpазом выбиpать pазмеp шpифта

Delphi , Графика и Игры , Шрифты

Каким обpазом выбиpать pазмеp шpифта

Автор: Nomadic

Каким обpазом выбиpать pазмеp шpифта, т.к. все мои стpадания по выбоpyпаpаметpов шpифта в CreateFont() никак не отpажались на его pазмеpе. Все что я пpидyмал, это юзать glScale(), но в этом слyчае полyчаем плохое качество (по сpавнению с той-же Воpдой) пpи малом pазмеpе символов

Вот часть работающего примера на Си (переведенного мною на Паскаль (АА)).


procedure GLSetupRC(pData: Pointer)
  //void GLSetupRC(void *pData)
//{
var
  //  HDC hDC;

  hDC: HDC;
  //  HFONT hFont;

  hFont: HFONT;
  //  GLYPHMETRICSFLOAT agmf[128];
  agmf: array[0..127] of GLYPHMETRICSFLOAT;
  //  LOGFONT logfont;

  logfont: LOGFONT;

begin

  logfont.lfHeight := -10;
  logfont.lfWidth := 0;
  logfont.lfEscapement := 0;
  logfont.lfOrientation := 0;
  logfont.lfWeight := FW_BOLD;
  logfont.lfItalic := FALSE;
  logfont.lfUnderline := FALSE;
  logfont.lfStrikeOut := FALSE;
  logfont.lfCharSet := ANSI_CHARSET;
  logfont.lfOutPrecision := OUT_DEFAULT_PRECIS;
  logfont.lfClipPrecision := CLIP_DEFAULT_PRECIS;
  logfont.lfQuality := DEFAULT_QUALITY;
  logfont.lfPitchAndFamily := DEFAULT_PITCH;
  //strcpy(logfont.lfFaceName,"Arial");
  //  strcpy(logfont.lfFaceName,"Decor");

  StrPCopy(logfont.lfFaceName, 'Decor');

  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST); // Hidden surface removal
  glFrontFace(GL_CCW); // Counter clock-wise polygons face out
  glEnable(GL_CULL_FACE); // Do not calculate insides
  glShadeModel(GL_SMOOTH); // Smooth shading
  glEnable(GL_AUTO_NORMAL);
  glEnable(GL_NORMALIZE);
  glEnable(GL_COLOR_MATERIAL);

  glClearColor(0.0, 0.0, 0.0, 1.0);

  glEnable(GL_LIGHTING);
  glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
  glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
  glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  glEnable(GL_LIGHT0);

  glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
  glMateriali(GL_FRONT, GL_SHININESS, 100);

  // Blue 3D Text
  glRGB(0, 0, 255);

  // Select the font into the DC
  hDC := (HDC)pData;
  //  hFont = CreateFontIndirect(&logfont);

  hFont := CreateFontIndirect(Addr(logfont));
  SelectObject(hDC, hFont);

  //create display lists for glyphs 0 through 255 with 0.3 extrusion
  // and default deviation. The display list numbering starts at 1000
  // (it could be any number).
  //  if(!wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3,
  //                            WGL_FONT_POLYGONS, agmf))

  if not wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3,

    //>                                         ``` - это тебе поможет
    //> Выводить текст можно в любым масштабе

    WGL_FONT_POLYGONS, agmf) then

    Windows.MessageBox(nil, 'Could not create Font Outlines',
      'Error', MB_OK or MB_ICONSTOP);

  // Delete the font now that we are done
  DeleteObject(hFont);
  //}
end;

// void GLRenderScene(void *pData)

procedure GLRenderScene(pData: Pointer);
begin

  (*  ...  *)

  // Draw 3D text
  glListBase(1000);
  glPushMatrix();
  // Set up transformation to draw the string.
  glTranslatef(-35.0, 0.0, -5.0);
  glScalef(60.0, 60.0, 60.0);
  glCallLists(3, GL_UNSIGNED_BYTE, 'Decor');
  glPopMatrix(); // Clear the window with current clearing color

  (* ... *)
end;

Похоже, вы пытаетесь отрендерить текст в 3D с помощью OpenGL и Windows API. Вы создали контур шрифта с помощью wglUseFontOutlines, но он не отображается как ожидалось.

Чтобы решить эту проблему, я бы предложил следующее:

  1. Проверьте, правильно ли выбирается шрифт: Убедитесь, что вызов SelectObject(hDC, hFont) успешно выбирает шрифт в DC.
  2. Проверьте структуру logfont: Дважды проверьте, что структура logfont настроена корректно, особенно поля lfHeight и lfWidth. Эти значения влияют на отображение текста.
  3. Используйте glRasterPos3f вместо glCallLists: Вместо использования glCallLists для отображения 3D-текста, попробуйте использовать glRasterPos3f, чтобы настроить позицию растера в 3D-пространстве и затем нарисовать текст с помощью glBitmap или glDrawArrays.
  4. Адаптируйте матрицу преобразования: Матрица преобразования, которую вы применяете (glTranslatef, glScalef), может не быть корректной для вашего конкретного случая. Попробуйте изменить эти значения или использовать другой подход для позиционирования и масштабирования текста.
  5. Проверьте ошибки OpenGL: После отображения 3D-текста проверьте, есть ли какие-либо ошибки OpenGL, вызвав glGetError. Это может помочь вам идентифицировать потенциальные проблемы с кодом отображения.

Вот обновленная версия вашего процедура GLRenderScene, которая использует glRasterPos3f и glBitmap для отображения 3D-текста:

procedure GLRenderScene(pData: Pointer);
begin
   (* ... *)

   // Отобразить 3D-текст
  glListBase(1000);
  glPushMatrix();
     // Настроить преобразование для рисования строки.
    glTranslatef(-35.0, 0.0, -5.0);
    glRasterPos3f(-25.0, 10.0, 0.0);  // Активируйте это положение, как нужно
    glBitmap(128, 0, 0, 0, 0, 0, WGL_FONT_POLYGONS, agmf);
  glPopMatrix();  // Очистить окно с текущим цветом очистки

   (* ... *)
end;

Обратите внимание, что вам нужно будет изменить положение glRasterPos3f и массив agmf, соответствующим образом.

Если ни одна из этих рекомендаций не поможет, пожалуйста, предоставьте более подробные сведения о вашем конкретном случае использования и о том, что именно не работает как ожидалось.

Каким образом выбрать размер шрифта в функции CreateFont() для отображения текста с качеством, подходящим для малого расстояния символов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 20:16:14/0.0036540031433105/0