プロが教えるわが家の防犯対策術!

/***********************************************/
/* console.c */
/* コンソールAPIを抽象化し独自仕様にした関数群 */
/***********************************************/

#include <windows.h>
#include <stdio.h>

#include "color.h"
#include "console.h"

/* グローバル変数 */
static HANDLE hStdOutput, hStdInput;
static HANDLE hBuffer;

/**************************************************************
 新しくスクリーンバッファを作る関数
 引数:無し
 戻り値:
  成功:新しいコンソールスクリーンバッファのハンドル
  失敗:INVALID_HANDLE_VALUE
**************************************************************/
static HANDLE CreateBuffer(void) {
HANDLE hScBf;

hScBf = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);

return hScBf;
}

/**************************************************************
 アクティブなスクリーンバッファをセットする関数
 引数:セットしたいスクリーンバッファのハンドル
 戻り値:
  成功:0以外
  失敗:0
**************************************************************/
static int SetActiveScreen(HANDLE hScBf) {
int result;

result = SetConsoleActiveScreenBuffer(hScBf);

return result;
}

/**************************************************************
 指定したスクリーンバッファのサイズをセットする関数
 引数:セットしたいスクリーンバッファのハンドル
  :x、y バッファのX、Y座標のサイズ
 戻り値:
  成功:0以外
  失敗:0
**************************************************************/
static int SetBufferSize(HANDLE hScBf, short x, short y) {
COORD buffer_size;
int result;

buffer_size.X = x;
buffer_size.Y = y;
result = SetConsoleScreenBufferSize(hScBf, buffer_size);

return result;
}

/************************************************************************
 指定したスクリーンバッファを表示するウインドウのサイズをセットする関数
 引数:セットしたいウインドウに対応するスクリーンバッファのハンドル
  :x、y ウインドウのX、Y座標のサイズ
 戻り値:
  成功:0以外
  失敗:0
************************************************************************/
static int SetWindowSize(HANDLE hScBf, short x, short y) {
SMALL_RECT window_rect;
int result;

window_rect.Left = 0;
window_rect.Top = 0;
window_rect.Right = x - 1;
window_rect.Bottom = y - 1;
result = SetConsoleWindowInfo(hScBf, TRUE, &window_rect);

return result;
}

/**************************************************************
 コンソールの開始関数
 引数:無し
 戻り値:
  成功:0
  失敗:1
**************************************************************/
int ConsoleInit(void) {
int result;

hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdOutput == INVALID_HANDLE_VALUE) {
printf("標準出力ハンドルの取得に失敗しました。(%d)\n", GetLastError());
return -1;
}
hStdInput = GetStdHandle(STD_INPUT_HANDLE);
if (hStdInput == INVALID_HANDLE_VALUE) {
printf("標準入力ハンドルの取得に失敗しました。(%d)\n", GetLastError());
return -1;
}

hBuffer = CreateBuffer();
if (hBuffer == INVALID_HANDLE_VALUE) {
printf("新しいコンソールスクリーンバッファの作成に失敗しました。(%d)\n", GetLastError());
return -1;
}

result = SetBufferSize(hBuffer, 80, 25);
if (result == 0) {
printf("コンソールスクリーンバッファのサイズを変更することができませんでした。(%d)\n", GetLastError());
return -1;
}

result = SetWindowSize(hBuffer, 80, 25);
if (result == 0) {
printf("ウインドウのサイズを変更することができませんでした。(%d)\n", GetLastError());
return -1;
}

result = SetActiveScreen(hBuffer);
if (result == 0) {
printf("新しく作成したコンソールスクリーンバッファを表示することができませんでした。(%d)\n", GetLastError());
return -1;
}

return 0;
}

VC++でコンソールアプリを作ろうと勉強中なのですが、うまくいかないので教えてください。
main関数からConsoleInit関数を呼んでいるのですが、コンソールバッファを作成し、そのバッファのサイズをx80y25に設定しようとするとエラーになり、x160y50で試みた場合は成功しました。ウインドウのサイズより小さいバッファサイズに変更しようとするとエラーになるのでしょうか?入門サイトではバッファを変更してからウインドウサイズを変更するのが鉄則と書かれていました。よろしくお願いします。

A 回答 (1件)

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そのサイトはブックマークしてて調べたりしているのですが、
英語が苦手で翻訳サイトを利用して見ていて、なんとなくしか理解できません。
ですが、バッファーサイズをウインドウサイズより小さく設定したらエラーとなることが書かれているみたいでした。
なのでウインドウサイズを1x1にするという処理を最初に入れることによって回避できました。
(ウインドウの状態を調べてその値を元に処理をなんたらかんたら。。。というのが正当なやりかたで汎用性もあるのでしょうけど、関数の説明が完璧に理解できないと無理そうなので、1x1にするという苦肉の策を取りました。
ありがとうございました。

お礼日時:2019/07/27 17:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!