//警告が出ないようにする #pragma warning(disable : 4819) // 目的 // メッセージボックスの表示を変数を使って自由に変更する // マルチバイト文字からUNICODEへの変換の実験 // #include #include #include //ウィンドウハンドル HWND hWnd; LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd,uMsg,wParam,lParam); } } //関数名:InitApp HRESULT InitApp(HINSTANCE hInst) { //ウィンドウクラスの設定 WNDCLASSEX wndclass = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0, 0, hInst, NULL, LoadCursor(NULL,IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), NULL, TEXT("テスト"), NULL }; //ウィンドウクラスの登録 //失敗したらメッセージボックスで警告する if (RegisterClassEx(&wndclass) == 0) return E_FAIL; RECT rt ={0,0,640,480}; AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, FALSE); //ウィンドウの作成 hWnd = CreateWindow( wndclass.lpszClassName, TEXT("テスト・ウインドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rt.right - rt.left, rt.bottom - rt.top, NULL, NULL, wndclass.hInstance, NULL ); //ウィンドウの作成に失敗した場合 if (!hWnd) return E_FAIL; //失敗 ShowWindow(hWnd, SW_SHOWDEFAULT); //ウィンドウの表示 UpdateWindow(hWnd); //更新処理 return S_OK; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { //アプリケーションが失敗した場合 if (FAILED(InitApp(hInstance))) return 0; char l_str[10]; // VC++2005ではCRTのセキュリティ強化という事で、 // strcpyを使いたい場合、セキュリティ強化されたstrcpy_sを使うとよい。 strcpy_s( l_str, "C言語" ); char l_cMsg[250]; // char型 (マルチバイト文字) WCHAR l_wcMsg[250]; // WCHAR型(UNICODE文字) memset( l_cMsg, 0, sizeof(l_cMsg)); memset( l_wcMsg, 0, sizeof(l_wcMsg)); // 問題ないマルチ・バイト文字で表示 wsprintfA( l_cMsg, "テスト", l_str ); wsprintfA( l_cMsg, "%sその1\n", l_cMsg ); wsprintfA( l_cMsg, "%sです。", l_cMsg ); MessageBoxA( NULL, l_cMsg, "エラー", MB_OK ); // 文字化けする // char型(マルチバイト文字)をUNICODEで表示しているため wsprintfW( l_wcMsg, L"テストその2\n%s", l_str ); MessageBoxW( NULL, l_wcMsg, L"エラー", MB_OK ); // マルチバイト文字をUNICODEに変換する実験A→W wsprintfA( l_cMsg, "テストその3" ); MultiByteToWideChar( CP_ACP, // コードページ 0, // 文字の種類を指定するフラグ l_cMsg, // コピー元の文字列(char型) (int)strlen(l_cMsg) + 1, // コピー元の文字列の長さ('\0'までの長さ) l_wcMsg, // コピー先の文字列(WCHAR型) MAX_PATH // バッファのサイズ ); wsprintfW( l_wcMsg, L"%s\nとなります。", l_wcMsg ); MessageBoxW( NULL, l_wcMsg, L"エラー", MB_YESNO | MB_ICONQUESTION ); return 0; }