Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.254.28] |
|
Сообщ.
#1
,
|
|
|
Код программы написан на основе урока 14 Nehe, уже мучаюсь несколько дней, но никак не могу вывести русские символы. Вместо этого выводятся квалратики и т.п. Просьба помочь мне разобраться в причинах происходящего, для этого я код инициализации OpenGL и создания шрифта
int CGraphVIEW::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; pdc = new CClientDC(this); if(SetWindowPixelFormat(pdc->m_hDC)==FALSE) return -1; hGLRC = wglCreateContext(pdc->m_hDC); if(hGLRC == NULL) return -1; if(wglMakeCurrent(pdc->m_hDC, hGLRC)==FALSE) return -1; float pos[4] = {0,0,5,1}; float dir[3] = {-0.8,-1,-1}; glEnable(GL_ALPHA_TEST); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); BuildFont(); //Выбор Шрифта InitGL(); return 0; } int CGraphVIEW::SetWindowPixelFormat(HDC hDC) { int m_GLPixelIndex; PIXELFORMATDESCRIPTOR pfd = {0}; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cRedBits = 8; pfd.cRedShift = 16; pfd.cGreenBits = 8; pfd.cGreenShift = 8; pfd.cBlueBits = 8; pfd.cBlueShift = 0; pfd.cAlphaBits = 0; pfd.cAlphaShift = 0; pfd.cAccumBits = 64; pfd.cAccumRedBits = 16; pfd.cAccumGreenBits = 16; pfd.cAccumBlueBits = 16; pfd.cAccumAlphaBits = 0; pfd.cDepthBits = 32; pfd.cStencilBits = 8; pfd.cAuxBuffers = 0; pfd.iLayerType = PFD_MAIN_PLANE; pfd.bReserved = 0; pfd.dwLayerMask = 0; pfd.dwVisibleMask = 0; pfd.dwDamageMask = 0; m_GLPixelIndex = ChoosePixelFormat( hDC, &pfd); if(m_GLPixelIndex==0) {m_GLPixelIndex = 1; if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0) return 0; } if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE return 0; return 1; } void CGraphVIEW::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(-6.0f,6.0f, -5,5, -5,12); gluLookAt( 0.5,-0.5,5, 0,0,0, 0,1,0 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(0,0,cx,cy); } GLvoid CGraphVIEW::BuildFont(GLvoid) { SelectObject (pdc->m_hDC, GetStockObject (SYSTEM_FONT)); HFONT font; GLYPHMETRICSFLOAT Char_List_Buffer[256]; LOGFONT lF ; HFONT hF = NULL; lF.lfHeight = 50; lF.lfWidth = 50; lF.lfEscapement = 0; lF.lfOrientation = 0; lF.lfWeight = 900; lF.lfItalic = 0; lF.lfUnderline = 0; lF.lfStrikeOut = 0; lF.lfCharSet = RUSSIAN_CHARSET; lF.lfOutPrecision = OUT_TT_ONLY_PRECIS ; lF.lfClipPrecision = CLIP_DEFAULT_PRECIS ; lF.lfQuality = PROOF_QUALITY ; lF.lfPitchAndFamily= FIXED_PITCH |FF_SWISS; wsprintf(lF.lfFaceName, _T("Courier new CYR")); hF=CreateFontIndirect(&lF); SelectObject (pdc->m_hDC, hF); base=0; base = glGenLists(255); wglUseFontOutlines(pdc->m_hDC, 0, 255, base, 0.0f, 0.6f, WGL_FONT_POLYGONS, Char_List_Buffer); SelectObject(pdc->m_hDC, NULL); DeleteObject(hF); } GLvoid CGraphVIEW::glPrint(CString fmt,float pt ...) { glPushMatrix(); { if (fmt.IsEmpty()) return; glListBase(base); char red[100]; glScaled(pt, pt, pt); CharToOem(fmt,red); glCallLists (strlen(red), GL_UNSIGNED_BYTE,red); } glPopMatrix(); } int CGraphVIEW::InitGL(GLvoid) { glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return TRUE; } void CGraphVIEW::display() { glClearColor (0.25f,0.145f,0.55f,0.5); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); CString p; glColor3f(0.8f,0.10f,0.10f); //красный p.Format(L"Красный"); glPrint(p,0.7); glFinish(); SwapBuffers(wglGetCurrentDC()); } |
Сообщ.
#2
,
|
|
|
Цитата Santal @ CharToOem(fmt,red); Это зачем?!! Цитата Santal @ wsprintf(lF.lfFaceName, _T("Courier new CYR")); И это зачем? Если уж указываешь RUSSIAN_CHARSET, достаточно: wsprintf(lF.lfFaceName, _T("Courier new")); Кстати, Курьер относится к семейству FF_MODERN, а не FF_SWISS. Вообще, hF не хочешь проверить - у тебя вообще шрифт-то создаётся, или нет? |
Сообщ.
#3
,
|
|
|
Убрал CharToOem(fmt,red); выбрал щрифт Courier new; заменил на FF_MODERN; Но не помогает, выводятся латинские буквы с закарючками над ними.
Шрифт вроде как создается(указатель возвращается в hF=CreateFontIndirect(&lF), если конечно это так проверяется). а настройки проекта могут влиять, типа использование Unicod или т.п. ? |
Сообщ.
#4
,
|
|
|
Цитата Santal @ типа использование Unicod или т.п. Легко. Попробуй без Юникода. Вернее, в glPrint сделай перевод из Юникода в 8-мибтную кодировку. Для начала. p.Format(L"Красный"); Не забудь убрать "L". Хотя, по идее, С Юникодом кошернее... Вообще, может, я туплю, но для коректной работы Юникода, нужно звать CreateFontIndirectW (или он и так зовётся?) + при вызове wglUseFontOutlines строить не первые 256 глифов, а все допустимые в Юникоде. Тут надо потыкать, навскидку не скажу. Но кодировочка где-то гадится, это однозначно |
Сообщ.
#5
,
|
|
|
Ура все получилось !
barazuk, Спасибо за советы! Если интересно, как я изменил код. Я полностью все перевел под Юникод и теперь юникодовский текст выводится отлично! Я поменял GLYPHMETRICSFLOAT Char_List_Buffer[256]; на GLYPHMETRICSFLOAT Char_List_Buffer[1120]; затем заменил base = glGenLists(1120); //для хранения в диапазоне юникода размер увеличен до 1120 (от 0 до 1119) , так же поменял wglUseFontOutlinesW(pdc->m_hDC,0, 1120, base, 0.0f, 0.6f, WGL_FONT_POLYGONS, Char_List_Buffer); //диапзон 0-255, заменен на юникодовский 0-1119 Ну и наконец функция печати у меня стала выглядеть вот так GLvoid CGraphVIEW::glPrint(CString fmt,float pt ...) { glPushMatrix(); { if (fmt.IsEmpty()/) return; glListBase(base); glScaled(pt, pt, pt); glCallLists (wcslen(fmt), GL_UNSIGNED_SHORT,fmt); //Полностью поменялась } glPopMatrix(); } |