C++でDOS窓を使ったプログラムを作っています。
コンソールAPIで色設定(青)をして出力を行ったところ、一定の行から別の色(白)に変わってしまいます。
この問題を解決したいと念じ、かれこれニ昼夜考えあぐねております。目はうさぎのやうに真っ赤になってしまいました。是非ともお力添えを頂きたく恐縮ながらお願い申し上げる次第です。
なお、<conio.h>による色設定は代替策として考慮済みです。
環境:
OS windows98
コンパイラ C++Builder6
ソース:
#include <iostream.h>
#include <conio.h>
#include <windows.h>
void main()
{
// 出力コンソールのハンドル
HANDLE m_hConsoleStdOut;
// 出力コンソールのハンドルを取得
m_hConsoleStdOut = ::GetStdHandle
(STD_OUTPUT_HANDLE);
// 前景色・背景色属性を設定
::SetConsoleTextAttribute
(m_hConsoleStdOut, 1 + (0 << 4));
for(int i=0;i<30;i++)
printf("\t%2d hello world・・\n",i);
getch();
}
No.3ベストアンサー
- 回答日時:
環境がまったく異なるので参考情報でしかありませんが…。
WindowsXP pro SP2, VisualC++ 6.0 という環境で実験してみました。なおソースはそのままではコンパイルを通らず、<iostream.h> を <stdio.h> に直しました。
結果は、printf を使っていても何の問題も無く、すべての行が青で表示されました。.exe を dumpbin で調べ見ると printf の呼び出しは解決されていて、WriteConsole が呼ばれていました。
printf はコンパイラ付属のライブラリ(LIBC.LIB)に実装されているようなので、C++Builderとは実装が異なるかもしれません。
不具合の原因として考えられるのは、
(1) C++Builder の printf の不具合
(2) Windows98 の WriteConsole の不具合
(3) Windows98 の command.com の不具合
(4) Windows98 の ansi.sys の不具合
と言ったとこでしょうか…。
問題の切り分けのために .exe を Windows 2000 か XP の PC で実行してみてはいかがでしょう? もし正常動作すれば、原因は (2)-(4) のどれかということになります。色指定は (4) の機能なので、(4) が一番怪しい気がしますが…。
私のほうは逆に家にも会社に 98 の PC が無くて試せていません。もし見つかったら、試してみて続報を入れます。
蛇足:
for(....) {
SetConsoleTextAttribute(...);
printf(...);
}
という具合に一行ごとに色設定するとどうでしょう?
実験までして頂き、本当にありがとうございます。
oldroot2005様の環境(WindowsXP pro SP2, VisualC++ 6.0)では正常に走るのですね。
コンパイラやOSの不具合の可能性までは思い至りませんでした。お陰様で新たな着眼点を得ることができました。
さっそく、会社のXPのPCで試してみることにいたします。
No.2
- 回答日時:
すみません実際に試したりはしてません。
思いついたままです。えーとですね Windows API を使うなら
The SetConsoleTextAttribute function sets the foreground (text) and background color attributes of characters written to the screen buffer by the WriteFile or WriteConsole function
と言う事ですので
WriteConsole
The WriteConsole function writes a character string to a console screen buffer beginning at the current cursor location.
BOOL WriteConsole(
HANDLE hConsoleOutput, // handle to a console screen buffer
CONST VOID *lpBuffer, // pointer to buffer to write from
DWORD nNumberOfCharsToWrite,
// number of characters to write
LPDWORD lpNumberOfCharsWritten,
// pointer to number of characters written
LPVOID lpReserved // reserved
);
を使って Windows API であくまでも突き進むと言う事になるのではないでしょうか。
printf が WriteConsole を呼び出しているのなら良いけども handle の指定はどうなっているのだろうと思ってしまいますね。基本的に違うんじゃないですか。
98 の DOS窓なら基本的に16bitの世界ですから printf とか使うなら
やはり
conio.h の
void textcolor(int newcolor);
void textbackground(int newcolor);
とかを使ったらいいのではないでしょうか。何かなつかしいですね。
もっと DOS らしく行くなら エスケープシーケンス を使うとか・・・
Rohypnol様、貴重なお時間を割いていただきありがとうございます。APIについての基礎も分からず勉強不足を恥じ入るばかりです。事前にコンソールテキストの属性を設定しておかなければならないということですね。またAPIとprintfが相容れないものかもしれないとのご指摘も参考になりました。APIについてもっと理解を深めるよう努力いたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
4の倍数を論理演算で表す。。
-
printf で二進表示を行いたい。
-
%P と %X の違い
-
strcmp
-
プログラミングの問題を教えて...
-
C言語 関数
-
int型 00 を表示するのに0とな...
-
c言語でAからZまでを表示する...
-
C言語の勉強しています。すみま...
-
アドレスの比較について
-
scanfに文字が入力されたときに...
-
2つ分数の四則演算を行うプロ...
-
入力したお金の金額からお札の...
-
printfの出力内の文字をdefine...
-
defineで定数が置き換えられな...
-
空Enterの扱い方
-
printfでSegmentation fault
-
error C2143: 構文エラー : ';'...
-
ブラックジャック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
CTRL+Dでループを抜けるには
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
4の倍数を論理演算で表す。。
-
台形の面積を求めるプログラム
-
8人分のテストの点数を入力し、...
-
コマンドラインに出力した文字...
-
switch分のケースを範囲数?に...
-
(C言語)めちゃくちゃな値にな...
-
テキストカーソル位置の取得
-
strcmp
-
defineで定数が置き換えられな...
-
WM_CLOSEで閉じれないウィンド...
-
%P と %X の違い
-
cshの文字列操作(0埋め)
-
円の面積を求めるプログラミン...
-
printfの出力内の文字をdefine...
おすすめ情報