トップページ > 記事閲覧
複数ウインドウの実装
名前:戸田 日時: 2014/10/16 15:01

はじめまして。戸田と申します。 題名の件ですが、本掲示板の過去ログを見ておりましたら、管理人様による複数ウインドウの実装を検討するとの内容が見受けられました。 現状、対応済みなのでしょうか? 私自身、非常に気になっております。 私の今できたら良いなと思う機能は、1つのアプリケーション内にて、複数のウインドウやコントロールへの2Dや3Dの描画です。 ご回答頂ければ幸いです。
メンテ

Page: 1 |

Re: 複数ウインドウの実装 ( No.1 )
名前:管理人 日時:2014/10/17 00:43

すみません、未だに複数ウインドウには対応していません DXライブラリが管理するウインドウを複数にするのは簡単には対応できませんが、 自前で用意した複数のウインドウにDXライブラリで書き込みを行うのはもしかしたら 比較的容易に実装できるかもしれませんので、週末に試してみます
メンテ
Re: 複数ウインドウの実装 ( No.2 )
名前:戸田 日時:2014/10/17 06:47

さっそくのご返信ありがとうございます。 お多忙のところ大変恐縮てはありますが、よろしくお願いいたします。 複数ウインドウ対応、期待しています!
メンテ
Re: 複数ウインドウの実装 ( No.3 )
名前:管理人 日時:2014/10/19 16:32

No.1での書き込みの通り、とりあえず自前で CreateWindow を使用して作成したウインドウに対して DXライブラリの裏画面の内容を転送するための関数を追加しました // ScreenFlip で画像を転送する先のウインドウを設定する( NULL を指定すると設定解除 ) int SetScreenFlipTargetWindow( HWND TargetWindow ) ; この関数に自前で作成したウインドウハンドルを引数に渡して呼び出した後に ScreenFlip を実行すると、裏画面の内容がDXライブラリが作成したウインドウの 代わりに引数で渡したウインドウに転送されます この関数を追加したバージョンをこちらにアップしましたので、よろしければダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) この関数を使用して、CreateWindow で作成した二つのウインドウとDXライブラリが作成した ウインドウに対してそれぞれ別の描画結果を表示するプログラムを組んでみましたので、 よろしければご覧ください #include <windows.h> #include "DxLib.h" char *szClassNme[ 2 ] = { "ウィンドウ1クラスネーム", "ウィンドウ2クラスネーム", } ; // メッセージ処理用関数 LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: PostQuitMessage( 0 ) ; break ; default : return(DefWindowProc( hWnd, msg, wParam, lParam ) ) ; } return ( 0L ) ; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { int pos, pos_add ; LONGLONG time ; LONGLONG temp_time ; MSG msg ; HWND hWnd[ 2 ] ; WNDCLASS myProg ; // ウインドウの作成 myProg.style = CS_HREDRAW | CS_VREDRAW ; myProg.lpfnWndProc = WndProc ; myProg.cbClsExtra = 0 ; myProg.cbWndExtra = 0 ; myProg.hInstance = hInstance ; myProg.hIcon = NULL ; myProg.hCursor = LoadCursor( NULL, IDC_ARROW ) ; myProg.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ) ; myProg.lpszMenuName = NULL ; myProg.lpszClassName = szClassNme[ 0 ] ; if( !RegisterClass( &myProg ) ) { return FALSE; } hWnd[ 0 ] = CreateWindow( szClassNme[ 0 ], "ウインドウ1", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hInstance, NULL ) ; ShowWindow( hWnd[ 0 ], nCmdShow ) ; UpdateWindow( hWnd[ 0 ] ) ; myProg.lpszClassName = szClassNme[ 1 ] ; if( !RegisterClass( &myProg ) ) { return FALSE; } hWnd[ 1 ] = CreateWindow( szClassNme[ 1 ], "ウインドウ2", WS_OVERLAPPEDWINDOW, 700, 100, 500, 500, NULL, NULL, hInstance, NULL ) ; ShowWindow( hWnd[ 1 ], nCmdShow ) ; UpdateWindow( hWnd[ 1 ] ) ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // VSYNC待ちをしない設定に変更 SetWaitVSyncFlag( FALSE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // メインループ time = GetNowHiPerformanceCount() ; pos = 0 ; pos_add = 8 ; while( ProcessMessage() == 0 ) { if( PeekMessage( &msg, hWnd[ 0 ], 0, 0, PM_REMOVE ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } if( PeekMessage( &msg, hWnd[ 1 ], 0, 0, PM_REMOVE ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } // 移動処理 pos += pos_add ; if( pos > 400 || pos < 0 ) { pos_add = -pos_add ; } // メインウインドウ用の描画 ClearDrawScreen() ; DrawBox( pos, 0, pos + 64, 64, GetColor( 255,0,0 ), TRUE ) ; SetScreenFlipTargetWindow( NULL ) ; ScreenFlip() ; // 少し時間の経過を待つ WaitTimer( 2 ) ; // ウインドウ1用の描画 ClearDrawScreen() ; DrawBox( 0, pos, 48, pos + 48, GetColor( 0,255,0 ), TRUE ) ; SetScreenFlipTargetWindow( hWnd[ 0 ] ) ; ScreenFlip() ; // 少し時間の経過を待つ WaitTimer( 2 ) ; // ウインドウ2用の描画 ClearDrawScreen() ; DrawBox( pos, pos, pos + 80, pos + 80, GetColor( 0,0,255 ), TRUE ) ; SetScreenFlipTargetWindow( hWnd[ 1 ] ) ; ScreenFlip() ; // 時間待ち処理 temp_time = GetNowHiPerformanceCount() ; while( temp_time - time < 1000000 / 60 ) { Sleep( 0 ) ; temp_time = GetNowHiPerformanceCount() ; } time = temp_time ; } // DXライブラリの後始末 DxLib_End(); return 0 ; } 因みに上記プログラムで ScreenFlip の後に WaitTimer( 2 ) で少し処理を止めていますが、 この一時停止を入れないとウインドウ1用に描画した結果がDXライブラリが作成したウインドウに 表示されてしまったり、ウインドウ2用に描画した結果がウインドウ1に表示されてしまったりといった 不具合が発生してしまいますので、SetScreenFlipTargetWindow を使用して複数のウインドウに 描画結果を転送する場合は ScreenFlip の後に数ミリ秒の一時停止を入れるようにしてください
メンテ
Re: 複数ウインドウの実装 ( No.4 )
名前:戸田 日時:2014/10/20 10:59

