ご返信が遅くなり申し訳ありません
SetUserChildWindow は現在は正常に動作しません
複数のウィンドウに描画結果を転送する場合は、代わりに
ScreenFlip で、裏画面の内容を転送する先のウィンドウを設定するための関数
SetScreenFlipTargetWindow を使用してください m(_ _)m
// ScreenFlip で画像を転送する先のウインドウを設定する( NULL を指定すると設定解除 )
int SetScreenFlipTargetWindow( HWND TargetWindow, double ScaleX = 1.0 , double ScaleY = 1.0 ) ;
以下は SetScreenFlipTargetWindow を使用して実際に複数のウィンドウに
描画結果を転送するサンプルです
#include <windows.h>
#include "DxLib.h"
#define CWIN_SIZE_X 256
#define CWIN_SIZE_Y 256
char *szClassNme[ 2 ] =
{
"ウィンドウ1クラスネーム",
"ウィンドウ2クラスネーム",
} ;
HWND hWnd[ 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 ) ;
}
// メインウインドウの左右にサブウインドウを配置する
void SetSubWindowPosition( void )
{
RECT MainWindowRect ;
RECT WindowRect ;
int WindowSizeX[ 2 ] ;
int WindowSizeY[ 2 ] ;
int i ;
// メインウインドウの矩形を取得する
GetWindowRect( GetMainWindowHandle(), &MainWindowRect ) ;
// サブウインドウのサイズを取得する
for( i = 0; i < 2; i ++ )
{
GetWindowRect( hWnd[ i ], &WindowRect ) ;
WindowSizeX[ i ] = WindowRect.right - WindowRect.left ;
WindowSizeY[ i ] = WindowRect.bottom - WindowRect.top ;
}
// サブウインドウの位置を設定する
MoveWindow( hWnd[ 0 ], MainWindowRect.left - WindowSizeX[ 0 ], MainWindowRect.top, WindowSizeX[ 0 ], WindowSizeY[ 0 ], TRUE ) ;
MoveWindow( hWnd[ 1 ], MainWindowRect.right, MainWindowRect.top, WindowSizeX[ 1 ], WindowSizeY[ 1 ], TRUE ) ;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow)
{
int pos, pos_add ;
LONGLONG time ;
LONGLONG temp_time ;
MSG msg ;
WNDCLASS myProg ;
int WinPosX, WinPosY ;
int NewWinPosX, NewWinPosY ;
// ウインドウの作成
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, CWIN_SIZE_X, CWIN_SIZE_Y,
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, CWIN_SIZE_X, CWIN_SIZE_Y,
NULL, NULL, hInstance, NULL
) ;
ShowWindow( hWnd[ 1 ], nCmdShow ) ;
UpdateWindow( hWnd[ 1 ] ) ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// VSYNC待ちをしない設定に変更
SetWaitVSyncFlag( FALSE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// サブウインドウの位置を調整
SetSubWindowPosition() ;
// メインウインドウの位置を取得しておく
GetWindowPosition( &WinPosX, &WinPosY ) ;
// メッセージループ
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);
}
// メインウインドウの位置が変化したらサブウインドウの位置も移動する
GetWindowPosition( &NewWinPosX, &NewWinPosY ) ;
if( NewWinPosX != WinPosX ||
NewWinPosY != WinPosY )
{
SetSubWindowPosition() ;
WinPosX = NewWinPosX ;
WinPosY = NewWinPosY ;
}
// 移動処理
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 ;
}