お願いします…

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

お願いします…

#1

投稿記事 by red____ » 14年前

C言語でライブラリを使いどす窓にメニュー画面を作れと言われました。
どう作っていったらいいかわからず困っています…
簡単なもので良いので例などがあれば参考にしたいと思ってます。
どなたか、サンプルを見せていただけないでしょうか…?
お願いします…(Cは始めたばかりです…)

red____

こんな感じで作りたいのですが…

#2

投稿記事 by red____ » 14年前

1.空き状況の確認

2.チケットの購入.予約

3.取り消し

4.その他

このような感じで表示され、なおかつ色もつけろと言われました。
どなたか、教えてくださる方いましたらご教授願います

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#3

投稿記事 by bitter_fox » 14年前

出力がどういったものかを明示してください。

フォーラムルールに則った質問をお願いします。

サンプルというとこんな感じでしょうか・・・(ライブラリって標準ライブラリかな・・・)

コード:


#include <stdio.h>

void main()
{
    printf("1.読み込み ");
    printf("2.書き込み ");
    printf("3.出力 ");
    printf(">>");
}
[hr][追記]
おっと、重複してしまいましたね。出力に関してはわかりました。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#4

投稿記事 by bitter_fox » 14年前

えっと、色ということですが、それはどういったような色でしょうか??
フォントに標準色以外の色がついてるのか?
それとも、背景に標準色以外の色がついてるのか?
また、出力される文字列ごとにその色は違うのか?

それと、色だけでなく、どの色かも明示してください。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#5

投稿記事 by bitter_fox » 14年前

取りあえず、ConsoleAPIを使ったプログラムを書いてみました。

コード:


#include <windows.h>

