6

画面と解像度に応じてフォームサイズを変更したい。

私が欲しいのは、これらの画面の変更と実行時の画面解像度の変更を追跡するための正しいイベントです。

言い換えると、

  1. ユーザーが 2 つの画面を使用していて、アプリケーションを別の画面に移動する場合は、それを追跡し、それに応じてサイズを変更する必要があります。つまり、新しい画面の解像度が低い場合はサイズを小さくし、解像度が大きい場合はサイズを大きくします。

  2. また、同じ画面で画面解像度の変更を追跡し、それに応じてサイズを変更します。

フォームのサイズを変更し、現在の画面とその解像度を取得する方法を知っています。これらの変更を追跡するためにこれらのイベントが必要なだけです。

4

1 に答える 1

9

この回答を調べて、それを改善し、さらに情報を追加して、より完全なソリューションを形成することにしました。

チャレンジ

フォームが現在レンダリングされている画面を追跡します。これは、ユーザーがフォームを別のモニターにドラッグしたり、モニターのプラグを抜いたりすると変化する可能性があります。ユーザーが手動でウィンドウを別のディスプレイにドラッグするか、解像度を直接変更すると、解像度が変わる可能性があります。

まず、フォームの場所を追跡します。フォーム コンテキストの Move イベントにフックする必要があります。幸いなことに、.Net フレームワークはそのようなイベントを提供し、それはControl.Move Eventという名前です。

次に、画面解像度変更イベントにフックする必要があります。これは、SystemEvents.DisplaySettingsChangedイベントで実行できます。

で、まとめるとこうなりました。

struct Resolution
{
    public int Width;
    public int Height;
}

int previous = -1;
int current = -1;

private bool CheckScreenChanged()
{
    bool changed = false;
    current = GetScreenIndex();

    if (current != -1 && previous != -1 && current != previous) // form changed screen.
    {
        changed = true;
    }

    previous = current;

    return changed;
}

private int GetScreenIndex()
{
    return Array.IndexOf(Screen.AllScreens, Screen.FromControl(this));
}

private Resolution GetCurrentResolution()
{
    Screen screen = Screen.FromControl(this);
    Resolution res = new Resolution();
    res.Width = screen.Bounds.Width;
    res.Height = screen.Bounds.Height;

    return res;
}

private void SetResolutionLabel()
{
    Resolution res = GetCurrentResolution();
    label2.Text = String.Format("Width: {0}, Height: {1}", res.Width, res.Height);
}

private void ScreenChanged()
{
    label1.Text = "Screen " + current.ToString();
}

private void Form_Moved(object sender, System.EventArgs e)
{
    bool changed = CheckScreenChanged();
    if (changed == true)
    {
        ScreenChanged();
        SetResolutionLabel();
    }
}

public void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
    SetResolutionLabel();
}

public void Initialize()
{
    this.Move += Form_Moved;
    SystemEvents.DisplaySettingsChanged += new
    EventHandler(SystemEvents_DisplaySettingsChanged);

    previous = GetScreenIndex();
    current = GetScreenIndex();
    ScreenChanged();
    SetResolutionLabel();
}

上記のコードは、label1 と label2 という 2 つのラベルを持つ単純なフォームでテストされています。ラベルは、フォームが表示されている画面が変更されたり、解像度が変更されたりすると更新されます。

プライマリ画面/ディスプレイでの動作中の画像

スクリーン0

そして、フォームがドラッグされたときの私の二次画面/ディスプレイで:

ここに画像の説明を入力

于 2013-07-22T14:30:51.667 に答える