トップページ > 記事閲覧
SetUserChildWindowについて
名前:Marshal 日時: 2020/02/21 11:55

SetUserWindowとSetUserChildWindowについてご質問が御座います。 SetUserWindow(this.Handle)で、例えばform等を描画対象に指定できますが、SetUserChildWindow(pictureBox.Handle) をすることで描画対象をもう一つ追加することが出来るのでしょうか? 実際にやってみたのですが、pictureBox側に描画先が変わるだけで、二つの描画先を作成することが出来ません。 あくまで描画先コントロールは一つのみ? このChildWindowの使い道が良くわからないのですが、ご教授頂けますと助かります。 お手数ですけど、宜しくお願い致します。
メンテ

Page: 1 |

Re: SetUserChildWindowについて ( No.1 )
名前:管理人 日時:2020/02/25 01:50

ご返信が遅くなり申し訳ありません 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 ; }
メンテ
Re: SetUserChildWindowについて ( No.2 )
名前:Marshal 日時:2020/02/25 09:26

管理人 様 具体的なご回答頂き、有難う御座います。 SetUserChildWindowは現在使用できないのですね。 SetScreenFlipTargetWindowで、動作の方確認してみたいと思います。
メンテ
Re: SetUserChildWindowについて ( No.3 )
名前:Marshal 日時:2020/03/06 10:55

管理人様 DX.SetScreenFlipTargetWindowについて、簡単に動作確認してみたのですが、 例えば描画に使用するSetUserWindow(ハンドル)を呼んでいるコンテキストとは異なるコンテキスト(=スレッド)内で使用する場合に 下記のようなエラーが発生しますが、本API使用する場合、何か解決策はありませんでしょうか? ちなみに、SetScreenFlipTargetWindowに渡すハンドルとSetUserWindowのハンドルは同じです。 Invoke(new MethodInvoker(delegate{DX.SetScreenFlipTargetWindow(this.Handle)}));等で逃げれないか 確認してみましたが不可でした。 ”コントロールが作成されたスレッド以外のスレッドからコントロールにアクセス〜” お忙しいところ恐縮ですが、宜しくお願い致します。
メンテ
Re: SetUserChildWindowについて ( No.4 )
名前:管理人 日時:2020/03/06 22:12

> DX.SetScreenFlipTargetWindowについて、簡単に動作確認してみたのですが、 > 例えば描画に使用するSetUserWindow(ハンドル)を呼んでいるコンテキストとは異なるコンテキスト(=スレッド)内で使用する場合に > 下記のようなエラーが発生しますが、本API使用する場合、何か解決策はありませんでしょうか? すみません、元々DXライブラリは複数のスレッドから関数が呼ばれることを想定していないので、 何らかの方法で『異なるコンテキスト』から『SetUserWindowを呼んでいるコンテキスト』に SetScreenFlipTargetWindow に渡すハンドルを渡し、『SetUserWindowを呼んでいるコンテキスト』で SetScreenFlipTargetWindow を呼ぶようにしていただくしか方法はないと思います > ちなみに、SetScreenFlipTargetWindowに渡すハンドルとSetUserWindowのハンドルは同じです。 ? その場合は SetScreenFlipTargetWindow を呼ぶ必要は無いのですが、 どのような目的で SetScreenFlipTargetWindow を使用されようとしているのでしょうか?
メンテ
Re: SetUserChildWindowについて ( No.5 )
名前:Marshal 日時:2020/03/13 09:13

管理人様 ご連絡頂きまして有難うございました。 > どのような目的で SetScreenFlipTargetWindow を使用されようとしているのでしょうか? SetScreenFlipTargetWindow を使用したい背景ですが、SetUserWindowにメインハンドルを指定(もしくはSetUserChildWindowにコントロールハンドル指定)をして、 通常時はその指定したハンドルで描画しつつ、必要に応じて、通常描画コンテキスト内からSetScreenFlipTargetWindowをコールする事で、 他のコントロール(=画面)に転送描画したいと考えております。 SetScreenFlipTargetWindowに指定するハンドルですが、SetUserWindowやSetUserChildWindowに指定するハンドル以外を指定して使う想定のものでしょうか? また、上記の場合、SetScreenFlipTargetWindowを複数使用することで複数のコントロール上に描画する事が可能となりますでしょうか? 以上、お忙しいところ恐縮ですが宜しくお願い致します。
メンテ
Re: SetUserChildWindowについて ( No.6 )
名前:管理人 日時:2020/03/15 02:01

ご返答ありがとうございます 使用方法について問題はないと思います > SetScreenFlipTargetWindowに指定するハンドルですが、SetUserWindowやSetUserChildWindowに指定するハンドル以外を指定して使う想定のものでしょうか? はい、SetScreenFlipTargetWindow は基本的に SetUserWindow で指定したハンドル以外を指定することを想定していますので、 SetUserWindow で指定したハンドルに対して描画結果を表示されたい場合は SetScreenFlipTargetWindow に NULL を渡して呼んだ上で ScreenFlip を呼んでください SetUserChildWindow と SetScreenFlipTargetWindow の併用は想定していませんが、SetUserChildWindow に指定したハンドルに 対して描画結果を表示されたい場合は SetScreenFlipTargetWindow に SetUserChildWindow に指定したハンドルを渡して呼んだ上で ScreenFlip を呼んでください > また、上記の場合、SetScreenFlipTargetWindowを複数使用することで複数のコントロール上に描画する事が可能となりますでしょうか? はい、SetScreenFlipTargetWindowを複数使用することで複数のコントロール上に描画結果を表示することが可能です コントロールA用の DrawGraph 等の描画関数を呼ぶ ↓ SetScreenFlipTargetWindowにコントロールAのハンドルを渡して呼び出し ↓ ScreenFlipで描画結果をコントロールAに転送 ↓ コントロールB用の DrawGraph 等の描画関数を呼ぶ ↓ SetScreenFlipTargetWindowにコントロールBのハンドルを渡して呼び出し ↓ ScreenFlipで描画結果をコントロールBに転送 ↓ コントロールC用の DrawGraph 等の描画関数を呼ぶ ↓ SetScreenFlipTargetWindowにコントロールCのハンドルを渡して呼び出し ↓ ScreenFlipで描画結果をコントロールCに転送 ↑具体的にはこちらのような手順になります
メンテ

Page: 1 |

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

   クッキー保存