void main()
{
	HANDLE hCout = GetStdHandle(STD_OUTPUT_HANDLE); // 標準出力のハンドルを取得する。
	CONSOLE_SCREEN_BUFFER_INFO csbi; // コンソール画面の情報

	GetConsoleScreenBufferInfo(hCout, &csbi); // 画面の情報を取得する

	SetConsoleTextAttribute(hCout, FOREGROUND_RED); // 前面(文字)を赤に変更
	printf("赤\n");
	SetConsoleTextAttribute(hCout, FOREGROUND_BLUE); // 青
	printf("青\n");
	SetConsoleTextAttribute(hCout, FOREGROUND_GREEN); // 緑
	printf("緑\n");

	SetConsoleTextAttribute(hCout, FOREGROUND_RED | FOREGROUND_GREEN); // or演算で黄色に変更
	printf("黄色\n");

	SetConsoleTextAttribute(hCout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // FOREGROUND_INTENSITYを指定することで協調表示
	printf("強調\n");

	SetConsoleTextAttribute(hCout, BACKGROUND_BLUE | BACKGROUND_INTENSITY |
		FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN); // 背景を青に変更して強調表示に、文字列は白に
	printf("背景強調                                ");

	SetConsoleTextAttribute(hCout, csbi.wAttributes); // 最初に取得した画面情報の色に戻して終了する(これがないとプログラムが終わっても色が変わったままになってしまう。)
}


red____

皆様

#6

投稿記事 by red____ » 14年前

ルールを良く見ず、すみませんでした。

今は明解C言語のテキストを見て勉強してます。
ライブラリは…、よくわかりませんが標準かと思います…
library.c .hは担任からもらい、それを使えと言われました。main.cもサンプルはもらったのですが自分で作れと言われ…
どう作ったらいいかわからない状況です…
まずは、どす窓に先程の項目の表示かつ、字に色をつけろというのが指示です…

どんな感じでしたらいいかわからず、ルールを見ないでトピ立てしてしまい申し訳ありませんでした…

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 皆様

#7

投稿記事 by bitter_fox » 14年前

red____ さんが書きました:ライブラリは…、よくわかりませんが標準かと思います…
library.c .hは担任からもらい、それを使えと言われました。main.cもサンプルはもらったのですが自分で作れと言われ…
library.c .hを担任からもらったんですよね??
であれば、それは標準ではないですね。(あくまで担任からもらったライブラリがですが・・・)
また、そのライブラリにどういった関数があるのかわからないのでその二つのコードをここに載せていただけますでしょうか??
その際は、codeタグで囲っていただきますようにお願いします。
red____ さんが書きました:まずは、どす窓に先程の項目の表示かつ、字に色をつけろというのが指示です…
文字に色をつけるのですね?わかりました。
ではその色の指定はありますでしょうか??

また、平行して普通に表示するプログラムも作ってみてください。

red____

Re: お願いします…

#8

投稿記事 by red____ » 14年前

無知ですみません…codeタブで囲むとはどのようなことでしょうか…?

色はアカです…

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#9

投稿記事 by bitter_fox » 14年前

red____ さんが書きました:無知ですみません…codeタブで囲むとはどのようなことでしょうか…?
[code=c] <== これを、コードの先頭に、(codeタグをつけると以下のように勝手に表示されてしまうので、codeタグの始点の=を全角にしていますが、正しくは半角です。)

#include <stdio.h>

void main()
{
printf("aaa");
}
[/code] <==これをコードの末端に、付けます。
このようにすると、

コード:


#include <stdio.h>

void main()
{
    printf("aaa");
}
といった風に表示されます。
red____ さんが書きました: 色はアカです…
了解しました。
それでは、返信お待ちしております。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: お願いします…

#10

投稿記事 by softya(ソフト屋) » 14年前

red____ さんが書きました:無知ですみません…codeタブで囲むとはどのようなことでしょうか…?
フォーラムルールという赤い囲みの中に書かれていることをお読みください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

red____

Re: お願いします…

#11

投稿記事 by red____ » 14年前

タグで囲みました。 by softya(ソフト屋)

コード:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <tchar.h>

#pragma comment(lib, "winmm.lib")  // mciSendCommand使用
#pragma warning( disable : 4996 )

/********** 休止する **********/
// 引数
// int ms : 休止するミリ秒
//
// 戻り値
// なし
void wait( int ms )
{
	_sleep( ms );
}


/********** 乱数を初期化する **********/
// 引数
// なし
//
// 戻り値
// なし
void initrandom( void )
{
	srand( (unsigned int)time( NULL ) );
	rand();
}



/********** 乱数を得る **********/
// 引数
// int x : 乱数の範囲
//
// 戻り値
// int型:乱数
int random( int x )
{
	return (int)((double)rand() / 32768.0 * (double)x);
}



/********** 画面の文字をすべて消す **********/
// 引数
// なし
//
// 戻り値
// なし
void cls( void )
{
    COORD  coset;
    HANDLE hOut;
    DWORD dwWritten;
    WORD wAttribute;    

    CONSOLE_SCREEN_BUFFER_INFO cinf;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hOut, &cinf);

    coset.X = 0;
    coset.Y = 0;
    wAttribute = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
    
    if (FillConsoleOutputCharacter(hOut, ' ', cinf.dwSize.X * cinf.dwSize.Y, coset, &dwWritten) ==0)
        return;
    SetConsoleTextAttribute(hOut, wAttribute);
    if (FillConsoleOutputAttribute(hOut, wAttribute, cinf.dwSize.X * cinf.dwSize.Y, coset, &dwWritten) == 0)
        return;

    return;
}



/********** 文字の色を設定する **********/
// 引数
// int color : 文字の色
//
// 戻り値
// なし
void color( int color )
{
    HANDLE hOut;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute( hOut, (WORD)color );
}



/********** 文字描画位置を設定する **********/
// 引数
// int x : Y座標 列 0~79の80行
// int y : x座標 行 0~24の25行
//
// 戻り値
// なし
void locate( int x, int y )
{
    HANDLE hOut;
    COORD co;

    co.X = x;
    co.Y = y;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, co);
}



