トップページ > 記事閲覧
サブウィンドウの拡大/縮小時の動作について
名前:ゆのみ 日時: 2017/02/14 08:27

初めまして、ゆのみと申します。 C++,Dxライブラリを使用したゲームで、サブウィンドウにマップを表示したいと考えております。 CreateWindowでのウィンドウ作成、SetScreenFlipTargetWindowでの描画反映先変更は出来たのですが、 サブウィンドウを拡大/縮小させた際に、メインウィンドウとは違って描画される画像が大きくなりません。 (拡大すると単純に黒い部分が広がっていき、縮小するとマップが見切れてしまいます) サブウィンドウでもメインウィンドウ同様に拡大/縮小時に画像が大きくなるようにしたいのですがどうすればいいのでしょうか? また、最大サイズ等はWM_GETMINMAXINFOを捕まえてMINMAXINFO構造体を使って縛っていますが、 Dxライブラリのメインウィンドウのように縦横比の固定ができません。 こちらも教えて頂きたいです。 <追記> 加えてもう二点、 ・サブウィンドウのサイズを変更するときに画面が黒くなってしまう問題 ・メインウィンドウサイズを変更するときにサブウィンドウの内容が描画されてしまう問題 この二点についても解決方法を教えてください。よろしくお願いいたします。
メンテ

Page: 1 |

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

SetScreenFlipTargetWindow に拡大率を指定する引数( ScaleX, ScaleY )を追加しました int SetScreenFlipTargetWindow( HWND TargetWindow, double ScaleX = 1.0, double ScaleY = 1.0 ) ; サブウインドウのサイズに応じて ScaleX と ScaleY の値を変化させてみてください 引数を追加したバージョンをこちらにアップしましたので、よろしければお使いください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
メンテ
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

管理人様の言う通りにしたら解決しました! 本当にありがとうございます!!
メンテ

Page: 1 |

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

   クッキー保存