質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

opengl(freeglut)で文字列描画

ccrenon
ccrenon

総合スコア15

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0グッド

0クリップ

359閲覧

投稿2022/10/13 12:27

前提

c++でopengl(freegult)を使用しています。

実現したいこと

https://w.atwiki.jp/opengl/pages/24.html
このサイトに従って、
openglで文字列を描画するようにしたいのですが、エラーが発生して描画できません。

発生している問題・エラーメッセージ

font->DrawStringW(10,120,L"こんにちは OpenGLの世界!!");
というのを入力すると"L"の部分にエラーが起きます。
.

説明                       | コード 型 の引数は型 のパラメーターと互換性がありません  E0167

該当のソースコード(サイトの内容そのまま)

c++

1#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") 2#include <GL/freeglut/freeglut.h> 3#include <stdio.h> 4 5#define WIDTH 320 6#define HEIGHT 240 7 8class GLFONT 9{ 10public: 11 HFONT Hfont; 12 HDC Hdc; 13 GLFONT(wchar_t *fontname, int size); 14 void DrawStringW(int x,int y,wchar_t *format, ...); 15}; 16//コンストラクタ フォント作成 17GLFONT::GLFONT(wchar_t *fontname, int size) 18{ 19 Hfont = CreateFontW( 20 size, //フォント高さ 21 0, //文字幅 22 0, //テキストの角度 23 0, //ベースラインとx軸との角度 24 FW_REGULAR, //フォントの太さ 25 FALSE, //イタリック体 26 FALSE, //アンダーライン 27 FALSE, //打ち消し線 28 SHIFTJIS_CHARSET, //文字セット 29 OUT_DEFAULT_PRECIS, //出力精度 30 CLIP_DEFAULT_PRECIS, //クリッピング精度 31 ANTIALIASED_QUALITY, //出力品質 32 FIXED_PITCH | FF_MODERN, //ピッチとファミリー 33 fontname); //書体名 34 35 Hdc = wglGetCurrentDC(); 36 SelectObject(Hdc, Hfont); 37} 38//ワイド文字列の描画 39void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...) 40{ 41 wchar_t buf[256]; 42 va_list ap; 43 int Length=0; 44 int list=0; 45 46 //ポインタがNULLの場合は終了 47 if ( format == NULL ) 48 return; 49 50 //文字列変換 51 va_start(ap, format); 52 vswprintf_s(buf, format, ap); 53 va_end(ap); 54 55 Length = wcslen(buf); 56 list = glGenLists(Length); 57 for( int i=0; i<Length; i++ ){ 58 wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i); 59 } 60 61 glDisable(GL_LIGHTING); 62 glRasterPos2i(x, y); 63 //ディスプレイリストで描画 64 for( int i=0; i<Length; i++ ) 65 { 66 glCallList(list + i); 67 } 68 glEnable(GL_LIGHTING); 69 //ディスプレイリスト破棄 70 glDeleteLists(list, Length); 71 list = 0; 72 Length = 0; 73} 74 75GLFONT *font; 76 77void display(void) 78{ 79 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 80 glColor4f(0.0f, 0.0f, 1.0f, 1.0f); 81 font->DrawStringW(10,120,L"こんにちは OpenGLの世界!!"); 82 glutSwapBuffers(); 83} 84void idle(void) 85{ 86 glutPostRedisplay(); 87} 88void Init(){ 89 glClearColor(1.0, 1.0, 1.0, 1.0); 90 glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); 91 font = new GLFONT(L"MS明朝", 24); 92} 93int main(int argc, char *argv[]) 94{ 95 glutInitWindowPosition(100, 100); 96 glutInitWindowSize(WIDTH, HEIGHT); 97 glutInit(&argc, argv); 98 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 99 glutCreateWindow("文字列を描画"); 100 glutDisplayFunc(display); 101 glutIdleFunc(idle); 102 Init(); 103 glutMainLoop(); 104 return 0; 105}

補足情報

Visual studio 2022
c++

何か足りなければすみません。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

すみません
同じサイトの同じ内容で質問している方がいました。
https://teratail.com/questions/334745
こちらです。
ありがとうございました。

投稿2022/10/13 13:13

ccrenon

総合スコア15

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

SaitoAtsushi

2022/10/13 15:02

古い言語仕様 (C++03) では文字列リテラルに限って暗黙の変換で const を外すことが許されていました。 (C++03 の 4.2 をご覧ください。) C との互換性を考慮してのことだと思うのですが当然ながらひどい仕様だったので C++11 からその項目が消えることになりました。 また、後にその項目が削除されてからもマイクロソフトのコンパイラはだいぶん後までその挙動を残していました。 参考にしたサイトに書かれているコードはその当時は実際にそれで通っていたのだと思います。 事情は変わっていくので古い資料はあてにならないこともあります。
ccrenon

2022/10/13 21:56

なるほど。 いつもどこのサイトもそのままのコードなのに絶対に一度はエラーが起きていたのでなぜかと思ったのですが、やっと理由が分かりました。 ありがとうございます。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。