/********** キー入力を得る **********/
// 引数
// なし
//
// 戻り値
// int型:0:上 1:右 2:下 3:左 4:スペース 5:Enter 
int getkey( void )
{
	int input;
	int ret = -1;


	/*** キー入力を得る ***/
	input = getch();

	/*** キーを調べる ***/
	/* シフトキーが押されたとき */
	if( input == 0 ){
		getch();
	}
	else{
		/* カーソルキーが押されたとき */
		if( input == 224 ){
			input = getch();
			switch( input ){
			case 72: // 上
				ret = 0;
				break;
			case 77: // 右
				ret = 1;
				break;
			case 80: // 下
				ret = 2;
				break;
			case 75: // 左
				ret = 3;
				break;
			default: // エラー
				break;
			}
		}
		else{
			/* 一般のキー */
			switch( input ){
			case ' ': // space
				ret = 4;
				break;
			case 13:  // enter
				ret = 5;
				break;
			default:
				break;
			}
		}
	}

	return  ret;
}



/********** 押されているキーを得る(入力待ちなし) **********/
// 引数
// なし
//
// 戻り値
// int型:0:上 1:右 2:下 3:左 4:スペース 5:Enter 
int pushkey( void )
{
	int input;
	int ret = -1;


	/*** キー入力が無ければ戻る ***/
	if( !kbhit() ){
		return ret;
	}

	/*** キー入力を得る ***/
	input = getch();

	/*** キーを調べる ***/
	/* シフトキーが押されたとき */
	if( input == 0 ){
		getch();
	}
	else{
		/* カーソルキーが押されたとき */
		if( input == 224 ){
			input = getch();
			switch( input ){
			case 72: // 上
				ret = 0;
				break;
			case 77: // 右
				ret = 1;
				break;
			case 80: // 下
				ret = 2;
				break;
			case 75: // 左
				ret = 3;
				break;
			default: // エラー
				break;
			}
		}
		else{
			/* 一般のキー */
			switch( input ){
			case ' ': // space
				ret = 4;
				break;
			case 13:  // enter
				ret = 5;
				break;
			default:
				break;
			}
		}
	}

	return  ret;
}


/********** ドライブを開く **********/
// 引数
// なし
//
// 戻り値
// なし
void opentray( void )
{
	mciSendString( _TEXT("set cdaudio door open"), NULL, 0, NULL );
}
 

red____

Re: お願いします…

#12

投稿記事 by red____ » 14年前

コード:

#ifndef __LIBRARY_H__
#define __LIBRARY_H__
#ifdef __cplusplus
extern "C"{
#endif


/*---------------------------------------------------------------------------*/
/*                              プロトタイプ宣言                             */
/*-------------------------------------+-------------------------------------*/
/***** 乱数 *****/
void initrandom( void );		/* 乱数を初期化する                         */
int random( int x );			/* 乱数を得る                               */

/***** テキスト制御 *****/
void cls( void );				/* 画面の文字を全て消す                     */
void locate( int x, int y );	/* 文字描画位置を指定する x:半角幅 y:全角幅 */
void color( int color );		/* 文字の色を設定する(0~255)             */

/***** キー入力 *****/
int getkey( void );				/* キー入力を得る(入力待ちあり)           */
								/* 0:上 1:右 2:下 3:左 4:スペース 5:Enter   */
								/* 上記以外のキーが押されたら -1            */
int pushkey( void );			/* 押されているキーを得る(入力待ちなし)   */
								/* 0:上 1:右 2:下 3:左 4:スペース 5:Enter   */
								/* 上記以外のキーが押されたら -1            */
/***** 他 *****/
void wait( int ms );			/* 休止する                          */
void opentray( void );			/* CDドライブを開く							*/


#ifdef __cplusplus
}
#endif
#endif //__LIBRARY_H__
 
これで、出来てますでしょうか?
liburary hです。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#13

投稿記事 by bitter_fox » 14年前

えっと、library.cの方がうまくcodeタグで囲めてないですね。。。
プレビュー機能を使って意図した表示になっているか確認してから投稿していただきますようにお願いします。

取りあえず、サンプルを書いてみました、

コード:


#include <stdio.h>
#include "library.h"

#define RED FOREGROUND_RED

