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