コマンドプロンプトに図形を描きたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
デスクトップ

コマンドプロンプトに図形を描きたい

#1

投稿記事 by デスクトップ » 4年前

Windowsのコマンドプロンプトに図形を描画することは可能でしょうか?
というか昔のパソコンってコマンドプロンプトで操作してて、図形の描画が出来ましたよね?あれはどうやって実現していたのか疑問です。普段文字を打ち込む場所に図形を描いていたわけですよね。切り替えられるんでしょうか?まぁ昔のは置いておくとして、今のコマンドプロンプトはどうなんでしょうか。簡単な円や三角形でいいので描いてみたいです。言語はC言語です。

Rittai_3D
記事: 524
登録日時: 7年前

Re: コマンドプロンプトに図形を描きたい

#2

投稿記事 by Rittai_3D » 4年前

可能です。

コード:

#include <stdio.h>

int main( void )
{
    printf( "○\n" );
    printf( "△\n" );
    
    return 0;
}
http://melpon.org/wandbox/permlink/B0B1hpjCnpq1EMBu
https://ideone.com/w8fOXw

ideone と wandbox ですが、表示ができました。
もしかしたら、環境によって正しく表示できない可能性があります。
初心者です

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: コマンドプロンプトに図形を描きたい

#3

投稿記事 by みけCAT » 4年前

描いてみました。環境依存性・行儀は知りません。
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;
}
実行結果
komandopuronputo_zukei.png
円や三角形を描いてみた
komandopuronputo_zukei.png (17.2 KiB) 閲覧数: 3591 回
主な参考サイト
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

デスクトップ

Re: コマンドプロンプトに図形を描きたい

#4

投稿記事 by デスクトップ » 4年前

みけさんありがとうございます。

凄いですね、コマンドプロンプトにGUI描けるんですね。
ただwindows.hが無ければ無理でしょうか?

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: コマンドプロンプトに図形を描きたい

#5

投稿記事 by みけCAT » 4年前

デスクトップ さんが書きました:ただwindows.hが無ければ無理でしょうか?
gcc (GCC) 4.8.1では、windows.hを使わず、必要なヘッダを直接インクルードすればできました。
もしくは、ヘッダに頼らず、必要な型宣言やプロトタイプ宣言を直接ソースコードに書いてもいいかもしれません。

コード:

#define RPC_NO_WINDOWS_H
#include <windef.h>
#include <winnt.h>
#include <wincon.h>
#include <stdarg.h>
#include <winbase.h>
#include <wingdi.h>
#include <winuser.h>
#include <rpc.h>

/* 処理本体は同じなので省略 */
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: コマンドプロンプトに図形を描きたい

#6

投稿記事 by YuO » 4年前

デスクトップ さんが書きました:というか昔のパソコンってコマンドプロンプトで操作してて、図形の描画が出来ましたよね?あれはどうやって実現していたのか疑問です。普段文字を打ち込む場所に図形を描いていたわけですよね。切り替えられるんでしょうか?
根本的なところとして,ここで言う「コマンドプロンプト」が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に出力するようになっていました。

まぁ,こんなのは現在となっては当時のアプリケーションのコードを読むのでなければ,完全に懐古談でしかありませんが。

ISLe()

Re: コマンドプロンプトに図形を描きたい

#7

投稿記事 by ISLe() » 4年前

PC-9800シリーズあたりはグラフィックキャラクタというものがありましたね。
テキストキャラだけでも組み合わせ次第でかなりの表現ができました。
まだ漢字がふつうに使えなかったころだからできたことですね。

グラフキー - Wikipedia
#PC-8001からあったんだけどなあ

閉鎖

“C言語何でも質問掲示板” へ戻る