72739


`setDraw();`関数ですがなぜ半角スペースを開けて描画されるのでしょうか？引数で文字を"MENU"として入力してその後それを`mScreenBuffer`に値を設定しているのですが何がおかしいのでしょうか？

[![画像の説明をここに入力](https://i.stack.imgur.com/Uw9WB.png)](https://i.stack.imgur.com/Uw9WB.png)

[code]

    #include "DrawCharactor.hpp"
    
    // コンストラクタ
    DrawCharactor::DrawCharactor()
    {
        fopen_s(&fp,"Log.txt","w"); //ファイル
    
        
        //描画開始座標
        mDraw_start.X = 0;
        mDraw_start.Y = 0;
    
        //描画範囲
        mDraw_size.X = MAX_WIDTH;
        mDraw_size.Y = MAX_HEIGHT;
    
        //ウインドウサイズ
        mRect.Left = (SHORT)0;
        mRect.Top = (SHORT)0;
        mRect.Right = (SHORT)MAX_WIDTH;
        mRect.Bottom = (SHORT)MAX_HEIGHT;
    
        // バッファーを作成
        mHandle = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    
        SetConsoleActiveScreenBuffer(mHandle);  //有効にする
    
        if (mHandle == INVALID_HANDLE_VALUE)
        { 
            fprintf(fp, "Invalid: INVALID_HANDLE_VALUE \n"); 
        }
    
        // 画面バッファサイス変更
        if (SetConsoleScreenBufferSize(mHandle, mDraw_size) == 0) 
        { 
            fprintf(fp,"Invalid: SetConsoleScreenBufferSize(); \n"); 
        }
    
        // 画面サイズ変更
        if (SetConsoleWindowInfo(mHandle, TRUE, &mRect) != 0) 
        { 
            fprintf(fp, "Invalid: SetConsoleWindowInfo(); \n"); 
        }    
    
    }
    
    // バッファーに文字を書き込む
    void DrawCharactor::setDraw(const char* format, ...)
    {    
        
        va_list ap;
        char str[MAX_WIDTH];
        va_start(ap, format);
        vsprintf_s(str, sizeof(str), format, ap);
        va_end(ap);
    
        wchar_t wc[MAX_WIDTH];
        size_t size = sizeof(wc);
    
        size_t count = sizeof(wc) / sizeof(wchar_t);
        mbstowcs_s(&size, wc, count, str, count - 1);   //マルチ文字をワイド文字に変換
    
    //    printf("%zu: [%ls]\n", size, wc);
    //    printf("%zu: [%lc]\n", size, wc[0]);
    
        fprintf(fp,"%lc\n",wc[1]);
    
    
    
        // -----------------------------------------------------------------------------------------------
        int  i = 0;
        for (; mNowBuffer_width[mNowBuffer_height] <= MAX_WIDTH; mNowBuffer_width[mNowBuffer_height]++) {
    
            if (wc[i] != L'\0') {
    
                if (mNowBuffer_width[mNowBuffer_height] <= MAX_WIDTH) {
                    mScreenBuffer[mNowBuffer_height][mNowBuffer_width[mNowBuffer_height]].Char.UnicodeChar = wc[i];
                    mScreenBuffer[mNowBuffer_height][mNowBuffer_width[mNowBuffer_height]].Attributes = FOREGROUND_GREEN;
                    mNowBuffer_width[mNowBuffer_height]++;
    
                }
                else
                {
                    fprintf(fp,"一行の文字数を超えています。\n");
                }
                i++;
            }
            else {
                break;
            }
        }
    
        // -----------------------------------------------------------------------------------------------
        //fprintf(fp, "ああああ\n");
    }
    
    // 描画
    void DrawCharactor::GenerateOutput()
    {
        WriteConsoleOutput(mHandle,mScreenBuffer[0], mDraw_size, mDraw_start, &mRect); //現在のカーソル位置から始まる文字列をコンソール画面バッファーに書き込み   
        mNowBuffer_height = 0;
    
        for (int i = 0; i < MAX_HEIGHT; i++)
        {
            mNowBuffer_width[i] = 0;
        }
        
    }
    
    //　デストラクタ
    DrawCharactor::~DrawCharactor()
    {
        // スクリーンバッファを解放
        CloseHandle(mHandle);
        mHandle = NULL;
    
        fclose(fp);
    
    }
    
[/code]


CC BY-SA 4.0
2020-12-18T07:43:23.987
72735
2020-12-18T08:19:41.737
question
c++
WriteConsoleOutput();関数で半角スペースを開けて文字が描画される原因が知りたい。


提示コードの `mNowBuffer_width[mNowBuffer_height]++;`が不要でした。自己解決です。


CC BY-SA 4.0
2020-12-18T08:19:41.737
72739
2020-12-18T08:19:41.737
72735
answer