トップページ > 記事閲覧
フリップの範囲指定について
名前:studio_sshr 日時: 2017/03/28 15:10

お世話になっております。 DXライブラリ、有難く使わせていただいております。 標記について、質問させて下さい。 DXライブラリと、標準的なWindowsのコントロール(エディット、ボタン、リストボックス等)を 併用したいと考えております。 具体的には、  ○ DXライブラリの初期化によりメインウィンドウを作り、  ○ メインウィンドウの左半分には、DXライブラリの描画関数を用いて図形を表示し、   ※静止画でなくアニメーションとしたいので、1秒間に何回かの画面フリップが必要  ○ メインウィンドウの右半分には、CreateWindow()により生成したエディット、ボタン、    リストボックス等を表示し、ユーザーの入力を取得して、メインウィンドウ左半分の    図形アニメーションに反映 といった具合のアプリケーションを実装したく考えております。 しかし、DXライブラリのScreenFlip()を使うと、メインウィンドウ全体に対して表画面と 裏画面のフリップが実行され、メインウィンドウ右半分に表示されていたコントロールが 全て消えてしまいます。 そこで、メインウィンドウの一部範囲に対してのみフリップを実行するといったことは 可能でしょうか。 お手数おかけいたしますが、ご教示の程、よろしくお願いいたします。
メンテ

Page: 1 |

Re: フリップの範囲指定について ( No.1 )
名前:管理人 日時:2017/03/29 02:18

すみません、現状では ScreenFlip で矩形などを指定して一部分のみを更新するということはできません ただ、以下の関数 // ScreenFlip で画像を転送する先のウインドウを設定する( TargetWindow に NULL を指定すると設定解除 ) int SetScreenFlipTargetWindow( HWND TargetWindow, double ScaleX = 1.0 , double ScaleY = 1.0 ) ; で転送先のウインドウを指定することができますので、左半分用の子ウインドウを CreateWindow で 作成して、そのウインドウのハンドルを SetScreenFlipTargetWindow に渡して呼び出した後 ScreenFlip を実行すれば左半分だけDXライブラリを使用した図形描画の結果を反映することが できるかもしれません( すみません、時間が足りず試せてはいません )
メンテ
Re: フリップの範囲指定について ( No.2 )
名前:studio_sshr 日時:2017/03/29 09:11

管理人様 お忙しいところご返信いただき、ありがとうございます。 やはり範囲指定はできませんでしたか・・・。 今や古典の関数なのかもしれませんが、IDirect3DDevice9::Present()では、表画面だけでなく 裏画面に対しても範囲指定ができる記憶があったので、DXライブラリにおいても可能かと思っていました。 ウィンドウを2つ作成することも考えましたが、個人的に不格好と感じ、最後の手段としていました。 転送先ウィンドウの指定機能について折角ご教示いただいたので、私の方でも試してみようかと思います。 結果については、追ってご報告させていただきます。
メンテ
Re: フリップの範囲指定について ( No.3 )
名前:studio_sshr 日時:2017/04/01 23:21

