1

ユーザーの画面の仮想表現を表示するデスクトップ アプリケーションがあります。アプリケーション内のキャンバスの比率が、ユーザーの画面の比率と一致しません。

ここに画像の説明を入力

私のアプリケーション内で、ユーザーは画面に長方形のセクションを追加できます。長方形を追加すると、実際のデスクトップのデフォルト サイズは 450x300 になります。そのため、仮想デスクトップの四角形のサイズを変更して、それを反映する必要があります。

だから私は単純にこれを行うことはできません:

double virtualRectWidth = VirtualResolutionX / (RealResolutionX / 450);
double virtualRectHeight = virtualRectWidth / (RealResolutionX / RealResolutionY);

アスペクト比が一致しません。

仮想長方形のサイズを調整するにはどうすればよいですか?

4

1 に答える 1

1

考えられるすべてのオプション (実際の高さ/幅が仮想の高さ/幅よりも大きい/小さい) を考慮し、最適な構成が提供されることを確認したい場合 (利用可能なスペースが最大化されるように再スケーリングが行われます)、そうではありません。とても簡単です。以下のコードは、すべての不測の事態を考慮しています。

double safeRatio = 0.95; //Avoiding identical height/width
double heightWidthRatio = virtualRectHeight / virtualRectWidth; //450 / 300
double diffWidth = safeRatio * realRectWidth - virtualRectWidth;
double diffHeight = safeRatio * realRectHeight - virtualRectHeight;
double virtualRectWidth_final = virtualRectWidth;
double virtualRectHeight_final = virtualRectHeight;

if (diffWidth <= 0 && diffHeight <= 0) //virtualRectWidth >= safeRatio*realRectWidth and virtualRectHeight >= safeRatio*realRectHeight
{
    int counterDec = 10;
    if(Math.Abs(diffWidth) > Math.Abs(diffHeight))
    {
         virtualRectWidth_final = safeRatio * realRectWidth + counterDec;
         do
         {
              virtualRectWidth_final = safeRatio * realRectWidth - counterDec;
              virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
         } while(virtualRectHeight_final > safeRatio * realRectHeight);
    }
    else
    {
         virtualRectHeight_final = safeRatio * realRectHeight + counterDec;
         do
         {
              virtualRectHeight_final = safeRatio * realRectHeight - counterDec;
              virtualRectWidth_final = virtualRectHeight_final / heightWidthRatio;
         } while(virtualRectWidth_final > safeRatio * realRectWidth);
    }
}
else if (diffWidth <= 0) //virtualRectWidth >= safeRatio*realRectWidth
{
    virtualRectWidth_final = safeRatio * realRectWidth;
    virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
    if (virtualRectHeight_final >= safeRatio * realRectHeight) 
    {
        virtualRectHeight_final = safeRatio * realRectHeight;
        virtualRectWidth_final = virtualRectHeight_final / heightWidthRatio;
    }
}
else if (diffHeight <= 0) //virtualRectHeight >= safeRatio*realRectHeight
{
    virtualRectHeight_final = safeRatio * realRectHeight;
    virtualRectWidth_final = virtualRectHeight_final / heightWidthRatio;
    if (virtualRectWidth_final >= safeRatio * realRectWidth)
    {
        virtualRectWidth_final = safeRatio * realRectWidth;
        virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
    }
}
else //virtualRectWidth < safeRatio*realRectWidth && virtualRectHeight < safeRatio*realRectHeight
{
    if (diffWidth < diffHeight)
    {
        virtualRectHeight_final = virtualRectWidth_final * heightWidthRatio;
    }
    else
    {
        virtualRectWidth_final = virtualRectHeight_final / heightWidthRatio;
    }
}

最終値はvirtualRectWidth_finalとで与えられvirtualRectHeight_finalます。ちょっとした作業で、コードのサイズを小さくできるかもしれませんが、ここで重要なのは結果です...私はあなたの質問に答えるだけで十分です.

于 2013-07-26T08:29:35.047 に答える