int main()
{
	color(RED);
	printf("Hello World");

	return 0;
}
それから、このライブラリには、変更した色を元に戻す関数がありませんね。
[hr][追記]
softyaさん>>編集、ありがとうございます。
[修正]
main関数の戻り値をvoidにしていたので修正。

red____

Re: お願いします…

#14

投稿記事 by red____ » 14年前

コード:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <tchar.h>

#pragma comment(lib, "winmm.lib")  // mciSendCommand使用
#pragma warning( disable : 4996 )

/********** 休止する **********/
// 引数
// int ms : 休止するミリ秒
//
// 戻り値
// なし
void wait( int ms )
{
	_sleep( ms );
}


/********** 乱数を初期化する **********/
// 引数
// なし
//
// 戻り値
// なし
void initrandom( void )
{
	srand( (unsigned int)time( NULL ) );
	rand();
}



/********** 乱数を得る **********/
// 引数
// int x : 乱数の範囲
//
// 戻り値
// int型:乱数
int random( int x )
{
	return (int)((double)rand() / 32768.0 * (double)x);
}



/********** 画面の文字をすべて消す **********/
// 引数
// なし
//
// 戻り値
// なし
void cls( void )
{
    COORD  coset;
    HANDLE hOut;
    DWORD dwWritten;
    WORD wAttribute;    

    CONSOLE_SCREEN_BUFFER_INFO cinf;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hOut, &cinf);

    coset.X = 0;
    coset.Y = 0;
    wAttribute = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
    
    if (FillConsoleOutputCharacter(hOut, ' ', cinf.dwSize.X * cinf.dwSize.Y, coset, &dwWritten) ==0)
        return;
    SetConsoleTextAttribute(hOut, wAttribute);
    if (FillConsoleOutputAttribute(hOut, wAttribute, cinf.dwSize.X * cinf.dwSize.Y, coset, &dwWritten) == 0)
        return;

    return;
}



/********** 文字の色を設定する **********/
// 引数
// int color : 文字の色
//
// 戻り値
// なし
void color( int color )
{
    HANDLE hOut;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute( hOut, (WORD)color );
}



/********** 文字描画位置を設定する **********/
// 引数
// int x : Y座標 列 0~79の80行
// int y : x座標 行 0~24の25行
//
// 戻り値
// なし
void locate( int x, int y )
{
    HANDLE hOut;
    COORD co;

    co.X = x;
    co.Y = y;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, co);
}



/********** キー入力を得る **********/
// 引数
// なし
//
// 戻り値
// int型:0:上 1:右 2:下 3:左 4:スペース 5:Enter 
int getkey( void )
{
	int input;
	int ret = -1;


	/*** キー入力を得る ***/
	input = getch();

	/*** キーを調べる ***/
	/* シフトキーが押されたとき */
	if( input == 0 ){
		getch();
	}
	else{
		/* カーソルキーが押されたとき */
		if( input == 224 ){
			input = getch();
			switch( input ){
			case 72: // 上
				ret = 0;
				break;
			case 77: // 右
				ret = 1;
				break;
			case 80: // 下
				ret = 2;
				break;
			case 75: // 左
				ret = 3;
				break;
			default: // エラー
				break;
			}
		}
		else{
			/* 一般のキー */
			switch( input ){
			case ' ': // space
				ret = 4;
				break;
			case 13:  // enter
				ret = 5;
				break;
			default:
				break;
			}
		}
	}

	return  ret;
}



/********** 押されているキーを得る(入力待ちなし) **********/
// 引数
// なし
//
// 戻り値
// int型:0:上 1:右 2:下 3:左 4:スペース 5:Enter 
int pushkey( void )
{
	int input;
	int ret = -1;


	/*** キー入力が無ければ戻る ***/
	if( !kbhit() ){
		return ret;
	}

	/*** キー入力を得る ***/
	input = getch();

	/*** キーを調べる ***/
	/* シフトキーが押されたとき */
	if( input == 0 ){
		getch();
	}
	else{
		/* カーソルキーが押されたとき */
		if( input == 224 ){
			input = getch();
			switch( input ){
			case 72: // 上
				ret = 0;
				break;
			case 77: // 右
				ret = 1;
				break;
			case 80: // 下
				ret = 2;
				break;
			case 75: // 左
				ret = 3;
				break;
			default: // エラー
				break;
			}
		}
		else{
			/* 一般のキー */
			switch( input ){
			case ' ': // space
				ret = 4;
				break;
			case 13:  // enter
				ret = 5;
				break;
			default:
				break;
			}
		}
	}

	return  ret;
}


