none
VB2017 プロパティと取得値の違い RRS feed

  • 質問

  • ウィンドウズ10でVB2017を学習始めました。プロパティでの指定値とプログラミングで取得する値に大きな違いがあります。

    例 フォーム       プロパティ (width 600,height 460)  プログラム (width 452.height 369)

         ピクチャーボックス  プロパティ (width 20,height 30)      プログラム (width 15.height 24)

    多分これによりピクチャーボックスがフォームの右側を超えないようにするプログラム

    Public Class Form1
        Dim Cpos As Point
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Cpos = PointToClient(Cursor.Position)
            If Cpos.X < 0 Then
                Cpos.X = 0
            End If
            If Cpos.X > Width - Player.Width Then
                Cpos.X = Width - Player.Width
            End If
            Player.Left = Cpos.X
            Console.WriteLine(Width)
            Console.WriteLine(Player.Width)
            Console.WriteLine(Width - Player.Width)
            Console.WriteLine(Cpos.X)
            Console.WriteLine(Height)
            Console.WriteLine(Player.Height)
        End Sub

    が正常に動作しません。Player.Width*2 にすると見かけ上は目的の動作になります。

    このようになる理由と対策がわかりません。

    2018年2月4日 0:09

回答

  • その環境は、スケーリングが 150% など、100% 以外になっていませんか?
    この仮定が合っている前提で書きます。

    Visual Studio のデザイナでは使用中のスケーリングを元にしたサイズとなります。
    しかし、実行時は 100% 相当のサイズを DPI 仮想化の仕組みで拡大(ぼやける)したものを表示しています。
    また、フォームはデフォルトで AutoScaleMode プロパティが Font となっているので、スケーリングの設定によって伸び縮みするようになっているので、実行時(=100% 時)はデザイン時よりも小さな数値となります。

    直近、取り上げた DPI 仮想化を解除する方法 でずれなくなるのなら、DPI 仮想化の影響と言えます。
    ただし、DPI 仮想化を解除すると言うことは、スケーリングを正しく実装しないといけないので、別の問題が出てくると思いますが…。
    そういったややこしいことを気にしなくて済むようにしたいのなら、スケーリングを 100% で使うことになります。

    • 回答としてマーク azumao 2018年2月5日 2:21
    2018年2月4日 1:06
    モデレータ
  • 全ての値が等しく3/4になるのであれば、数式が正しい限り大小関係も変わらないため特に問題は発生しないはずでは? もし意図通りにならないのであれば数式が誤っているかと思います。

    なお、3/4になるのは、プログラムを実行しているPCの画面が125%拡大されているからではないでしょうか? 拡大率を100%に設定すれば少なくとも3/4されることはなくなります。

    それとは別に、PictureBoxの位置指定そのものについては、Windows フォームにコントロールを固定するで説明されていますが、Anchorプロパティで位置固定することができます。

    • 回答としてマーク azumao 2018年2月5日 2:21
    2018年2月4日 1:10

すべての返信

  • その環境は、スケーリングが 150% など、100% 以外になっていませんか?
    この仮定が合っている前提で書きます。

    Visual Studio のデザイナでは使用中のスケーリングを元にしたサイズとなります。
    しかし、実行時は 100% 相当のサイズを DPI 仮想化の仕組みで拡大(ぼやける)したものを表示しています。
    また、フォームはデフォルトで AutoScaleMode プロパティが Font となっているので、スケーリングの設定によって伸び縮みするようになっているので、実行時(=100% 時)はデザイン時よりも小さな数値となります。

    直近、取り上げた DPI 仮想化を解除する方法 でずれなくなるのなら、DPI 仮想化の影響と言えます。
    ただし、DPI 仮想化を解除すると言うことは、スケーリングを正しく実装しないといけないので、別の問題が出てくると思いますが…。
    そういったややこしいことを気にしなくて済むようにしたいのなら、スケーリングを 100% で使うことになります。

    • 回答としてマーク azumao 2018年2月5日 2:21
    2018年2月4日 1:06
    モデレータ
  • 全ての値が等しく3/4になるのであれば、数式が正しい限り大小関係も変わらないため特に問題は発生しないはずでは? もし意図通りにならないのであれば数式が誤っているかと思います。

    なお、3/4になるのは、プログラムを実行しているPCの画面が125%拡大されているからではないでしょうか? 拡大率を100%に設定すれば少なくとも3/4されることはなくなります。

    それとは別に、PictureBoxの位置指定そのものについては、Windows フォームにコントロールを固定するで説明されていますが、Anchorプロパティで位置固定することができます。

    • 回答としてマーク azumao 2018年2月5日 2:21
    2018年2月4日 1:10
  • ありがとうございました。プロパティー値とイミディエイトウィンドウの値が一致しました。
    2018年2月4日 2:11
  • ありがとうございました。プロパティー値とイミディエイトウィンドウの値が一致しました。
    2018年2月4日 2:11
  • azumao さん、こんにちは。フォーラム オペレータの立花です。
    MSDN フォーラムへのご投稿ありがとうございます。

    フォーラム オペレーターからのお願いです。
    参考となる投稿がありましたら、[回答としてマーク] を設定いただき、
    同じ問題でお困りの方へも、情報をご提供くださいませ。

    ご協力の程、どうかよろしくお願いいたします。

    フォーラム利用時の注意点のお知らせです。
    ※初めてご投稿された方を対象にお知らせしています。

    ご利用の際は、下記内容をお守りいただきますと
    情報が寄せられやすくなりますので、ぜひご一読ください。
    ・フォーラムでご質問頂くにあたっての注意点
    ・フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年2月5日 1:03
    モデレータ