Re: サブウィンドウの拡大/縮小時の動作について ( No.1 ) |
- 名前:管理人 日時:2017/02/16 00:55
DXライブラリは基本的にメインウインドウのみで処理を実行することを前提としているライブラリなので
SetScreenFlipTargetWindow はおまけのような関数で、あまり機能を充実させる予定はないことをご承知ください
現状はサブウインドウもメインウインドウのように表示内容が拡大/縮小される機能はありませんが、
指定の拡大率で転送されるような機能を追加してみようと思いますので、数日ほどお時間をください m(_ _)m
> Dxライブラリのメインウィンドウのように縦横比の固定ができません。
サブウインドウに WM_SIZING メッセージが飛んできたときに適切に処理していただければ縦横比の固定ができます
Google などで『WM_SIZING 縦横比』で検索するとそれについて解説されている
サイトが見つかると思いますので、よろしければ調べてみてください
> ・サブウィンドウのサイズを変更するときに画面が黒くなってしまう問題
サブウインドウに WM_PAINT メッセージが飛んできたときに黒く塗りつぶしてしまっているのかもしれません
サブウインドウに WM_PAINT メッセージが飛んできたときの処理を確認してみてください
> ・メインウィンドウサイズを変更するときにサブウィンドウの内容が描画されてしまう問題
メインウインドウのサイズが変更された際は『裏画面の内容を表示する』処理を行っているので、
ウインドウサイズが変更される際に裏画面に描画されていた内容がサブウインドウ用に描画した
ものであった場合はメインウインドウにサブウインドウ用の内容が描画されてしまいます
ウインドウサイズ変更のメッセージ処理などは ProcessMessage が呼ばれた際に行っていますので、
ProcessMessage を呼ぶ時点でメインウインドウに表示する内容を裏画面に描画されているようにすれば
解決すると思います
<サブウインドウの内容が表示されてしまう例>
while( ProcessMessage() == 0 )
{
〜〜〜
メインウインドウ用の描画
〜〜〜
SetScreenFlipTargetWindow( NULL );
ScreenFlip();
〜〜〜
サブウインドウ用の描画
〜〜〜
SetScreenFlipTargetWindow( サブウインドウのハンドル );
ScreenFlip();
}
<サブウインドウの内容が表示されない例
( ProcessMessage が呼ばれるときはメインウインドウ用の内容が裏画面に描画されているようにする )>
while( ProcessMessage() == 0 )
{
〜〜〜
サブウインドウ用の描画
〜〜〜
SetScreenFlipTargetWindow( サブウインドウのハンドル );
ScreenFlip();
〜〜〜
メインウインドウ用の描画
〜〜〜
SetScreenFlipTargetWindow( NULL );
ScreenFlip();
}
 |
Re: サブウィンドウの拡大/縮小時の動作について ( No.2 ) |
- 名前:ゆのみ 日時:2017/02/16 17:21
管理人様、返信ありがとうございます。
>機能を追加
ありがとうございます!待たせていただきます!
>縦横比の固定,サブウインドウの内容が表示されてしまう
教えていただいた方法で試したところ解決しました!
|
Re: サブウィンドウの拡大/縮小時の動作について ( No.3 ) |
- 名前:管理人 日時:2017/02/18 16:09
|
Re: サブウィンドウの拡大/縮小時の動作について ( No.4 ) |
- 名前:ゆのみ 日時:2017/02/18 18:57
管理人様、ありがとうございます。
追加していただいたものを使って無事に拡大率を変えることができました。
メインウィンドウサイズを変えるとサブウィンドウの拡大率も変わってしまいますが、これについてはこちらで対応できました。
同じ目的の方がいた時の為にソースを貼っておきます。
RECT rc;
double ChildWindowX = 640;
double ChildWindowY = 480;
//〜メインループ内〜
GetClientRect(MainWindowhWnd, &rc);
SetScreenFlipTargetWindow(ChildWindowhWnd, ChildWindowX / (double)(rc.right - rc.left), ChildWindowY / (double)(rc.bottom - rc.top));
//サブウィンドウ用描画
>サブウインドウに WM_PAINT メッセージが飛んできたときに黒く塗りつぶしてしまっているのかもしれません
>サブウインドウに WM_PAINT メッセージが飛んできたときの処理を確認してみてください
申し訳ありません、前回返信で見落としていました。
このメッセージが送られてきたときの処理は何もしていなかったです。
「メインウインドウのサイズが変更された際は『裏画面の内容を表示する』処理を行っている」とのお話から、
サブウィンドウでもこれを実行すればいいと思いますが、やり方がわかりませんでした。(ScreenFlipは試してみましたが違うみたいですね)
最初に言葉足らずでしたが、サブウィンドウのサイズを変更している最中に画面が真っ黒で、マウスを離すとちゃんと描画されます。
以下が現在のサブウィンドウのメッセージ処理です。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
RECT *rc;
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZING:
RECT *rc;
rc = (RECT *)lParam;
double width, height;
double tempW,tempH;
RECT trw, trc;
GetWindowRect(hWnd, &trw);
GetClientRect(hWnd, &trc);
tempW = (trw.right - trw.left) - (trc.right - trc.left);
tempH = (trw.bottom - trw.top) - (trc.bottom - trc.top);
width = rc->right - rc->left;
height = rc->bottom - rc->top;
if (width - tempW < 160 || height - tempH < 120){
rc->right = rc->left + 160 + tempW;
rc->bottom = rc->top + 120 + tempH;
return TRUE;
}
switch (wParam)
{
case WMSZ_TOP:
width = (int)(height*(RX / RY));
rc->right = rc->left + width + tempW;
break;
case WMSZ_BOTTOM:
width = (int)(height*(RX / RY));
rc->right = rc->left + width + tempW;
break;
case WMSZ_LEFT:
case WMSZ_BOTTOMLEFT:
height = (int)(width*(RY / RX));
rc->bottom = rc->top + height + tempH;
break;
case WMSZ_RIGHT:
case WMSZ_BOTTOMRIGHT:
height = (int)(width*(RY / RX));
rc->bottom = rc->top + height + tempH;
break;
case WMSZ_TOPRIGHT:
case WMSZ_TOPLEFT:
height = (int)(width*(RY / RX));
rc->top = rc->bottom - height - tempH;
break;
default:
break;
}
return TRUE;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}
WM_PAINTの処理を追加するとメインウィンドウの描画もされなくなりました。
重ねて申し訳ないですが解決策を教えていただきたいです。
 |
Re: サブウィンドウの拡大/縮小時の動作について ( No.5 ) |
- 名前:管理人 日時:2017/02/20 01:17
サブウインドウを作成する際の WNDCLASS構造体のメンバー変数 hbrBackground には何を代入していますか?
とりあえず手元では hbrBackground に
( HBRUSH )GetStockObject( NULL_BRUSH ) ;
を代入するようにして、且つ WM_PAINT の処理は書かない状態にしたら
真っ黒に塗りつぶされることはなくなりました
よろしければお試しください
|
Re: サブウィンドウの拡大/縮小時の動作について ( No.6 ) |
- 名前:ゆのみ(解決) 日時:2017/02/20 09:40
管理人様の言う通りにしたら解決しました!
本当にありがとうございます!!
|