/********** ドライブを開く **********/
// 引数
// なし
//
// 戻り値
// なし
void opentray( void )
{
	mciSendString( _TEXT("set cdaudio door open"), NULL, 0, NULL );
}
すみませんでした。
library.cです。
すごい初歩的な質問で申し訳ありませんが、プログラムを作る上でlibraryは使わないと実行できないのでしょうか?
何のために使ってるかがいまいち理解できなくて…

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#15

投稿記事 by bitter_fox » 14年前

red____ さんが書きました: すみませんでした。
library.cです。
すごい初歩的な質問で申し訳ありませんが、プログラムを作る上でlibraryは使わないと実行できないのでしょうか?
何のために使ってるかがいまいち理解できなくて…
使わないと実行できないです。(libraryの中身を自前で用意したら別ですが・・・)

何のためかというと、一度ライブラリの関数内を見て行ってみてください。
すると、中でやってることが難しい関数がいくつかありますね。(たとえばcls関数)
この関数を自力で書くとなると大変じゃないですか??
大変だから、他の人(今回は先生)がライブラリという形にまとめて、使いたい人は、中身を考えずにそのライブラリの関数を呼び出すだけで思いのことができてしまいます。
(つまりは、楽するためです。)
(他にも、ライブラリにする利点は、再利用が効く関数あったらそれを使うたびに中身まで書くのは時間の無駄ですよね??だからライブラリにして後は、呼び出すだけでいいようにするなどがあります。)

[hr][追記]
ん、「何のために使ってるかが今一理解できなくて」というのは、どの処理をするためにということなのかな・・・?
であるなら、color関数を使う(色を変える)ためにです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: お願いします…

#16

投稿記事 by softya(ソフト屋) » 14年前

コンソールで文字色を変えたりるには、WindowsOSのお世話にならないといけません。
ただ、そのWindowsOSとのインターフェイス関数(WindowsAPIあるいはWin32API)は色々とややこしいので、libraryと言う形で先生が難しいところを隠してくれているのです。
もちろんlibraryを使わずに、WindowsAPIを直接使うことも出来ますがlibrary内に書かれていることは理解できますでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

red____

Re: お願いします…

#17

投稿記事 by red____ » 14年前

library内は理解できていないのが現状です…どういう風に理解を深めて行くのがいいのでしょうか…?

red____

Re: お願いします…

#18

投稿記事 by red____ » 14年前

コード:

#include <stdio.h>
#include "library.h"


int main( void )
{
	int		i, j;
	int		key = 0;
	int     gyou;

	/*** 画面枠を表示 ***/
	color(17);
	for( i = 0; i < 80 - 1 ; i++ )
		printf(" ");					/* 半角スペース */
	putchar('\n');
 

	for( i = 0; i < 25 - 3; i++ )	{
		color(17);
		printf(" ");					/* 半全角スペース */
		color(2);
		for( j = 0; j < 80 - 3; j++)
			printf(" ");				/* 半角スペース */
		color(17);
		printf(" ");					/* 半角スペース */
		putchar('\n');
	}	
	color(17);
	for( i = 0; i < 80 - 1; i++ )
		printf(" ");					/* 半角スペース */
	putchar('\n');


	/*** タイトル表示 ***/
	color( 12 );			/* 白文字設定 */
	gyou( 15,  3 );       /* [列, 行]で指定 */
	printf("画面サンプルタイトル");

	/*** サブメニュー表示 ***/
	color( 11 );
	gyou( 20,  6 );       /* [列, 行]で指定 */
	printf("1.サブメニュー");
	gyou( 20,  8 );       /* [列, 行]で指定 */
	printf("2.サブメニュー");
	gyou( 20,  10 );       /* [列, 行]で指定 */
	printf("3.サブメニュー");
	gyou( 20,  12 );       /* [列, 行]で指定 */
	printf("4.サブメニュー");
	gyou( 20,  14 );       /* [列, 行]で指定 */
	printf("5.サブメニュー");
	color( 15 );
	gyou( 20,  17);       /* [列, 行]で指定 */
	printf("9.終了");


	/*** 画面クリア ***/
	color(7);				/* 白文字設定 */
	gyou( 20, 21 );       /* [列, 行]で指定 */
	printf( "Hit any key (clear screen)" );

	/* 入力待ちとして使う(値はどうでもいい) */
	key = getkey();

	/* 画面のクリア */
	cls();
	gyou( 0, 0 );       /* [列, 行]で指定 */
	return 0;
}
これがサンプルでもらった画面の表示例です…

