別ウインドウに情報を表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

別ウインドウに情報を表示

#1

投稿記事 by MoNoQLoREATOR » 14年前

DXライブラリを使ってゲームをつくる際に、別ウインドウに情報を表示したらデバッグに役立つと思い、見よう見まねでソースコードを書いてみたのですが、表示する内容を更新する方法がわかりません。

以下ソースコード

コード:

#define _CRT_SECURE_NO_DEPRECATE

#include <windows.h>
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
	ChangeWindowMode(TRUE);
	SetOutApplicationLogValidFlag(FALSE);
	SetWindowText("DxLib");
	if(DxLib_Init() == -1) return(-1);
	if(DxLib_Init() == -1) return(-1);
	SetAlwaysRunFlag(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);

	//クラスネーム
	const char* SZ_CLASS_NAME = "ClassName";

   WNDCLASSEX wc;
    
    wc.cbClsExtra = 0;////////////////////////////////////////////////////	とりあえず0を指定すればOK
    wc.cbSize = sizeof(WNDCLASSEX);//											構造体のサイズ
    wc.cbWndExtra = 0;///////////////////////////////////////////////////	とりあえず0を指定すればOK
    wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);//		背景色を指定。
	wc.hCursor = LoadCursor(hInst,IDC_ARROW);//	マウスカーソルの指定。とりあえずこれを指定しておけばOK
    wc.hIcon = NULL;//												ウインドウの左上に表示されるアイコンの指定。とりあえずNULLでOK
    wc.hIconSm = NULL;///////////////////////////////	とりあえずNULLでOK
    wc.hInstance = hInst;//										WinMainの第1引数HINSTANCEに指定したものを指定する
    wc.lpfnWndProc = DefWindowProc;///////////////	ウインドウプロシージャを指定。とりあえずDefWindowProcでOK
    wc.lpszClassName = SZ_CLASS_NAME;//				ウインドウクラス名を指定。CreateWindowの第1引数に指定する
    wc.lpszMenuName = NULL;////////////////////////	ウインドウメニューリソースを示す文字列か識別子を指定。とりあえずNULLでOK
    wc.style = CS_DBLCLKS;//									ウインドウのスタイルを指定

    RegisterClassEx(&wc);
 
	//登録したszClassNameより親となるオーバーラップウインドウの作成
    HWND hWnd = CreateWindowEx(
		WS_EX_TOOLWINDOW,
		SZ_CLASS_NAME,///////////////////////////////////////////	WNDCLASSEX.lpszClassNameで指定した名前を指定する
        "windowsテンプレート",//												ウインドウタイトル
        WS_BORDER|WS_SYSMENU,//////////////	ウインドウスタイル。
        CW_USEDEFAULT,CW_USEDEFAULT,////	起点のX,Y座標指定
		320,480,//												横幅と高さを指定
		NULL,NULL,hInst,NULL////////////////////	特に意味なし。左のように指定。
	);
 
    ShowWindow(hWnd,nShowCmd);
    UpdateWindow(hWnd);
 
	//親ウインドウの上に子ウインドウを作成
    HWND hChild = CreateWindow(
		"STATIC",//////////////////	種類:STATIC…文章を出力できる, EDIT…ユーザーからの入力を受け付ける
		//"EDIT",/////////////////////	種類:STATIC…文章を出力できる, EDIT…ユーザーからの入力を受け付ける
		"test",//						出力文字列
		WS_CHILD|WS_VISIBLE,//	ウインドウスタイルとりあえずWS_CHILD|WS_VISIBLEでOK	
		0,0,//////////////////////////	起点のX,Y座標
		320,480,//							横幅と高さ
		hWnd,///////////////////////	親ウインドウのハンドル
		(HMENU)100,//					子ウインドウのハンドルを任意に設定
		hInst,///////////////////////	WinMainの第1引数に指定した変数を指定する
		NULL//								とりあえずNULLでOK
	);
 

	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
        ClsDrawScreen();



		ScreenFlip();
	}

	DestroyWindow( (HWND)100);	//子ウインドウを削除
	DestroyWindow(hWnd);			//親ウインドウを削除

	DxLib_End();
	return 0;
}
子ウインドウを消したり作ったりする方法をためしてみたのですが、画面のチラつきが許容範囲外でした。
もちろんDXライブラリが管理するウインドウを2つ作ることができるのならそれに越したことはないのですが、多重起動を許可してDxLib_Init()を2回呼んでもウインドウは1つしか生成されませんでした。
それと、STATICの背景を黒に、文字色を一行ごとに黄緑・水色の交互になるように変えたいのですがどうすればよいのでしょうか。
もっと良い方法があったりソースコードにまずい部分があれば教えてください。

ご教授よろしくおねがい致します。

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

Re: 別ウインドウに情報を表示

#2

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

コンソールウィンドウなら簡単ですが、それではダメでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: 別ウインドウに情報を表示

#3

投稿記事 by MoNoQLoREATOR » 14年前

できることならいつも見慣れているウインドウに表示させたいです。コマンドプロンプトより見た目がかっこいいので。

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

Re: 別ウインドウに情報を表示

#4

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

まず、速度的にはかなり遅くなると思いますので、大量にスクロールするログ的な使い方をする場合は避けたほうが良いでしょう。
それとDXLIBで2つのウィンドウを同時に描画はできないと思います。なので、子ウィンドウは今やっているようにWin32APIで描画する必要があると思います。

自前で細かい所を描画しないで文字列を書き換えるだけなら次のコードで出来ます。
これだと、コンソールと大差無いですけどね。
SetWindowText()は内部的にはウィンドウメッセージを子ウィンドウに送出することでウィンドウを書き換えていますので、ウィンドウの書き換えは対象となるウィンドウにメッセージを送って書き換えるんだと覚えておいてください。

コード:

 	int count = 0;
    while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
        ClsDrawScreen();
 
 		char str[100];
 		sprintf( str, "count=%d", count++ );
 		SetWindowText( hChild, str) ;
 
        ScreenFlip();
    }
参考。その他のことをしたいとき。色替も出来ます。
「GUIリファレンス [VC++の使い方]」
http://www.nitoyon.com/vc/reference/gui/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: 別ウインドウに情報を表示

#5

投稿記事 by MoNoQLoREATOR » 14年前

ありがとうございます。文字を変更できるようになりました。
そしてこれはわかりやすそうな解説サイトですね。なんとかやっていけそうです。

解決しました。本当にありがとうございました。

閉鎖

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