02Igarashi01
@02Igarashi01

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

妙なことが起こった C#

解決したいこと

this.ProcessControls();を含めると画面が4分の1サイズで表示されるように成る。
問題のコードを入れなければ、正常に表示される

発生している問題・エラー

有りません

スクリーンショット 2022-12-28 210319.png
スクリーンショット 2022-12-28 210541.png

該当するソースコード

public partial class FormPrincipal : Form
    {
        DispatcherTimer gameLoopTimer { get; set; }

        DispatcherTimer enemySpawnTimer { get; set; }

        Bitmap screenBuffer { get; set; }

        Graphics screenPainter { get; set; }

        BackGround backGround { get; set; }

        Player player { get; set; }

        List<GameObject> gameObjects { get; set; }

        public Random random { get; set; }

        public FormPrincipal()
        {
            InitializeComponent();


            this.random = new Random();
            this.ClientSize = Media.BackGround.Size;
            this.screenBuffer = new Bitmap(Media.BackGround.Width, Media.BackGround.Height);
            this.screenPainter = Graphics.FromImage(this.screenBuffer);
            this.gameObjects = new List<GameObject>();
            this.backGround = new BackGround(this.screenBuffer.Size, this.screenPainter);
            this.player = new Player(this.screenBuffer.Size, this.screenPainter);

            this.gameLoopTimer = new DispatcherTimer(DispatcherPriority.Render);
            this.gameLoopTimer.Interval = TimeSpan.FromMilliseconds(16.66666);
            this.gameLoopTimer.Tick += GameLoop;

            this.enemySpawnTimer = new DispatcherTimer(DispatcherPriority.Render);
            this.enemySpawnTimer.Interval = TimeSpan.FromMilliseconds(1000);
            this.enemySpawnTimer.Tick += SpawnEnemy;

            this.gameObjects.Add(backGround);
            this.gameObjects.Add(player);

            StartGame();
        }

        public void StartGame()
        {
            this.gameLoopTimer.Start();
            this.enemySpawnTimer.Start();
        }

        public void SpawnEnemy(object sender, EventArgs e)
        {
            Point enemyPosition = new Point(this.random.Next(74, this.screenBuffer.Width - 10) - 62);
            Enemy enemy = new Enemy(this.screenBuffer.Size, this.screenPainter, enemyPosition);
            this.gameObjects.Add(enemy);
        }

        public void GameLoop(object sender, EventArgs e)
        {
            this.gameObjects.RemoveAll(x => !x.Active);

            this.ProcessControls();

            foreach (GameObject go in this.gameObjects)
            {

                go.UpDateObject();

                if (go.IsOutOfBounds())
                {
                    go.Destroy();
                }


            }
            this.Invalidate();
        }

        private void FormPrincipal_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            e.Graphics.DrawImage(this.screenBuffer, 0, 0);
        }

        private void ProcessControls()
        {
            if (Keyboard.IsKeyDown(Key.Left)) player.MoveLeft();
            if (Keyboard.IsKeyDown(Key.Right)) player.MoveRight();
            if (Keyboard.IsKeyDown(Key.Up)) player.MoveUp();
            if (Keyboard.IsKeyDown(Key.Down)) player.MoveDown();
        }

        private void FormPrincipal_Load(object sender, EventArgs e)
        {
            
        }
    }

自分で試したこと

いろいろ試しても覚えてない

0

見たところ、Windows Forms で開発されているようですね。
一方で、Keyboard クラスは System.Windows.Input のクラスなので、WPF 用のクラスになります。

過去に私もはまったことがあるのですが、Windows Forms 環境に WPF コントロールのコードを混ぜると、高DPI(解像度)環境でえらいことになります。(モニタの設定で125% 等の設定になっている)

Windows Forms はデフォルトでは高 DPI に非対応で、通常は自動スケーリングでの対応です。
高解像度環境でややボケたりしますが、サイズは従来通りの見た目になります。

一方、WPF はデフォルトでシステムDPI(メインモニタの解像度には対応)の動作になります。
高解像度環境でも、文字や画像がボケないような調整が入ります。

ここで、Windows Forms 環境で WPF コントロールのコードがまざると、自動スケーリングが動作しなくなり、自動的に高解像度対応モードに入るので、解像度が高い環境でウィンドウなどのサイズが小さくなります。

マニュフェストファイルに DPI 機能に非対応を明記することで、おそらく対処可能と思います。

参考:https://www.exceedsystem.net/2020/10/29/how-to-fix-scaling-issues-when-scaling-dpi-is-not-set-to-100-percent/

4Like

ウチの場合Windouws 11 Home です。画面がリンクのとは大分違って何処をいじれば良いのか解りませんスクリーンショット 2022-12-30 090531.png

0Like

開発環境は Unity でしょうか?
Manifest ファイルの作成については下記サイトを参考に。
https://www.create-forever.games/windows-forms-high-dpi/

ここでは、高解像度に対応する手順がありますが、逆に対応しないことを明記するために
Dpiaware のタグ内で false を指定するのが、先に紹介した参考サイトの方になります。

ちなみに、今回の問題が高解像度に依存するものかどうかを判別する方法としては
システム設定で、拡大縮小の設定を 100% にして再起動後、例のコードの有無で画面サイズの差がなくなれば、ビンゴ、となります。
(そもそも全体が小さくなって見づらくなりますが・・・)

0Like

Your answer might help someone💌