red____

Re: お願いします…

#19

投稿記事 by red____ » 14年前

すいません。間違えました
こっちが正しいサンプルです

コード:

#include <stdio.h>
#include "library.h"


int main( void )
{
	int		i, j;
	int		key = 0;

	/*** 画面枠を表示 ***/
	color(17);
	for( i = 0; i < 80 - 1 ; i++ )
		printf(" ");					/* 半角スペース */
	putchar('\n');
 

	for( i = 0; i < 25 - 3; i++ )	{
		color(17);
		printf(" ");					/* 半全角スペース */
		color(2);
		for( j = 0; j < 80 - 3; j++)
			printf(" ");				/* 半角スペース */
		color(17);
		printf(" ");					/* 半角スペース */
		putchar('\n');
	}	
	color(17);
	for( i = 0; i < 80 - 1; i++ )
		printf(" ");					/* 半角スペース */
	putchar('\n');


	/*** タイトル表示 ***/
	color( 12 );			/* 白文字設定 */
	locate( 15,  3 );       /* [列, 行]で指定 */
	printf("画面サンプルタイトル");

	/*** サブメニュー表示 ***/
	color( 11 );
	locate( 20,  6 );       /* [列, 行]で指定 */
	printf("1.サブメニュー");
	locate( 20,  8 );       /* [列, 行]で指定 */
	printf("2.サブメニュー");
	locate( 20,  10 );       /* [列, 行]で指定 */
	printf("3.サブメニュー");
	locate( 20,  12 );       /* [列, 行]で指定 */
	printf("4.サブメニュー");
	locate( 20,  14 );       /* [列, 行]で指定 */
	printf("5.サブメニュー");
	color( 15 );
	locate( 20,  17);       /* [列, 行]で指定 */
	printf("9.終了");


	/*** 画面クリア ***/
	color(7);				/* 白文字設定 */
	locate( 20, 21 );       /* [列, 行]で指定 */
	printf( "Hit any key (clear screen)" );

	/* 入力待ちとして使う(値はどうでもいい) */
	key = getkey();

	/* 画面のクリア */
	cls();
	locate( 0, 0 );       /* [列, 行]で指定 */
	return 0;
}
これに似た感じで良いので作りたいのですが…作り方がいまいちわかりません…ご教授お願いします

アバター
さかまき
記事: 92
登録日時: 14年前

Re: お願いします…

#20

投稿記事 by さかまき » 14年前

一番はじめに
>簡単なもので良いので例などがあれば参考にしたいと思ってます。
>どなたか、サンプルを見せていただけないでしょうか…?

で始まって、上記に簡単どころかとても親切なコメント付きのサンプルがある訳ですが
少しでも理解しようと解読の努力をなさった結果、いまいちわからないのでしたら
サンプルのどこがいまいちわからないのかを具体的に書いて、教えを請いましょう。

「いまいち」だから、すべてがわからない、何を聞いてよいかもわからない訳ではないですよね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: お願いします…

#21

投稿記事 by softya(ソフト屋) » 14年前

