
/***********************************************/
/* 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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リターンキー又は、スペースキ...
-
コンソールAPIのSetConsoleScre...
-
c言語プログラミングで初項を1....
-
プログラミングが分かりません。
-
加減剰余のオーバーフローについて
-
C言語 コンパイルエラー(文字...
-
モータの巻線係数って何でしょ...
-
クレーンでのCFブレーキとな...
-
二つの波形の合致を調べる方法は?
-
整合フィルタ(matched filter)...
-
火力発電 蒸気タービンのMSV、C...
-
互いに素と負の数
-
音声を重畳するとは・・・
-
オシロの波形から発振周波数を...
-
数学の問題がわかりません
-
オシロスコープを起動しただけ...
-
順列、4桁の整数をつくる問題
-
等価雑音電力の値について
-
入力容量(Input Capacitance)...
-
【問題画像あり】広義積分が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
プログラミングが分かりません。
-
TCP/IP: 非ソケットに対するソ...
-
リターンキー又は、スペースキ...
-
c言語 select sort
-
0と1のファイルへの書き込み、出力
-
フィボナッチ数列
-
3×3のラテン方陣をつくるプログ...
-
C言語のエラーについて
-
プログラムエラー
-
getch / putch用のヘッダ
-
C言語 遺伝的アルゴリズムでの...
-
大至急です! 1,ターミナルから...
-
C言語 コンパイルエラー(文字...
-
加減剰余のオーバーフローについて
-
C言語初心者です。計算がうまく...
-
'printf':識別子が見つかりませ...
-
分割コンパイルの手順と方法に...
-
C言語で10個の数字を読み込んで...
-
C言語 セグメンテーション違反
おすすめ情報