3

.Net Compact Framework 1.0で開発された大規模なアプリケーションがあり、過去9年間に大量のフォームとカスタムコントロールを使用して開発されました。このアプリケーションは、240x320画面用に設計されています。Compact.Net1.0およびVisualStudio2003でコンパイルすると、480x640の画面に適切にスケーリングされます。

Visual Studio 2008の既定のアップグレードウィザードを使用して、アプリケーションを.Net 2.0にアップグレードしました。アプリケーションはフルスクリーンを使用し、解像度240x320のデバイスを使用する場合、すべてのコントロールは設計どおりにレイアウトされます。ただし、解像度が480x640のデバイスを使用する場合、アプリケーションは画面の左上25%しか使用しません。

コードを使用してみました:AutoScaleDimensions = new SizeF(96,96); AutoScaleMode = AutoScaleMode.Dpi;

フォームでは機能しますが、フォームに配置されている動的コントロール(標準/カスタム)では機能しません。

AutoScaleDimensions / AutoScaleModeプロパティを使用せずに、.Net1.0を使用してコンパイルした場合と同様のスケーリングをアプリケーションに強制的に使用させる方法はありますか。

ありがとう。

4

2 に答える 2

3

カスタムコントロールを作成するコードには、おそらく使用されているデザイナーの特定のDPIを想定したハードコードされた値が含まれているように聞こえます96。

次のようなものを使用して、アプリケーションが実行されているデバイスのホスト解像度を分析できます。

const float designResolution = 96.0f; 
float scaleFactor;

System.Drawing.Graphics g = f.CreateGraphics();
float runningResolution = g.DpiX;
scaleFactor = runningResolution / designResolution;
g.Dispose();

次に、動的コントロールを作成しているコード内のハードコードされた座標を変更して、計算されたscaleFactorで値を調整します。次に例を示します。

const int controlY = 8;
int yPosition = (int)(controlY * scaleFactor);
于 2010-10-19T16:26:23.427 に答える
2

私はこの問題に対する一種の解決策を見つけました。

simons19で説明されている手順と同様のスケール係数を取得し、動的に作成されたコントロールをフォームに追加するときに、メソッドcontrol.Scale(scale-factor)を呼び出します。これで私の問題は解決しました。scaleメソッドは、コントロールのLocationとSizeの両方をスケーリングするため、scaleプロパティを呼び出す前に、動的に作成されたコントロールのlocationプロパティとsizeプロパティの両方を設定します。

例:

Label lblTest = new Label();
lblTest.Text = "A Test Label";
lblTest.Location = new Point(10, 5);  //Designed in relation to a 96 dpi screen
lblTest.Size = new Size(30, 10);      //Size Designed in relation to 96 DPI screen
parentControl.Controls.Add(lblTest);
//Scale Factor is calculated as mentioned by simons19
lblTest.Scale(scaleFactor);           //Scale the control to the screen DPI.
于 2010-10-20T16:04:43.633 に答える