libray.cにある関数をサンプルプログラム内に展開してみると少しは分かると思います。
ただ、長くなるのとWin32APIは初心者にはかなり難度が高いと思います。
libray.cのcolor関数なら次のような内容ですね。

コード:

void color( int color )
{
    HANDLE hOut;
 
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute( hOut, (WORD)color );
}
「GetStdHandle 関数」
http://msdn.microsoft.com/ja-jp/library/cc429347.aspx
「SetConsoleTextAttribute 関数」
http://msdn.microsoft.com/ja-jp/library/cc429756.aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: お願いします…

#22

投稿記事 by bitter_fox » 14年前

red____ さんが書きました: library内は理解できていないのが現状です…どういう風に理解を深めて行くのがいいのでしょうか…?
理解できてないとのことですが、それはどのあたりがでしょうか?
理解を深めるためには一行一行にコメントを付けて行ってみてください。
(と言っても、ConsoleAPIを使ってるところがあるので、それ系の知識が必要なのですが・・・)

コード:

#include <stdio.h>
#include "library.h"

int main( void )
{
	int		i, j;
	int		key = 0;


	/*** 画面枠を表示 ***/
	/* 画面を用意する */
	{
		/* 画面の枠(上) */
		{
			color(17);                     // 背景色を青に
			for( i = 0; i < 80 - 1 ; i++ ) // 79回スペースを出力する
				printf(" ");               // スペースで枠を表現
			putchar('\n');
		}
 

		/* 画面の枠(真ん中) */
		{
			for( i = 0; i < 25 - 3; i++ )	{
				color(17);   // 背景色を青にして(文字色も一応青)
				printf(" "); // スペースで枠を表現(先頭)

				color(2);        // 背景色を黒・文字色を緑にする(文字色を緑にする意図は不明)
				for( j = 0; j < 80 - 3; j++)
					printf(" "); //半角スペースで中の部分を表現

				color(17); // 背景色を青にして(文字色も一応青)
				printf(" "); // スペースで枠を表現(終末)

				putchar('\n'); // 次の行へ
			}	
		}

		/* 画面の枠(下) */
		{
			color(17);                    // 背景色を青に
			for( i = 0; i < 80 - 1; i++ ) // 79回スペースを出力する
				printf(" ");              // スペースで枠を表現
			putchar('\n');
		}
	} // ここまでは画面の用意をしているので出力する内容とはさして関係がない

	/* 出力 */
	{
		/*** タイトル表示 ***/
		color( 12 );			        /* 白文字設定 */ // ←赤文字(輝)
		locate( 15,  3 );               // 左から15文字目、上から3行目の位置から
		printf("画面サンプルタイトル"); // 出力

		/*** サブメニュー表示 ***/
		color( 11 );                // 文字色を水色(輝)に変更
		locate( 20,  6 );           // 20, 6の位置に
		printf("1.サブメニュー"); // 出力

		// 以下略
		locate( 20,  8 );       /* [列, 行]で指定 */
		printf("2.サブメニュー");
		locate( 20,  10 );       /* [列, 行]で指定 */
		printf("3.サブメニュー");
		locate( 20,  12 );       /* [列, 行]で指定 */
		printf("4.サブメニュー");
		locate( 20,  14 );       /* [列, 行]で指定 */
		printf("5.サブメニュー");
		color( 15 );
		locate( 20,  17);       /* [列, 行]で指定 */
		printf("9.終了");
	} // ここを変更することで、出力する内容をを変更できる



	// 入力待ちにする
	color(7);				/* 白文字設定 */
	locate( 20, 21 );       /* [列, 行]で指定 */
	printf( "Hit any key (clear screen)" );

	/* 入力待ちとして使う(値はどうでもいい) */
	key = getchar();

	// 以降は画面の後始末をしている。
	/* 画面のクリア */
	cls();
	locate( 0, 0 );       /* [列, 行]で指定 */
	return 0;
}
取りあえず、もう少しコメントを付けてみました。
50行目~71行目を変更すると、出力する内容を変更することができます。

閉鎖

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