• ベストアンサー

WINAPI editbox内の文字が文字化けする

プログラムは、ウィンドウ内にエディットボックスを表示するだけのものです。 下のプログラムを実行すると、エディットボックス内に ”繧ィ” と表示されます。また、“エディタ“ と入力すると ”ィ」ソ” と表示されます。 GetWindowTextでテキストを取得すると、MessageBoxには何も表示 されませんでした。 使用しているパソコンはwindows10です。 どうすれば文字化けが解消されるのでしょうか。 #include <stdio.h> #include <windows.h> HINSTANCE hinstance; TCHAR tch[128]; LRESULT CALLBACK winpr(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR lpcmdline,int ncmdshow) { TCHAR szwinClass[]=TEXT("samp1"); TCHAR sztitle[]=TEXT("サンプル"); int width=720; int height=720; WNDCLASSEX wcx; HWND hwnd; MSG msg; hinstance=hinst; wcx.cbSize=sizeof(WNDCLASSEX); wcx.style=CS_HREDRAW | CS_VREDRAW; wcx.hbrBackground=(HBRUSH)(COLOR_WINDOWTEXT+1); wcx.cbClsExtra=0; wcx.cbWndExtra=0; wcx.hIcon=NULL; wcx.hIconSm=NULL; wcx.hCursor=LoadCursor(NULL,IDC_ARROW); wcx.hInstance=hinstance; wcx.lpfnWndProc=winpr; wcx.lpszClassName=szwinClass; wcx.lpszMenuName=sztitle; if(!RegisterClassEx(&wcx)){ MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OK); return 1; } hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,szwinClass,sztitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, width,height, NULL,NULL,hinstance,NULL); if (!hwnd) { MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OKCANCEL); int err=GetLastError(); return 1; } ShowWindow(hwnd,ncmdshow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)>0){ TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT CALLBACK winpr(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam){  HDC hdc; HWND hwndedit; int id; switch(message){ case(WM_CREATE): hwndedit= CreateWindow( TEXT("edit"), TEXT("エディタ"), WS_CHILD | WS_VISIBLE , 10, 10, 200, 30, hwnd, (HMENU)1,hinstance, NULL); return 0; case(WM_CLOSE): GetWindowText(hwndedit,tch,GetWindowTextLength(hwndedit) + 1); MessageBox(hwnd,tch,TEXT("文字化け"),MB_OK); id=    MessageBox(hwnd,TEXT("閉じる"),TEXT("閉じる"),          MB_OKCANCEL); if (id==IDOK){ DestroyWindow(hwnd); } return 0; case(WM_DESTROY): PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,message,wparam,lparam); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率72% (424/583)
回答No.3

https://0mg.hatenadiary.jp/entry/2013/09/16/180124 を参考に、 gcc editbox_u.c -o editbox_u -DUNICODE -mwindows でコンパイルすると、UTF-8のソースでも正常に表示されました。

その他の回答 (2)

  • luka3
  • ベストアンサー率72% (424/583)
回答No.2

〉補足1:このソースはUFT-8で保存しています。 質問者さんが利用しているコンパイラはUTF-8に対応していますか? 何のツールを使って、どのようにコンパイルしているか教えてもらえますか。 〉補足2:文字化けしているのはエディットボックス内に全角入力しているときのみです。半角では文字化けしていません。 半角はシフトJISとUTF-8で同じ文字コードになりますので。 一度、シフトJISで保存してコンパイルしてみてください。

9064
質問者

補足

コンパイラはMinGWで、 gcc edit.c -o edit -lgdi32としてコンパイルしています。 MessageBoxや、親ウィンドウのタイトルは文字化けせずに表示されているので、UFT-8に対応していると思います。 Shift-JISで保存してみたところ、 editbox内に ”・スG・スfEdit” と表示され、 エディタと入力するとやはり ”ィ」ソ” と表示されました。

  • luka3
  • ベストアンサー率72% (424/583)
回答No.1

正常に、エディットボックスに「エディタ」と表示されました。 この問題を検証するには情報が足りません。 私はこのソースをシフトJISで保存し、MinGWというコンパイラを使って、 gcc editbox.c -o editbox -mwindows としてコンパイルしました。 試しにソースをUTF8で保存し、同じコマンドでコンパイルすると、文字化けが発生しましたが、質問者さんのとは違い「繧ィ繝・ぅ繧ソ」と表示されています。 GetWindowTextが失敗したのは hwndedit が毎回初期化されるローカル変数だからです。 一番簡単な解決方法は static で静的変数にすることです。 static HWND hwndedit; それと >GetWindowText(hwndedit,tch,GetWindowTextLength(hwndedit) + 1); これはダメです。バッファオーバーフローが発生します。 GetWindowText(hwndedit, tch, sizeof(tch)); としてください。 Unicodeに対応する場合は GetWindowText(hwndedit, tch, sizeof(tch)/sizeof(TCHAR)); こうかな(ちょっと自信なし)

9064
質問者

補足

回答ありがとうございます。指摘箇所を修正したところ、GetWindowTextは正常に動きました。 補足1:このソースはUFT-8で保存しています。 補足2:文字化けしているのはエディットボックス内に全角入力しているときのみです。半角では文字化けしていません。

関連するQ&A