🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1418閲覧

WriteConsoleOutput();関数で文字が描画されない原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/11 08:24

提示コードの**////** 部の**while();文による無限ループですがなぜWriteConsoleOutput();関数部で何も表示されないのでしょうか?
mWindowBuffer[0].Char.UnicodeChar = wc[0];   mWindowBuffer[0].Attributes = FOREGROUND_GREEN; コードによってしっかり文字が設定していてそのwc変数にも文字が入っているかどうかをしっかり
printf();**して確認しました。

cpp

1#include "stdio.h" 2#include "stdlib.h" 3#include <Windows.h> 4 5#include "KeyInput.hpp" 6 7// ウインドウサイズ 8#define MAX_WIDTH ((int)100) 9#define MAX_HEIGHT ((int)40) 10 11FILE* fp = NULL; 12 13 14void print_(wchar_t wc[],size_t size,const char* format, ... ) 15{ 16 17 //printf("%s\n\n\n\n",format); 18 19 //文字を生成 20 std::string text; //生成した文字を格納 21 va_list ap; 22 23 char str[50]; 24 va_start(ap, format); 25 vsprintf_s(str, sizeof(str), format, ap); 26 va_end(ap); 27 28 setlocale(LC_CTYPE, ""); 29 size_t count = size; 30 mbstowcs_s(&size, wc, count, str, count - 1); 31 32 //printf("%zu: [%ls]\n", size, wc); 33 //printf("っs\n"); 34 35} 36 37 38int main() 39{ 40 fopen_s(&fp,"Log.txt","w"); 41 42 43 44 45 46 HANDLE mhScreen; //ウインドウハンドル 47 COORD mDraw_start; //描画開始位置 48 COORD mDraw_size; //画面のサイズ 49 _SMALL_RECT mRect; //画面の描画範囲 50 int mNowBuffer_width = 0; 51 int mNowBuffer_height = 0; 52 53 mhScreen = nullptr; //ウインドウハンドル 54 55 //描画開始座標 56 mDraw_start.X = 0; 57 mDraw_start.Y = 0; 58 59 //描画範囲 60 mDraw_size.X = MAX_WIDTH; 61 mDraw_size.Y = MAX_HEIGHT; 62 63 //ウインドウサイズ 64 mRect.Left = (SHORT)0; 65 mRect.Top = (SHORT)0; 66 mRect.Right = (SHORT)MAX_WIDTH; 67 mRect.Bottom = (SHORT)MAX_HEIGHT; 68 69 int num = 0; 70 71 // バッファーを作成 72 mhScreen = CreateConsoleScreenBuffer(GENERIC_WRITE |GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 73 74 if (mhScreen == INVALID_HANDLE_VALUE) 75 { 76 fprintf(stderr, "INVALID_HANDLE_VALUE"); 77 } 78 79 80 SetConsoleScreenBufferSize(mhScreen, mDraw_size); // バッファサイズ変更 81 SetConsoleWindowInfo(mhScreen, TRUE, &mRect); // ウィンドウサイズ変更 82 SetConsoleActiveScreenBuffer(mhScreen); //有効化 83 mhScreen = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 84 85 86 CHAR_INFO mWindowBuffer[MAX_HEIGHT] = { 0 }; 87 88 89 90 KeyInput ki; 91 92 93 94 wchar_t wc[100]; 95 int a = 3; 96 print_(wc, sizeof(wc) / sizeof(wchar_t), "あああ: %d", a); 97 98 // printf("ああああ: [ %lc ]\n",wc[0]); 99 100 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 101 while (true) 102 { 103 104 mWindowBuffer[0].Char.UnicodeChar = wc[0]; 105 mWindowBuffer[0].Attributes = FOREGROUND_GREEN; 106 107 mWindowBuffer[1].Char.UnicodeChar = wc[1]; 108 mWindowBuffer[1].Attributes = FOREGROUND_GREEN; 109 110 111 112 113 114 115 116 117 SetConsoleCursorPosition(mhScreen,mDraw_start); 118 WriteConsoleOutput(mhScreen, mWindowBuffer, mDraw_size, mDraw_start, &mRect); //現在のカーソル位置から始まる文字列をコンソール画面バッファーに書き込み 119 FlushConsoleInputBuffer(mhScreen); 120 } 121 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 122 123 124 // スクリーンバッファを解放 125 CloseHandle(mhScreen); 126 mhScreen = NULL; 127 128 129 fclose(fp); 130 131 132 return 0; 133} 134

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • バッファサイズが足りていません
  • 2バイト文字は先頭バイトと後続バイトを教えてあげないと、どこからどこまで描画すればよいかかわかりません。
  • SetConsoleActiveScreenBuffer()の後にCreateConsoleScreenBuffer()を呼び直してmhScreenが別の値になっています。

diff

1 SetConsoleActiveScreenBuffer(mhScreen); //有効化 2- mhScreen = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 3 4(中略) 5 6- CHAR_INFO mWindowBuffer[MAX_HEIGHT] = { 0 }; 7+ CHAR_INFO mWindowBuffer[MAX_WIDTH * MAX_HEIGHT] = { 0 }; 8 9(中略) 10 mWindowBuffer[0].Char.UnicodeChar = wc[0]; 11- mWindowBuffer[0].Attributes = FOREGROUND_GREEN; 12+ mWindowBuffer[0].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 13 14- mWindowBuffer[1].Char.UnicodeChar = wc[1]; 15+ mWindowBuffer[1].Char.UnicodeChar = wc[0]; 16- mWindowBuffer[1].Attributes = FOREGROUND_GREEN; 17+ mWindowBuffer[1].Attributes = FOREGROUND_GREEN | COMMON_LVB_TRAILING_BYTE;

投稿2020/12/11 13:15

編集2020/12/16 06:01
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/16 03:56 編集

CHAR_INFO mWindowBuffer[MAX_HEIGHT * MAX_WIDTH] = { 0 }; mWindowBuffer[0].Char.UnicodeChar = wc[0]; mWindowBuffer[0].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; mWindowBuffer[1].Char.UnicodeChar = wc[1]; mWindowBuffer[1].Attributes = FOREGROUND_GREEN | COMMON_LVB_TRAILING_BYTE; としましたが画面に文字が表示されませんこれはどうしててでしょうか?
SHOMI

2020/12/16 06:02

追記しました。wc[0]とすべきところがwc[1]になっていたのも修正しました。
退会済みユーザー

退会済みユーザー

2020/12/16 12:00 編集

できました。質問ですが日本語か英語文字かを認識する方法はあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問