none
form1を固定あるいはクライアント座標を知る。 RRS feed

  • 質問

  • C#でWindowsフォームアプリケーション(.NETFramework)で最初のform1を配置する位置ですが、
    form1のプロパティの配置の選択肢に、指定の値にセットするにはどうすれば良いでしょうか。
    webbrowserで表示するwebページに対するマウスカーソルの制御の関係で、左上(50,50)あたりに固定にしたいのです。選択肢には左上の他に手動があるのですが任意の値をセットする項目わからないのです。
    あるいは、クライアント領域原点のスクリーン座標を知ることができればよいのですが(こちらの方がベター)、調べたところズバリは見つけられませんでした。
    代わりの手段として、任意の最初のカーソルのスクリーン位置とクライアント座標から、クライアントスクリーン座標を逆算する方法をやっていましたが、今一つしっくりいかないのです。
    なおwebページの所定の位置をwebページのソース内容から知ることはできません(HTMLでないのでできていない)。
    2019年10月16日 13:05

すべての返信

  • StartPositionプロパティをManualにして、Location(もしくはLeft,Top)プロパティで初期位置を指定できます。
    座標はPointToScreenでクライアント座標からスクリーン座標へ、PointToClientでスクリーン座標からクライアント座標に変換できます。

    namespace WindowsFormsApp1
    {
        using System;
        using System.Drawing;
        using System.Windows.Forms;
    
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                this.StartPosition = FormStartPosition.Manual; //初期位置を指定できるように
                this.Location = new Point(50, 50);//ウィンドウの左上の座標
    
                this.Shown += Form1_Shown;
            }
    
            private void Form1_Shown(object sender, EventArgs e)
            {
                //クライアント領域左上のスクリーン座標を計算
                Point pScreen = this.PointToScreen(this.ClientRectangle.Location);
             
                //クライアント領域の左上をスクリーン座標の(50,50)にしたいなら移動
                this.Left += 50 - pScreen.X;
                this.Top += 50 - pScreen.Y;
            }
        }
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2019年10月16日 17:43
  • 早速のご返事ありがとうございます。C#初めての者には大変参考になります。
    早速実装してみましたが、いくつか関連疑問があります。再度ですみませんがご教示をお願いします。
    1.windowのLocationをPoint(70,0)にして(client領域はずらしておく)、下記のコードでは
    windowのx座標は70が期待されますが、実際にはLabel表示は78になります。またMPPUtility(マウス座標を表示するツール)でみてもウィンドウの左端は78付近となります。x=70までは画面上で2mmほど違いがあります。
    これはなぜでしょうか。なにかのマージンがあるかと思いますが・・・。
            public int offx,offy,posx,posy,rleft,rtop;
            public Form1()
            {
                InitializeComponent();
                webBrowser1.Navigate("https://www.google.com/?hl=ja");
                Thread.Sleep(5000);
                this.StartPosition = FormStartPosition.Manual; //初期位置を指定できるように
                this.Location = new Point(70, 00);//ウィンドウの左上の座標(上端は上限に)
                //クライアント領域左上のスクリーン座標を計算
                Point pScreen = this.PointToScreen(this.ClientRectangle.Location);
                offx = pScreen.X;
                offy = pScreen.Y;
                lbloffx.Text = offx.ToString();  //lbloffxはラベルコントロール
                lbloffy.Text = offy.ToString();
     }
    2.ご教示頂いたコードのShowの意味はなんでしょうか。
     移動させたクライアント領域を再表示させることでしょうか。またこのような機能はどのようなキーワードで検索できますか。
            public Form1()
            {
                InitializeComponent();
     
              this.Shown += Form1_Shown;
            }
            private void Form1_Shown(object sender, EventArgs e)
            {

    2019年10月17日 1:45
  • 1.windowのLocationをPoint(70,0)にして(client領域はずらしておく)、下記のコードでは
    windowのx座標は70が期待されますが、実際にはLabel表示は78になります。またMPPUtility(マウス座標を表示するツール)でみてもウィンドウの左端は78付近となります。x=70までは画面上で2mmほど違いがあります。
    これはなぜでしょうか。なにかのマージンがあるかと思いますが・・・。

    例えばWindows10だとウィンドウの枠のように見える線は、実際にはウィンドウの端ではなかったりします。これは透明な枠線があるのです。
    マウスの位置がウィンドウの少し外側にあるとカーソルがサイズ変更カーソルになるのは、この透明な枠線に反応しているからです。
    ウィンドウ全体の大きさはこの透明部分を含んでいます。そのため見た目の端がズレて見えているのでしょう。

    Win32APIのGetSystemMetricsで枠の大きさは調べられます。
    枠の大きさをあらかじめ調べて表示前にLocationを設定することも可能ですが、手順が増えるので、初心者向きではないです。

    2.ご教示頂いたコードのShowの意味はなんでしょうか。
     移動させたクライアント領域を再表示させることでしょうか。またこのような機能はどのようなキーワードで検索できますか。

    Form.Shownイベントです。
    フォームが表示されるときに1度発生するイベントで、+=の右辺でイベント発生時に呼び出されるメソッドを追加しています。
    このタイミングで座標をずらす計算をさせています。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2019年10月17日 10:27
  • ・枠線であることわかりました。

    ・仕様をみてなんとなくわかりました。ただ+=でメッソドを追加の意味は現段階では理解できなかったですが。(そのうちにわかるかと)

    有用なご教示ありがとうございました。

    2019年10月17日 12:16
  • sige2さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    gekkaさんから寄せられた投稿はお役に立ちましたか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

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

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年10月21日 2:53
    モデレータ