早速のご対応ありがとうございます。 ライブラリを乗せ変えてみたところ、一点問題が浮上しました。 まず、今回の変更点であるターゲット切り替えは実装せず、単純にライブラリのみを乗せ変えて実行したところ、描画速度が非常に遅くなりました。 ライブラリを元に戻すと症状改善しますので、今回の更新による影響であると判断しております。 当方、C#にて.NET用を使用させて頂いております。 お忙しいところ大変恐縮ですが、ご確認のほどよろしくお願いいたします。
メンテ
Re: 複数ウインドウの実装 ( No.5 )
名前:管理人 日時:2014/10/20 11:58

ご報告ありがとうございます すみません、現在戸田さんがお使いのDXライブラリのバージョンを教えて頂けないでしょうか?
メンテ
Re: 複数ウインドウの実装 ( No.6 )
名前:戸田 日時:2014/10/20 12:03

3.12eを使用しております。 現在の最新バージョン3.13でないのが原因でしょうか。 お手数お掛けしてすみません。
メンテ
Re: 複数ウインドウの実装 ( No.7 )
名前:管理人 日時:2014/10/21 00:49

ご返答ありがとうございます、3.12eは結構最近のバージョンですね・・・ 3.12e以降で極端な速度低下に繋がりそうな変更が一つ( マスク関連 )あったので、 その部分の実装を変更してみました よろしければこちらをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
メンテ
Re: 複数ウインドウの実装 ( No.8 )
名前:戸田(解決) 日時:2014/10/22 14:06

お世話になっております。 お見事バッチリでした。描画速度の問題も解消され、描画ターゲットの切り換えも良好です。 今回、ここへ書き込みを行って本当に良かったと思っております。 末長く愛用して参りたいと思います。 この度は迅速丁寧なご対応誠にありがとうございました。 失礼いたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存