複数ウィンドウ表示の仕方

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

複数ウィンドウ表示の仕方

#1

投稿記事 by anten » 6年前

趣味でDirectXでゲームを作っているのですが、デバッグのためゲーム画面に変数の値を表示しているのですが文字の色が背景やキャラクターの色と重なって見えません。
なので、ゲームウィンドウとは別にウィンドウ(cmdみたいなもの)を立ち上げてそこに変数の数値を表示したいのですが可能なんでしょうか?
もしできるなら、作り方のサイトか2ウィンドウの作り方を教えてもらえたらうれしいです。
説明が下手ですみません;;

かずま

Re: 複数ウィンドウ表示の仕方

#2

投稿記事 by かずま » 6年前

anten さんが書きました:なので、ゲームウィンドウとは別にウィンドウ(cmdみたいなもの)を立ち上げてそこに変数の数値を表示したいのですが可能なんでしょうか?
プログラムの内容はそのままで、
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) を
int main() に変えると、起動時に cmd.exe が開き、
printf で変数の値などを表示できませんか?

参照魚
記事: 109
登録日時: 6年前

Re: 複数ウィンドウ表示の仕方

#3

投稿記事 by 参照魚 » 6年前

CreateWindowをクラス名を変えて呼べばウインドウ自体は複数作成できると思います。ちょっと詳細が思い出せないのですが、DirectXと共存させる場合はスレッドを分けた方がよいらしいです。自分はメインのゲームのスレッドのデバッグ情報の文字列をバッファのワークに貯めておいて、サブのデバッグ表示用のスレッドで一括で表示しています。バッファのワークに同時にアクセスしないように単純なフラグで切り替えています。

参照魚
記事: 109
登録日時: 6年前

Re: 複数ウィンドウ表示の仕方

#4

投稿記事 by 参照魚 » 6年前

printfなら下記の方法でできます。

コード:

AllocConsole();
freopen(   "CONOUT$", "w", stdout );

printf( "hello world" );

FreeConsole();

Math

Re: 複数ウィンドウ表示の仕方

#5

投稿記事 by Math » 6年前

過去に何度も説明をしています(^^;
以下の通りです。( Windows10、VS2017Community 使用 )

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    AllocConsole();                                        // コンソール
    FILE* out = 0; freopen_s( &out, "CON", "w", stdout ); // stdout
    FILE* in = 0; freopen_s( &in, "CON", "r", stdin );   // stdin


    ChangeWindowMode( TRUE );                         // ウィンドウモード

    printf("DXDXライブラリ初期化:開始\n");
    DxLib_Init();                                  // DXライブラリ初期化
    printf("DXDXライブラリ初期化:終了\n");

    DrawString(30, 20, "DxLib: Hello World!", GetColor(255, 255, 255)); // 文字を書く

    printf("Hello World!\n");

    printf("%d\n",12345);

    WaitKey();    // キー入力があるまで待機
    DxLib_End(); // DXライブラリ終了処理

               // コンソール解放
    fclose( out ); fclose( in ); FreeConsole();
    return 0;
} 
http://www2.koyoen.birdview.co.jp/~abcxyz/の.png

Math

Re: 複数ウィンドウ表示の仕方

#6

投稿記事 by Math » 6年前

[注] Win32コンソールアプリケーションとして設定すれば コンソールより起動できます。
[Windows10、VS2017Community,  Developer Command Prompt for VS2017 使用]

g.bat

コード:

nmake -f g.mak
g.mak

コード:

TARGETNAME=g1

C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT  /Id:\dxlib /D "WIN32" /D "NDEBUG" /W3 

LINK_FLAGS=/SUBSYSTEM:CONSOLE /LIBPATH:d:\dxlib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" 

ALL:
	cl $(C_FLAGS) $(TARGETNAME).cpp
	link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj
	$(TARGETNAME).exe
g1.cpp

コード:

#include "DxLib.h"

//int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
int main()
{
    ChangeWindowMode( TRUE );                         // ウィンドウモード

    printf("DXDXライブラリ初期化:開始\n");
    DxLib_Init();                                  // DXライブラリ初期化
    printf("DXDXライブラリ初期化:終了\n");

    DrawString(30, 20, "DxLib: Hello World!", GetColor(255, 255, 255)); // 文字を書く

    printf("Hello World!\n");

    printf("%d\n",12345);

    WaitKey();    // キー入力があるまで待機
    DxLib_End(); // DXライブラリ終了処理

    return 0;
} 
http://www2.koyoen.birdview.co.jp/~abcxyz/ふ.png

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 複数ウィンドウ表示の仕方

#7

投稿記事 by ISLe » 6年前

わたしがお薦めするのは余分な書き換えをしなくて済むOutputDebugString関数。
printfのような書式を使いたいならこんなのを一回作っておくといい。
出力は、VisualStudioの出力ウィンドウや、DebugViewなどで確認できる。

とは言え、DirectXで背景やキャラと重なって見えない、とあるのでログ的なものではない予感。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 複数ウィンドウ表示の仕方

#8

投稿記事 by ISLe » 6年前

数値を並べて表示したい場合、こんなふうにメモ帳を利用することもできます。
矢印で囲った部分。DXライブラリと関係なく使えます。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	SetAlwaysRunFlag(TRUE);
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return 0;
	SetDrawScreen(DX_SCREEN_BACK);

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0) {
		// ↓↓↓↓↓↓↓↓
		HWND hwnd = FindWindow("Notepad", NULL); // 『メモ帳』のウィンドウを探す
		if (hwnd) {
			// ウィンドウが見付かったらクライアント領域に数値を文字列として描画
			static int i = 0;
			char s[256];
			sprintf(s, "[%5d]", i++);
			HDC hdc = GetDC(hwnd);
			TextOut(hdc, 0, 0, s, strlen(s));
			ReleaseDC(hwnd, hdc);
		}
		// ↑↑↑↑↑↑↑↑
	}

	DxLib_End();
	return 0;
}

返信

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