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 の後に数ミリ秒の一時停止を入れるようにしてください