ページ 1 / 1
コマンドプロンプトに図形を描きたい
Posted: 2015年6月26日(金) 20:53
by デスクトップ
Windowsのコマンドプロンプトに図形を描画することは可能でしょうか?
というか昔のパソコンってコマンドプロンプトで操作してて、図形の描画が出来ましたよね?あれはどうやって実現していたのか疑問です。普段文字を打ち込む場所に図形を描いていたわけですよね。切り替えられるんでしょうか?まぁ昔のは置いておくとして、今のコマンドプロンプトはどうなんでしょうか。簡単な円や三角形でいいので描いてみたいです。言語はC言語です。
Re: コマンドプロンプトに図形を描きたい
Posted: 2015年6月26日(金) 21:42
by Rittai_3D
可能です。
コード:
#include <stdio.h>
int main( void )
{
printf( "○\n" );
printf( "△\n" );
return 0;
}
http://melpon.org/wandbox/permlink/B0B1hpjCnpq1EMBu
https://ideone.com/w8fOXw
ideone と wandbox ですが、表示ができました。
もしかしたら、環境によって正しく表示できない可能性があります。
Re: コマンドプロンプトに図形を描きたい
Posted: 2015年6月26日(金) 22:50
by みけCAT
描いてみました。環境依存性・行儀は知りません。
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 (17.2 KiB) 閲覧数: 9204 回
主な参考サイト
Re: コマンドプロンプトに図形を描きたい
Posted: 2015年6月26日(金) 23:24
by デスクトップ
みけさんありがとうございます。
凄いですね、コマンドプロンプトにGUI描けるんですね。
ただwindows.hが無ければ無理でしょうか?
Re: コマンドプロンプトに図形を描きたい
Posted: 2015年6月26日(金) 23:43
by みけCAT
デスクトップ さんが書きました:ただ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>
/* 処理本体は同じなので省略 */
Re: コマンドプロンプトに図形を描きたい
Posted: 2015年6月27日(土) 00:00
by YuO
デスクトップ さんが書きました:というか昔のパソコンってコマンドプロンプトで操作してて、図形の描画が出来ましたよね?あれはどうやって実現していたのか疑問です。普段文字を打ち込む場所に図形を描いていたわけですよね。切り替えられるんでしょうか?
根本的なところとして,ここで言う「コマンドプロンプト」が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: コマンドプロンプトに図形を描きたい
Posted: 2015年6月27日(土) 17:37
by ISLe()
PC-9800シリーズあたりはグラフィックキャラクタというものがありましたね。
テキストキャラだけでも組み合わせ次第でかなりの表現ができました。
まだ漢字がふつうに使えなかったころだからできたことですね。
グラフキー - Wikipedia
#PC-8001からあったんだけどなあ