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

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

新規登録して質問してみよう
ただいま回答率
87.20%
C++

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

解決済

可変長引数で文字の描画方法について

hikarhikar
hikarhikar

総合スコア0

C++

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

1回答

0評価

0クリップ

776閲覧

投稿2020/05/06 09:59

OpenGLを使用し可変長引数を用いて文字を描画するプログラミングを何回か書いてきましたが、
インターネットの説明でいろいろな記事を見ましたが、まだイメージが難しいところがあるので、質問させていただきました。

va_list・va_start・vswprintf_s・についてお聞きしたいのですが


va_list

可変長引数を扱ううえで必要な情報を保持する変数だといることはわかるのですが、
具体的にどのような情報を保持しているのでしょうか?


va_start

可変長引数リストの初期化
ネットの記事では[第2引数:指定した引数以降を引数リストに格納]と書いてあったのですが、
下の場合では、可変長引数リストformatに格納されている文字列を、va_listで定義したargListに格納するということでしょうか?
va_start(argList, format);

そして、
vswprintf_s

下の場合では、第3引数の型を基に第2引数が示す文字列を第1引数に格納する。でいいのでしょうか?
vswprintf_s(buf, format, argList);


va_startとvswprintf_sの関係性がいまいちイメージできませんでした。
どなたかわかる方教えていただければ幸いです。<(_ _)>

C++

void font_Draw(const wchar_t* format, ...) { va_list argList; if (format == nullptr)return; wchar_t buf[256]; va_start(argList, format); vswprintf_s(buf, format, argList); va_end(argList); int length = wcslen(buf);//ワイド文字列の長さ int list = glGenLists(length);//連続した空のディスプレイ・リストを生成します wchar_t fontType[] = { L"MS明朝" }; HFONT Ofont = CreateFontW( 20, //_In_ int cHeight:論理フォントの高さ 0, //_In_ int cWidth:論理フォントのはば 0, //_In_ int cEscapement:文字の方向(左から右) 0, //_In_ int cOrientation FW_REGULAR, //_In_ int cOrientation FALSE, //_In_ DWORD bItalic FALSE, //_In_ DWORD bUnderline FALSE, //_In_ DWORD bStrikeOut SHIFTJIS_CHARSET, //_In_ DWORD iCharSet OUT_DEFAULT_PRECIS, //_In_ DWORD iOutPrecision CLIP_DEFAULT_PRECIS, //_In_ DWORD iClipPrecision, DEFAULT_QUALITY, //_In_ DWORD iQuality FIXED_PITCH | FF_MODERN,//_In_ DWORD iPitchAndFamily fontType); //_In_opt_ LPCWSTR pszFaceName HDC Odc = wglGetCurrentDC(); SelectObject(Odc, Ofont); wchar_t* font = buf; int i = 0; for (; (*font != '\0') && (*font != '\n'); font++) { wglUseFontBitmapsW( Odc, // HDC *font, // DWORD 1, // DWORD list+(DWORD)i// DWORD ); i++; } glColor3f(0xff,0xff,0xff); glPushMatrix(); { glRasterPos2i(100, 100); for (int i = 0; i < length; i++) { glCallList(list + i); } } glPopMatrix(); if (*font == '\n' || '\0') { glDeleteLists(list, length); list = 0; length = 0; font_Draw(++font); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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