提示コードの**// -- コメント部のコードですがなぜ文字化けするのでしょうか? setDraw();ボールドテキスト関数部ですが
まず"あ"と入力したものがマルチバイト文字からwchar_t型文字に変換されます。その後printf();関数でしっかりと"あ"という文字がwchar_t型での状態で確認されています。されで値をmScreenBuffer変数**に代入しているのですがなぜ文字化けするのでしょうか?printf();では普通に表示されるのですが原因がわかりません。また先頭バイトと後方バイトと指定しています。
printf()でデバックしましたがなぜmScreenBuffer変数に値を入れると文字化けするの理解できません
cpp
1#include "DrawCharactor.hpp" 2 3// コンストラクタ 4DrawCharactor::DrawCharactor() 5{ 6 fopen_s(&fp,"Log.txt","w"); //ファイル 7 8 9 //描画開始座標 10 mDraw_start.X = 0; 11 mDraw_start.Y = 0; 12 13 //描画範囲 14 mDraw_size.X = MAX_WIDTH; 15 mDraw_size.Y = MAX_HEIGHT; 16 17 //ウインドウサイズ 18 mRect.Left = (SHORT)0; 19 mRect.Top = (SHORT)0; 20 mRect.Right = (SHORT)MAX_WIDTH; 21 mRect.Bottom = (SHORT)MAX_HEIGHT; 22 23 // バッファーを作成 24 mHandle = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 25 26 SetConsoleActiveScreenBuffer(mHandle); //有効にする 27 28 if (mHandle == INVALID_HANDLE_VALUE){ 29 fprintf(fp, "Invalid: INVALID_HANDLE_VALUE \n"); 30 } 31 32 // 画面バッファサイス変更 33 if (SetConsoleScreenBufferSize(mHandle, mDraw_size) == 0) { 34 fprintf(fp,"Invalid: SetConsoleScreenBufferSize(); \n"); 35 } 36 37 // 画面サイズ変更 38 if (SetConsoleWindowInfo(mHandle, TRUE, &mRect) == 0) { 39 fprintf(fp, "Invalid: SetConsoleWindowInfo(); \n"); 40 } 41} 42 43// バッファーに文字を書き込む 44void DrawCharactor::setDraw(const char* format, ...) 45{ 46 47 va_list ap; 48 char str[MAX_WIDTH]; 49 va_start(ap, format); 50 vsprintf_s(str, sizeof(str), format, ap); 51 va_end(ap); 52 53 wchar_t wc[MAX_WIDTH]; 54 size_t size = sizeof(wc); 55 56 size_t count = sizeof(wc) / sizeof(wchar_t); 57 mbstowcs_s(&size, wc, count, str, count - 1); //マルチ文字をワイド文字に変換 58 59// printf("%zu: [%ls]\n", size, wc); 60// printf("%zu: [%lc]\n", size, wc[0]); 61 62 printf("%ls\n",wc); 63 64 // ----------------------------------------------------------------------------------------------- 65 mScreenBuffer[0][0].Char.UnicodeChar = wc[0]; 66 mScreenBuffer[0][0].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 67 68 mScreenBuffer[0][1].Char.UnicodeChar = wc[0]; 69 mScreenBuffer[0][1].Attributes = FOREGROUND_GREEN | COMMON_LVB_TRAILING_BYTE; 70 // ----------------------------------------------------------------------------------------------- 71 //fprintf(fp, "ああああ\n"); 72} 73 74// 描画 75void DrawCharactor::GenerateOutput() 76{ 77 WriteConsoleOutput(mHandle,mScreenBuffer[0], mDraw_size, mDraw_start, &mRect); //現在のカーソル位置から始まる文字列をコンソール画面バッファーに書き込み 78 // mNowBuffer_height = 0; 79 // mNowBuffer_width = 0; 80 81} 82 83// デストラクタ 84DrawCharactor::~DrawCharactor() 85{ 86 // スクリーンバッファを解放 87 CloseHandle(mHandle); 88 mHandle = NULL; 89 90 fclose(fp); 91 92}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/12/20 00:41
2020/12/20 01:29