ダイアログ文字化けの原因と対処法

このQ&Aのポイント
  • 初心者がVS2005でWindowsプログラムを始めた際に、ダイアログなどの文字列が文字化けする問題について解説します。
  • 参考書「猫でもわかるwindowsプログラミング」の指示通りに実行しても文字化けするエラーが発生し、デバッグ用のダイアログ表示でも同様の問題が発生します。
  • 文字列に数字を指定する場合、1から9までは正しく表示されますが、10以上の数字は文字化けするという現象が起こります。
回答を見る
  • ベストアンサー

ダイアログなどの文字列が文字化けする

VS2005でWindowsプログラムをし始めたばかりの初心者です。 タイトルのことで質問があります。 参考書として「猫でもわかるwindowsプログラミング」 というのを使っているのですがそのとおりにやっても文字化けするところか エラーでテストランできないです。 たとえば、デバッグ用にダイアログを表示させる方法として { char szBuf[256] wsprintf(szBuf, "x= %d",x); MessageBox(hWnd,szBuf,"Debug",MB_OK); } というものがのっているのですがとりあえず 「空のプロジェクト」を選択しないで普通に動く状態で実行させてみても「型が違うのでキャストしろ」というメッセージが出ます。 それでキャストするとエラーは出ないのですが文字化けします。 もっと簡単に { MessageBox(hWnd,"文字","Debug",MB_OK); } とかしてもやっぱり文字化けします。 しかしなぜか文字列に1から9を指定したときはそのまま表示されます。 10以上は容赦なく文字化けします。 参考書のほうはVS C++.NETを対象としているそうなのですがそのせいかもしれません。 どなたかわかる方よろしくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

VC++は VC2005以降標準でUnicode文字セットを使うようになりました プロジェクトを生成してから プロジェクト > プロパティ 左ペインで 構成プロパティを選択 右ペインの『文字セット』をUnicode文字セットを使用するとなっていrのでこれを『マルチ バイト文字セットを使用する』に変更します 変更してから ビルド > ソリューションのリビルド を実行してみましょう

horino
質問者

お礼

ありがとうございました。 模索しながらやっている状態ですので本当に困ってました。 助かりました。またお世話になることがあるかもしれませんが そのときはどうぞよろしくお願いします。