管理人様 申し訳ありません、一点質問させていただいてもよろしいでしょうか。 管理人様のご返答どおり、まずは子ウィンドウをCreateWindowで作成し、それに対してSetScreenFlipTargetWindowを実行し、 子ウィンドウに対してフリップをしようと思ったのですが、どうやら子ウィンドウの作成が上手くできていない様子でした。 ソースコードは下記のとおりですが、失敗する原因についてご教示いただきたく、よろしくお願いいたします。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { // DXライブラリのログを出力しないように設定 if(SetOutApplicationLogValidFlag(FALSE)==-1) return -1; // ウィンドウモードで起動 // TRUE:ウィンドウモード FALSE:フルスクリーン if(ChangeWindowMode(TRUE)==-1) return -1; // ウィンドウサイズを設定 if(SetWindowSize(800,600)==-1) return -1; // 画面設定を変更 if(SetGraphMode(800,600,16,60)!=DX_CHANGESCREEN_OK) return -1; // DXライブラリの初期化 if(DxLib_Init()==-1) return -1; // 描画対象を裏画面にセット if(SetDrawScreen(DX_SCREEN_BACK)==-1) return -1; // 描画領域を設定 if(SetDrawArea(0,0,800,600)==-1) return -1; // 子ウィンドウを作成 HWND hMainWnd,hChildWnd; hMainWnd=GetMainWindowHandle(); hChildWnd=CreateWindow("CHILD",NULL,WS_CHILD,10,10,100,100,hMainWnd,(HMENU)1,hInstance,NULL); // フリップ対象をメインウィンドウから子ウィンドウに設定 if(SetScreenFlipTargetWindow(hChildWnd)==-1) return -1; // メッセージループ while(ProcessMessage()==0) { static int iRadius=10; // 描画領域をクリア ClearDrawScreen(); // アニメーション DrawCircle(300,300,iRadius<150 ? iRadius++ : iRadius-=140,GetColor(255,255,255),false); // フリップ ScreenFlip(); } // DXライブラリの終了処理 DxLib_End(); return 0; }
メンテ
Re: フリップの範囲指定について ( No.4 )
名前:管理人 日時:2017/04/02 14:41

CreateWindow の第一引数のウインドウクラス名として "CHILD" とされていますが、CreateWindow の前に RegisterClassEx で "CHILD" のウインドウクラスを登録するといった処理をされていないのがエラーの原因です 載せていただいたプログラムを子ウインドウの作成が成功するようにした上で、子ウインドウをふち無しにして、 子ウインドウの範囲が分かるように背景色を灰色にしてみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" // 子ウインドウのプロージャ LRESULT CALLBACK ChildProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { // 標準処理にお任せ return DefWindowProc( hWnd, msg, wp, lp ); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) { // DXライブラリのログを出力しないように設定 if(SetOutApplicationLogValidFlag(FALSE)==-1) return -1; // ウィンドウモードで起動 // TRUE:ウィンドウモード FALSE:フルスクリーン if(ChangeWindowMode(TRUE)==-1) return -1; // ウィンドウサイズを設定 if(SetWindowSize(800,600)==-1) return -1; // 画面設定を変更 if(SetGraphMode(800,600,16,60)!=DX_CHANGESCREEN_OK) return -1; // DXライブラリの初期化 if(DxLib_Init()==-1) return -1; // 描画対象を裏画面にセット if(SetDrawScreen(DX_SCREEN_BACK)==-1) return -1; // 描画領域を設定 if(SetDrawArea(0,0,800,600)==-1) return -1; // 子ウインドウのウインドウクラスを登録 WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance ; wc.hIcon = NULL ; wc.hCursor = NULL ; wc.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH ); wc.lpszMenuName = NULL ; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wc.lpfnWndProc = ChildProc; wc.lpszClassName = "CHILD"; RegisterClassEx( &wc ); // 子ウィンドウを作成 HWND hMainWnd,hChildWnd; hMainWnd=GetMainWindowHandle(); hChildWnd=CreateWindow( "CHILD", NULL, WS_CHILD | WS_VISIBLE | WS_SYSMENU, 10,10, 500,500, hMainWnd, NULL, hInstance, NULL ); // フリップ対象をメインウィンドウから子ウィンドウに設定 if(SetScreenFlipTargetWindow(hChildWnd)==-1) return -1; // 子ウインドウの範囲が分かるように背景色を灰色に変更 SetBackgroundColor( 128,128,128 ); // メッセージループ while(ProcessMessage()==0) { static int iRadius=10; // 描画領域をクリア ClearDrawScreen(); // アニメーション DrawCircle(300,300,iRadius<150 ? iRadius++ : iRadius-=140,GetColor(255,255,255),false); // フリップ ScreenFlip(); } // DXライブラリの終了処理 DxLib_End(); return 0; }
メンテ
Re: フリップの範囲指定について ( No.5 )
名前:studio_sshr 日時:2017/04/05 23:21

管理人様 ご指摘ありがとうございます、肝心な部分が抜けていました。 試してみましたが、お陰様で、想定していた挙動を実装できそうです。 どうもありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存