
/***********************************************/
/* 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で試みた場合は成功しました。ウインドウのサイズより小さいバッファサイズに変更しようとするとエラーになるのでしょうか?入門サイトではバッファを変更してからウインドウサイズを変更するのが鉄則と書かれていました。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
回答ありがとうございます。
そのサイトはブックマークしてて調べたりしているのですが、
英語が苦手で翻訳サイトを利用して見ていて、なんとなくしか理解できません。
ですが、バッファーサイズをウインドウサイズより小さく設定したらエラーとなることが書かれているみたいでした。
なのでウインドウサイズを1x1にするという処理を最初に入れることによって回避できました。
(ウインドウの状態を調べてその値を元に処理をなんたらかんたら。。。というのが正当なやりかたで汎用性もあるのでしょうけど、関数の説明が完璧に理解できないと無理そうなので、1x1にするという苦肉の策を取りました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者です。計算がうまく...
-
プログラミングが分かりません。
-
C言語のエラーについて
-
アセンブリプログラムで特定の...
-
spi 非言語
-
クレーンでのCFブレーキとな...
-
マンションのデータ流用
-
順列、4桁の整数をつくる問題
-
SPI 非言語の問題です
-
Audacityのマイク音量
-
互いに素と負の数
-
rlc直列回路の波形を観測する時...
-
複数のシリンダーの同調化にコ...
-
線形代数 行列の計算 12.2 d6
-
数学の参考書に 「y=8x」は「y...
-
誤まりとは、誤りと主張する者...
-
三相発電機(オルタネーター)...
-
大学の線形代数についての質問...
-
物理の波についてです 時刻12/8...
-
反転増幅回路の周波数特性の理論値
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Expression: nptr != NULL
-
リターンキー又は、スペースキ...
-
getch / putch用のヘッダ
-
TCP/IP: 非ソケットに対するソ...
-
アセンブリプログラムで特定の...
-
C言語プログラミングで・・・
-
C言語のエラーについて
-
'printf':識別子が見つかりませ...
-
C言語 コンパイルエラー(文字...
-
c言語プログラミングで初項を1....
-
c言語についての質問です。
-
加減剰余のオーバーフローについて
-
最も文字数が多い行番号と文字...
-
コンソールAPIのSetConsoleScre...
-
C言語で自作ヘッダーを作ったの...
-
プログラミングが分かりません。
-
C言語のソースコードについて教...
-
クレーンでのCFブレーキとな...
-
SPI 非言語の問題です
-
複数のシリンダーの同調化にコ...
おすすめ情報