関連するQ&A

  • ドロップで起動するけどパスは?

    ファイルをEXEにドロップして起動させます。 ドロップしたファイルのパスを GetCommandLine( ) から 取り出すために、" の位置を調べます。 "EXEのパス" ドロップファイルのパス となっているから、2番目の " の位置を調べました。 でも、for でのループが1回で終わってしまいます。 おかしいところを教えてください。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) {  char *p = GetCommandLine();  char str[200];  switch(msg){  case WM_CREATE:   int i;   for(i = 1; p[i] == '"'; i++);{    wsprintf(str, "%d", p[i]);    MessageBox(hWnd, chStr, "", MB_OK);   }   wsprintf(chStr, "%d", i);   MessageBox(hWnd, str, "", MB_OK); //結果は1   wsprintf(chStr, "%#x", p[0]);   MessageBox(hWnd, str, "1文字目", MB_OK); //結果は34   wsprintf(chStr, "%#x", p[1]);   MessageBox(hWnd, str, "2文字目", MB_OK); //結果は67   wsprintf(chStr, "%#x", p[2]);   MessageBox(hWnd, str, "3文字目", MB_OK); //結果は58

  • デバッグについて教えてください

    よろしくお願いします。 サンプルのソースを参考にして、『メモ帳』を作成しています。 プログラムの記述間違いや、コンパイル時のエラーは無いのですが、 出来上がった『メモ帳』に何かを書くと、いきなり 『文書保存の確認部分のメッセージ』が表示され、 ×ボタンで閉じようとすると、こんどは『上書き保存の部分のメッセージ』が表示されます。 こちらも閉じようとして、×ボタンを押すと再び、『上書き保存の部分』の表示となり、いつまでも繰り返します。 そこで、 { char szBuf[256]; wsprintf(szBuf, "x = %d, x"); MessageBox(hWnd, szBuf, "Debug", MB_OK); } と言うメッセージボックスを、『新規作成、ファイルを開く、文書保存の確認、上書き保存などの、各、関数部分に』挿入してデバッグしたのですが、何の変化もありません。 デバッグの方法に間違いがあると思うのですが不慣れなため気づきません。 詳しい方、アドバイスをお願いします。

  • 文字化けを直したい

    visual stadio C++ で、テキストファイルを読み込み、それをウインドウに表示するというプログラムを作っているのですが、表示すると文字化けしてしまいます。 原因がわかりません。 教えてください。 VC++ 2010です。 サイトを見て設定でマルチバイトに変えてあります case IDB_SELECT:{ HDC hDC; errno_t error; static LPCTSTR TEST_STR ;//= _T("左ボタンが押されました"); // ファイルを開くコモンダイアログを作成 if( !GetOpenFileName( &ofn ) ){ MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); return 0; } // 選択されたファイル名を表示 MessageBox( hWnd, filename_full, _T("OK"), MB_OK ); int k=0; fp = fopen( "test.txt", "r" ); if( fp == NULL ) /* 関数が失敗していないか */ { MessageBox( hWnd,"読み込み失敗", _T("bad"), MB_OK ); return 1; /* 異常終了は0以外を返す */ } MessageBox( hWnd,"読み込み成功", _T("good"), MB_OK ); hDC = GetDC( hWnd ); while (fgets(file, 80, fp) != NULL){ TEST_STR = &file[k]; TextOut( hDC, 50, k*15+50, TEST_STR, (int)_tcslen(TEST_STR) ); k++; } fclose(fp); } return 0L; } InvalidateRect(hWnd, NULL, TRUE); // 再描画命令発 return 0L;

  • MessageBoxでの、書式指定を教えて下さい。

    Windowsで、Visual C++6.0を、使っています。 double max; char szBuf[256]; wsprintf(szBuf,"左 Yの最大値は、%d ",max); MessageBox(hWnd, szBuf, "各最大値", MB_OK); 上記を、実行した時、正しい値を表示してくれません。 デバッガーで見ると、maxには、正しい値、768.55というような値が、入っているようです。 %dを、%fとすると fを表示して値を表示しません。 double型の値を表示させるには、どうしたらいいのでしょうか? 教えて下さい。どうぞよろしくお願いします。

  • HKEY_CLASSES_ROOT\.avi

    [HKEY_CLASSES_ROOT\.avi] @="avifile" "Content Type"="video/x-msvideo" の2つの値をメッセージボックスに表示するソースを教えてください。 HKEY hKey; RegOpenKeyEx(HKEY_CLASSES_ROOT, ".avi", 0, KEY_READ, &hKey); wsprintf(str1, "%", ); MessageBox(hWnd, str1, "標準の値", MB_OK); wsprintf(str2, "%", ); MessageBox(hWnd, str2, "コンテンツタイプの値", MB_OK); RegCloseKey(hKey);

  • case で宣言コンパイルエラー

     switch (msg){  case WM_LBUTTONDOWN:   char *p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; がエラーで  switch (msg){  case WM_LBUTTONDOWN:   char *p;   p = new char[1000];   wsprintf(p, "%d" , i);   MessageBox(hWnd , p , "" , MB_OK);   delete[] p;  break; と  switch (msg){  case WM_KEYDOWN:   if( wParam == VK_RETURN ){    char *p = new char[1000];    wsprintf(p, "%d" , i);    MessageBox(hWnd , p , "" , MB_OK);    delete[] p;   }  break; ならエラーじゃなかったんだけど、理由がよく分かりません。 case のすぐ下で宣言と同時に値を代入してはいけないんですか?

  • レジストリの読み込み

    レジストリの読み込みのソースを教えてください。 例えば、 [HKEY_CLASSES_ROOT\.avi] @="avifile" "Content Type"="video/x-msvideo" の2つの値をメッセージボックスに表示するソースを教えてください。 HKEY hKey; RegOpenKeyEx(HKEY_CLASSES_ROOT, ".avi", 0, KEY_READ, &hKey); wsprintf(str1, "%", ); MessageBox(hWnd, str1, "標準の値", MB_OK); wsprintf(str2, "%", ); MessageBox(hWnd, str2, "コンテンツタイプの値", MB_OK); RegCloseKey(hKey);

  • 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); } }

  • windowsプログラム、文字化けする

    windowsプログラム、文字化けする 最近になってwindowsプログラムに興味を持ってやってみようと思い サイトでいざ勉強しようと思ったんですが、サンプルコードをVC++2008で コンパイル実行してみると、すべて文字化けしています。なぜでしょう ちなみにOSはXP、サンプルコードてのが #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Hello World!", "メッセージ", MB_OK); return 0; } メッセージボックスでの文字表示のサンプルみたいですがどうもうまくいきません もう1つ このサンプルをソースファイルの拡張子cppでやるとエラーがでるんですがcだと警告が出るだけなんですが これはいったいなんででしょうか。 すみません、最近こういう勉強を始めたばかりなので。

  • 16進数の表示ができません。

    シリアルポートで受信したバイナリデータを表示させると、 正しい値が出ないのですが、どうしてでしょうか? 受信するデータは16進数で 06 02 81 07 00 bb 01 b4 00 32 なのですが、以下のソースで実行すると、 6 2 ffffff80 7 0 ffffffbb 1 ffffffb4 0 32 と表示されました。 また、「データ受信完了」というメッセージが出ないのですが、 出なくてもデータ受信は出来ているのでしょうか? char szBuf[256]; char rdBuf[10]; char* prdBuf; DWORD dwCount; DWORD dwRead; dwCount = 10; prdBuf = &rdBuf[0]; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE); == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)) MessageBox("データ受信完了"); } } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); } wsprintf(szBuf,"文字 = %x %x %x %x %x %x %x %x %x %x", rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]); MessageBox(szBuf); よろしくお願いします。

専門家に質問してみよう