/***********************************************/
/* 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も見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
土曜の昼、学校帰りの昼メシの思い出
週休2日が当たり前の今では懐かしい思い出ですが、昔は土曜日も午前中まで学校や会社がある「半ドン」で、いつもよりちょっと早く家に帰って食べる昼ご飯が、なんだかちょっと特別に感じたものです。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
VC、コンソールアプリ結果のウインドウサイズ
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールAPIのSetConsoleScre...
-
プログラミングが分かりません。
-
C言語のエラーについて
-
c言語プログラミングで初項を1....
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
Expression: nptr != NULL
-
素数について
-
'printf':識別子が見つかりませ...
-
整合フィルタ(matched filter)...
-
物理の波についてです 時刻12/8...
-
複数のシリンダーの同調化にコ...
-
トリガの意味について
-
入力容量(Input Capacitance)...
-
交流、パルス波、バースト波
-
クレーンでのCFブレーキとな...
-
火力発電 蒸気タービンのMSV、C...
-
減衰係数の求め方がわかりません
-
教えてください。
-
(2x-1)2乗=5の答えを解説付き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
Expression: nptr != NULL
-
'printf':識別子が見つかりませ...
-
TCP/IP: 非ソケットに対するソ...
-
C言語のソースコードについて教...
-
プログラミングが分かりません。
-
C言語初心者です。計算がうまく...
-
加減剰余のオーバーフローについて
-
C言語のエラーについて
-
リターンキー又は、スペースキ...
-
最も文字数が多い行番号と文字...
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
素数について
-
エラーの原因がわかりません。
-
getch / putch用のヘッダ
-
C言語 コンパイルエラー(文字...
-
C言語で10個の数字を読み込んで...
-
クレーンでのCFブレーキとな...
-
SPI 非言語の問題です
おすすめ情報