dpi変更時の挙動について
furafura  2016/04/23(Sat) 18:13
まずは2016版の報告とお礼が大変遅くなりましてお詫びします。
D&Dの挙動確認致しました。
Web カメラの解像度変更対応や
熱望していたx64への対応に喜んでおります。
本当にありがとうございました。

表題の件ですが、以前お話したDPIに絡んだ事です。
2015版(20150602)までは問題なく、2016版を組み込んでみて困った事があります。

DPIの変更を行うと表示がフルスクリーン(画面一杯)にならない場合があります。

2016版ですと、Win8.1(それ以外では未確認)のQH55/MとCF-RZ4では、dpiの設定値によっては、画面一杯の表示にならず、何らかのスケーリング?が発生してしまいます。dpi設定は、「大きくする」とか「小さくする」での変更です。

#define SCREEN_MINSIZE_X 1024//1366 800
#define SCREEN_MINSIZE_Y 768//480

void Main()
{
UINT i;
Size val;// = {0,0};

const Font font(30);

//-----------------------------------------------
Window::Resize(SCREEN_MINSIZE_X, SCREEN_MINSIZE_Y);
Graphics::SetBackground(Color(247, 215, 199));
Window::SetPos(0, 0);
//-----------------------------------------------
std::vector<Size>::iterator iter;
std::vector<Size> reso = Graphics::GetFullScreenSize();
val = *(reso.end() - 1);
LOG(L"\nfullscreen size x:", val.x);
LOG(L"\nfullscreen size y:", val.y);

//+++++++++++++++++++++++++++++++++++++++++++++++
Window::SetFullscreen(true, val);
val = Window::Size();
//+++++++++++++++++++++++++++++++++++++++++++++++

LOG(L"\nWidth:", val.x);
LOG(L"\nHeight:", val.y);

//===============================================
Window::SetStyle(WindowStyle::NonFrame);
Window::Resize(val);
Window::SetPos(0, 0);
//===============================================
while (System::Update())
{
if(val != Window::Size()) {
val = Window::Size();
LOG(L"\nWidth:", val.x);
LOG(L"\nHeight:", val.y);
}
font(Window::Width(), L'×', Window::Height()).draw();
}
}

上記プログラムの場合の話です。
そのまま実行すれば問題が発生する可能性が高いと思われます。

dpiを変更した後での起動、或いは起動中に変更しますと、デバイスの最高解像度が1920*1200にも関わらず、2880×1800と出たりします。
(RZ4の場合、「大きくする」右端が正常で、左に寄せると最高解像度以上の数値になりました)

スケーリングについては、上記プログラムで無くても発生しています。2015版では発生しないはずです。

上記プログラムのコメントで括ってある、-・+・=の塊ですが、
-部分を無効にすると1920*1200のままかと思われます。
+部分は、フルスクリーンモードを用いていますが、この部分を無効にしても最高解像度以上の数値が出ます。
=部分は無効にして-部分を有効にしていると1920…のままみたいです。

私の期待する挙動としては、dpi設定値に関わらず、フルスクリーン時にはスケーリングが発生しないようにしたいのと、
出来ればノンフレーム+最高解像度でのリサイズでもスケーリングが発生しないようにしたいのと、
上記プログラムのままでdpi値に関わらず、Window::Sizeで得られる数値が最高解像度を超えないで欲しいです。
結局、2015と同じ挙動が望ましいと考えております。

こちらでいろいろ試したのですが、今の所、dpi変更をしない事をユーザーに強要するしか、回避方法が見つかりませんでした。
何か良い方法がありましたら教えていただけないでしょうか?
記事編集
Reputeless  2016/04/23(Sat) 23:44
ユーザの DPI 設定が 100% より大きい場合、フルスクリーン時に機器の最大解像度を活用できないのは現バージョンでの制限です。
今後のバージョンで対応します。

ユーザの DPI 設定をもとにフルスクリーンを実現する場合は
Window::SetStyle(Window::Style::NonFrame);
Window::Resize(Window::GetState().screenSize);
Window::SetPos(0, 0);
とするのが良いでしょう。

a) DPI を変更したあとにサインアウトせずに Siv3D アプリを起動
b) Siv3D アプリの起動中に DPI を変更
上記に関しては現時点でサポート対象外の操作です。

Window::GetState().desktopScaling の値が、96 を基準としたユーザの DPI スケーリングを示します。
1.0 が機器の解像度を最大限活用するスケーリングで、この値が大きくなると活用できる解像度が小さくなります。
編集
furafura  2016/04/24(Sun) 23:58
教えていただいた情報から、現時点では、
Window::SetStyle(Window::Style::NonFrame);
Window::Resize(Window::GetState().screenSize);
Window::SetPos(0, 0);
を用いて対処する事にしました。

ユーザーには、
Window::GetState().desktopScaling
の値を提示し、必要なら1.0になるように手動で調整させる事にします。

今回もありがとうございました。
編集
件名
Re: dpi変更時の挙動について
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -