Windowsのコマンドプロンプトに図形を描画することは可能でしょうか?
というか昔のパソコンってコマンドプロンプトで操作してて、図形の描画が出来ましたよね?あれはどうやって実現していたのか疑問です。普段文字を打ち込む場所に図形を描いていたわけですよね。切り替えられるんでしょうか?まぁ昔のは置いておくとして、今のコマンドプロンプトはどうなんでしょうか。簡単な円や三角形でいいので描いてみたいです。言語はC言語です。
コマンドプロンプトに図形を描きたい
Re: コマンドプロンプトに図形を描きたい
可能です。
http://melpon.org/wandbox/permlink/B0B1hpjCnpq1EMBu
https://ideone.com/w8fOXw
ideone と wandbox ですが、表示ができました。
もしかしたら、環境によって正しく表示できない可能性があります。
http://melpon.org/wandbox/permlink/B0B1hpjCnpq1EMBu
https://ideone.com/w8fOXw
ideone と wandbox ですが、表示ができました。
もしかしたら、環境によって正しく表示できない可能性があります。
初心者です
Re: コマンドプロンプトに図形を描きたい
描いてみました。環境依存性・行儀は知りません。
Windows 7 Home Premium SP1 64ビットで確認。
実行結果
主な参考サイト
Windows 7 Home Premium SP1 64ビットで確認。
#include <stdio.h>
#include <windows.h>
#include <rpc.h>
HWND getConsoleWindowHandle(void) {
static wchar_t title[1000000];
static wchar_t title_text[1000000];
char uuid[100];
unsigned char *p;
UUID uuidData;
HWND hWnd;
/* 今のタイトルを取得 */
if(!GetConsoleTitleW(title, sizeof(title)/sizeof(title[0]))==0)return NULL;
/* 一意なタイトルを生成 */
UuidCreate(&uuidData);
UuidToString(&uuidData, &p);
lstrcpyA(uuid, (char*)p);
RpcStringFree(&p);
/* 一意なタイトルを設定 */
if(SetConsoleTitleA(uuid)==0) return NULL;
Sleep(40);
/* ウィンドウハンドルを取得 */
hWnd = FindWindowA(NULL, uuid);
/* タイトルを戻す */
SetConsoleTitleW(title);
/* 正しいウィンドウハンドルかチェックする */
if (hWnd != NULL) {
Sleep(40);
GetWindowTextW(hWnd, title_text, sizeof(title_text)/sizeof(title_text[0]));
if(lstrcmpW(title, title_text)!=0)return NULL;
}
return hWnd;
}
int main(void) {
HWND hWnd;
HDC hDC;
POINT oldPosition;
HPEN oldPen;
/* 準備 */
hWnd = getConsoleWindowHandle();
hDC = GetDC(hWnd);
oldPen = SelectObject(hDC, GetStockObject(WHITE_PEN));
/* 三角形を描画 */
MoveToEx(hDC, 200, 100, &oldPosition);
LineTo(hDC, 250, 187);
LineTo(hDC, 150, 187);
LineTo(hDC, 200, 100);
/* 円を描画 */
Arc(hDC, 200, 143, 400, 343, 300, 143, 300, 143);
/* 後片付け */
MoveToEx(hDC, oldPosition.x, oldPosition.y, NULL);
SelectObject(hDC, oldPen);
ReleaseDC(hWnd, hDC);
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: コマンドプロンプトに図形を描きたい
みけさんありがとうございます。
凄いですね、コマンドプロンプトにGUI描けるんですね。
ただwindows.hが無ければ無理でしょうか?
凄いですね、コマンドプロンプトにGUI描けるんですね。
ただwindows.hが無ければ無理でしょうか?
Re: コマンドプロンプトに図形を描きたい
gcc (GCC) 4.8.1では、windows.hを使わず、必要なヘッダを直接インクルードすればできました。デスクトップ さんが書きました:ただwindows.hが無ければ無理でしょうか?
もしくは、ヘッダに頼らず、必要な型宣言やプロトタイプ宣言を直接ソースコードに書いてもいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: コマンドプロンプトに図形を描きたい
根本的なところとして,ここで言う「コマンドプロンプト」がMS-DOS等であれば,そもそも現在のものとは全く違う方式で描画が行われていました。デスクトップ さんが書きました:というか昔のパソコンってコマンドプロンプトで操作してて、図形の描画が出来ましたよね?あれはどうやって実現していたのか疑問です。普段文字を打ち込む場所に図形を描いていたわけですよね。切り替えられるんでしょうか?
代表的なものとして,テキスト表示に特化したテキストVRAMを積んでいたことでしょうか。
表示可能な文字は,テキストVRAMで表示できる文字(フォントはROMに記録されている)にほぼ限られた(外字は作れたが)ため,「機種依存文字」などという表現が有効だったりしました。
ちなみに,MS-DOS時代の日本における代表的なマシンであるPC-9800シリーズでは,
・A000:0000から文字コード(基本的にはJIS X 0201/0208のコードに演算を施したもの)を書き込むことによって,文字を出力 (テキストVRAM)
・A800:0000/B000:0000/B800:0000/E000:0000の各オフセットに色コードをセットすることでグラフィックを描画 (グラフィックVRAM)
といった感じでした。
ただ,このままでは使いにくいため,
・文字の出力にはMS-DOSのシステムコール(INT 21H)にいくつか関数(e.g. AH=09H)が用意されていた
・GDCやGRCG, EGCなどという描画用のチップが載っていた (ただし,EGCの仕様は非公開)
といったものがありました。
ただし,同じMS-DOSを使っていても,INT 21H以外の方法は機種毎に異なりましたし,DOS/Vでは文字もグラフィックVRAMに出力するようになっていました。
まぁ,こんなのは現在となっては当時のアプリケーションのコードを読むのでなければ,完全に懐古談でしかありませんが。
Re: コマンドプロンプトに図形を描きたい
PC-9800シリーズあたりはグラフィックキャラクタというものがありましたね。
テキストキャラだけでも組み合わせ次第でかなりの表現ができました。
まだ漢字がふつうに使えなかったころだからできたことですね。
グラフキー - Wikipedia
#PC-8001からあったんだけどなあ
テキストキャラだけでも組み合わせ次第でかなりの表現ができました。
まだ漢字がふつうに使えなかったころだからできたことですね。
グラフキー - Wikipedia
#PC-8001からあったんだけどなあ