トップページ > 記事閲覧
ウィンドウサイズを変更後の表示について
名前:Pika 日時: 2016/09/09 21:00

いつも楽しく使わせて頂いています。 原因の分からないバグに当たってしまったので質問させてください。 起動時のウィンドウサイズ1280x720の状態では正しく表示されるのですが、ウィンドウサイズを変更して1280x720にすると"TEXT2","TEXT3"が表示されません。 でも、1280x720以外のサイズでは変更しても正しく表示されます。 //------再現コード------ #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // ウィンドウモードの初期化 ChangeWindowMode(TRUE); // ウインドウモードに変更 SetGraphMode(1280, 720, 32); // 解像度指定 // グラフィックハンドル・グラフィックシステムの設定をリセットしない SetChangeScreenModeGraphicsSystemResetFlag(FALSE); // DXライブラリ初期化処理 if (DxLib_Init() == -1) return EXIT_FAILURE; // 描画対象として使用できる、描画可能グラフィックハンドルを作成する SetDrawValidGraphCreateFlag(TRUE); int m_mainScreen = MakeScreen(1280, 720, FALSE); int m_systemfontHandle = CreateFontToHandle(NULL, 14, 4, DX_FONTTYPE_ANTIALIASING_EDGE_8X8); int windowX = 1280, windowY = 720; // while(裏画面を表画面に反映, メッセージ処理, 画面クリア) while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey(KEY_INPUT_F10) == 0) { clsDx(); if (CheckHitKey(KEY_INPUT_F1)) { if (windowX == 1760) { windowX = 960; windowY = 540; } else if (windowX == 960) { windowX = 1280; windowY = 720; } else if (windowX == 1280) { windowX = 1296; windowY = 729; } else { windowX = 1760; windowY = 990; } SetGraphMode(windowX, windowY, 32); // 解像度指定 ChangeWindowMode(TRUE); // ウインドウモードに変更 } printfDx("ScreenSize X:%d,Y;%d", windowX, windowY); SetDrawScreen(m_mainScreen); DrawStringToHandle(200, 200, "TEXT1", GetColor(255, 255, 255), m_systemfontHandle); SetDrawScreen(DX_SCREEN_BACK); DrawExtendGraph(0, 0, windowX, windowY, m_mainScreen, TRUE); DrawStringToHandle(windowX - 60, windowY - 20, "TEXT3", GetColor(255, 255, 255), m_systemfontHandle); DrawStringToHandle(3, windowY - 20, "TEXT2", GetColor(255, 255, 255), m_systemfontHandle); } // DXライブラリ使用の終了処理 DxLib_End(); //ソフトの終了 return EXIT_SUCCESS; } //--------------------- 再現コードはF1を押すとウィンドウサイズを順番に変更するようになっています。 再現コードは1920x1080の解像度のモニタで動作することを想定しています。 バーションはVer3.16f、OSはwindows10です。 お手数おかけしますがよろしくお願いいたします。
メンテ

Page: 1 |

Re: ウィンドウサイズを変更後の表示について ( No.1 )
名前:管理人 日時:2016/09/11 12:46

再現コードの掲載ありがとうございます、手元の環境でも現象を確認できました 調べてみたところ、自分でも忘れていたのですが以下の仕様が原因でした 「SetDrawScreen で描画対象を変更した場合、変更前の描画対象と変更後の描画対象の解像度が異なる場合のみ  SetDrawArea で描画範囲を描画対象全体にする」 この処理が原因で 1296 -> 1760 -> 960 と、画面の解像度が 1280 以外の間は m_mainScreen と解像度が 異なるため SetDrawScreen(m_mainScreen); や SetDrawScreen(DX_SCREEN_BACK); が呼ばれた際に描画範囲が 描画対象全体に変更されるのですが、 960 から 1280 に変更された際には画面の解像度が m_mainScreen と 一致するため SetDrawScreen(m_mainScreen); や SetDrawScreen(DX_SCREEN_BACK); が呼ばれた際に描画範囲が 描画対象全体になる、という処理が実行されず、結果として SetGraphMode による解像度変更前の描画範囲 ( 0, 0 ) 〜 ( 960, 540 ) が継続してしまい、画面下部に描画される筈の "TEXT3" と "TEXT2" が描画範囲外となり 描画されない、ということになってしまっていました 上記の仕様自体がリファレンスにも書かれていない処理なので、今回その仕様を無くし、SetDrawScreen が呼ばれたら 必ず変更後の描画対象の画面全体を描画範囲とするようにしました こちらに仕様変更後のバージョンをアップしましたので、よろしければお使いください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 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をお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ウィンドウサイズを変更後の表示について ( No.2 )
名前:Pika(解決) 日時:2016/09/13 23:14

想定通り動作させることができました。 対応ありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存