MFCでSetWindowText、SetWindowTextA、SetWindowTextWを使う話

管理人のタツです。

業務でMFCでひーこら言いながら開発を行っています。

スタティックテキストに文字を入れる際によくSetWindowTextを使います。

そして過去のソースを見てみるとSetWindowTextAを使っている箇所もあるんですよね。

さらに、自分のプライベート端末でプロジェクトを作成すると候補でSetWindowTextWが出てきたり。

実は違いがよくわかっていませんでした。

この際調べてみようと思って調べてみた結果です。

結論

早速結論ですが、プロジェクトの設定による、です。

ソリューションエクスプローラからプロジェクトを右クリック、プロパティを開きます。

そこの文字セットの設定によってました。

SetWindowTextA

SetWindowTextAは、ANSI版の関数です。
ANSI文字列(マルチバイト文字列)を扱います。

文字セットを「マルチバイト文字セットを使用する」に設定した場合、使うことができます。

SetWindowTextW

SetWindowTextWは、UNICODE版の関数です。
UNICODE文字列(ワイド文字列)を扱います。

文字セットを「Unicode文字セットを使用する」に設定した場合、使うことができます。

おそらくですが、新規プロジェクトを作成した場合、こちらがデフォルトになっているかと思います。

SetWindowText

じゃあSetWindowTextは?

これは、現在のプロジェクト設定に応じて
自動的にSetWindowTextAまたはSetWindowTextWのどちらかを使用します。

なので、迷ったらSetWindowTextを使っておけばビルドエラーにはならないのかと。
(迷うもなにも、プロパティ見れば一発ですけどね)

実験

実験してみましょう。

適当にソリューション新規作成しておきます。
(今回はTest_Static)

ビルドは行わないので、Test_StaticDlg.cppにあるOnInitDialog内で以下を書いてみます。

// ポインタ取得
CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC);

// UNICODE設定の場合
// UNICODE文字列を使用
pStatic->SetWindowText(L"Unicode文字列");

// ANSI設定の場合
// ANSI文字列を使用
pStatic->SetWindowText("ANSI文字列");

// 明示的にANSI版を使用する場合
pStatic->SetWindowTextA("ANSI文字列");

// 明示的にUNICODE版を使用する場合
pStatic->SetWindowTextW(L"Unicode文字列");

Unicode文字セットを使用する場合

デフォルトの方です。
SetWindowTextWが使えるほうです。

SetWindowTextAが使えないのはわかりきってることです。

UNICODE文字列リテラルを使用する場合は
‘L’プレフィックスを付ける必要がありますので、2つ目でもエラーが出てきてしまいます。

マルチバイト文字セットを使用する場合

ソースはこのままで、設定だけ変えてみます。

SetWindowTextWが使えません。

後わかりにくくてすみません、最初の行も’L’のところにエラーが出てます。

これはさっきの逆ですね。
ANSI版は必要ないらしい。

因みにソース(中の文字列)を以下のようにする場合

// ポインタ取得
CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC);

// UNICODE設定の場合
// UNICODE文字列を使用
pStatic->SetWindowText(_T("Unicode文字列"));

// ANSI設定の場合
// ANSI文字列を使用
pStatic->SetWindowText(_T("ANSI文字列"));

// 明示的にANSI版を使用する場合
pStatic->SetWindowTextA(_T("ANSI文字列"));

// 明示的にUNICODE版を使用する場合
pStatic->SetWindowTextW(_T("Unicode文字列"));

‘L’プレフィックス関連のエラーは出てこなくなります。

Unicode文字セットを使用する場合

マルチバイト文字セットを使用する場合

Unicode版とANSI版の両方の文字列リテラルを扱えるからですかね。

  • Unicode版の場合、_T(“文字”)→L”文字”に展開
  • ANSI版の場合、_T(“文字”)→”文字”に展開

されるためでした。

業務では常に_T(“”)を使うため、いざこの説明するとなるとちょっとわからないんですよね。
ちゃんと勉強しとかないと。

終わりに

以上、スタティックテキストに文字列を設定する方法についてでした。

文字列の型やプロジェクトの設定に応じて適切な関数を選択することで、
スタティックテキストに正しく文字列を設定することができます。

あと関係ないですが、よく画面スクショを撮ってアップロードするとぼやけるんですよね。
何とか対処方法ないものか(;´・ω・)
わからないのが、たまにぼやけることなくアップロードできるのもあるんですが、
違いがわからない。

サイズかな?

追々と…。

コメント

タイトルとURLをコピーしました