🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

解決済

3回答

3296閲覧

TextOut で string 型の文字列を表示させたい

TAKASE_Hiroyuki

総合スコア21

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2019/11/28 09:38

いつもお世話になっております。
基本的な質問ばかりで、恐縮です。

状況

Visual Studio 2019 で C++ を使っています。
次のようなプログラムで、Window に文字列を表示させることができました。

C++

1PAINTSTRUCT ps; 2HDC hdc = BeginPaint(hWnd, &ps); 3TCHAR szText[] = TEXT("This is some sample text."); 4TextOut(hdc, 50, 50, szText, lstrlen(szText)); 5EndPaint(hWnd, &ps); 6

事情があって、文字列の部分に変数を用いたいと考えています。
そこで、次のようにしてみました。

C++

1#include <string> 2using namespace std; 3 4string ss; 5ss = "This is som sample text."; 6 7PAINTSTRUCT ps; 8HDC hdc = BeginPaint(hWnd, &ps); 9 10TCHAR szText[] = TEXT(ss); 11TextOut(hdc, 50, 50, szText, lstrlen(szText));

エラー内容

上のようにすると、次のようなエラーが表示されます。

1>------ ビルド開始: プロジェクト: Test, 構成: Debug Win32 ------

1>Test.cpp
1>Text.cpp(160,21): error C2065: 'Lss': 定義されていない識別子です。
1>プロジェクト "Test.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

質問

string型と、 TCHAR型は、異なる型だろうと考え、いろいろと変換する方策を検索したり試したりしているのですが、うまくいきません。

ア)変換するとしたら、どのような方法が適切でしょうか。
イ)そもそも「変換しよう」と考えずに、最初から TCHAR型の変数に文字列を格納した場合に、文字列を結合したり一部を取り出したり等の操作は可能なのでしょうか(本件からは、少し離れた話題になるかと存じます)

お手数ですが、教えていただければ幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

今更ですが、TextOutA関数およびTextOutW関数の
第4引数
は std::string/std::wstring のメンバー関数に含まれている
c_str()・data()を呼び、第5引数は length()もしくはsize()を呼べばできます。

投稿2022/12/24 03:08

naohiro19_

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKASE_Hiroyuki

2022/12/24 03:14

ありがとうございました。これからも、勉強します。
guest

0

C++

1#ifdef UNICODE 2typedef std::wstring tstring; 3#else 4typedef std::string tstring; 5#endif 6 7... 8 9 PAINTSTRUCT ps; 10 HDC hdc = BeginPaint(hWnd, &ps); 11 12 tstring str = TEXT("This is some sample text."); 13 14 TextOut(hdc, 50, 50, str.c_str(), (int)str.length()); 15 EndPaint(hWnd, &ps);

投稿2019/11/28 10:08

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKASE_Hiroyuki

2019/11/28 11:33

ご回答いただき、ありがとうございました。 ヒントをいただき、なんとか、解決できたように思います。
guest

0

自己解決

解決しました

episteme 様にヒントをいただき、次のように解決しました。

まず、次の記事を参照しました。
マルチバイト文字列(std::string)とワイド文字列(std::wstring)の間の変換を行うライブラリを作りました

この記事の、strconv.h を使用させていただき、次のようにしました。

C++

1 #include "strconv.h" 2 #include <string> 3 using namespace std; 4 5 string ss; 6 ss = "This is som sample text."; 7 8 wstring wss; 9 wss = utf8_to_wide(ss); 10 wss = wss + L"あいうえお"; 11 12 PAINTSTRUCT ps; 13 HDC hdc = BeginPaint(hWnd, &ps); 14 TextOut(hdc, 50, 50, wss.c_str(), (int)wss.length()); 15 EndPaint(hWnd, &ps);

これによって、無事に、「This is some sample text. あいうえお」という文字列が、当該ウインドウに表示されました。

ご回答いただき、ありがとうございました。

疑問

このような内容は「自己解決」になるのでしょうか。

投稿2019/11/28 11:41

TAKASE_Hiroyuki

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/11/28 12:07

「encodingの変換がやりたい」とは読み取れんかったなー...
TAKASE_Hiroyuki

2019/11/28 12:46

ご回答いただき、ありがとうございました。 私の「質問」が不明確で、まことに申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問