• 締切済み

C# ですみませんが ClientRectangl

MDI の子フォームでClientRectangleの値が変わります。 MDI全画面表示でPictureBoxを画面サイズに合わせて描画しようとしています。 サイズが計算されたものと違う、Locationも 親 frm = new Form2(); frm.MdiParent = this; frm.Size = new Size(mc.ClientRectangle.Right, mc.ClientRectangle.Bottom); Right=1161 Bottom=652 子 Form2_Load内でのClientRectangle Right=1128 Bottom=614 実際のPictureBoxをクリックイベントで捕まえる Right=1144 Bottom=652 どうしてこうなるのでしょうか?

みんなの回答

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.2

mc の型は何でしょうか? MDIのクライアント領域>MDI小ウインドウ>MDI小ウインドウのクライアント領域 で小さくなっていきます。 PictureBoxは子フォームからはみ出してませんか? Dockプロパティ、Anchorプロパティも参考になりそうなので合わせて示します。 http://woodbook.kir.jp/vblib/netlib/dock.html

  • ukagau
  • ベストアンサー率78% (15/19)
回答No.1

フォームの指定サイズが大きすぎると、 フォームが開かれた時にサイズが勝手に変更され、それと同時に位置もずれます。 指定するサイズを小さくしていけば法則性が見えて来るかもしれません。

関連するQ&A

  • MDIで、子フォームのみWPF

    winformで作ったアプリケーションに、MDIの導入を考えています。と同時にWPFにも興味があるのですが、MDIで作られる子フォームのみWPFにすることは可能でしょうか? 親winform⇒子winformの場合 //Form4はwindowsform Form4 childform = new Form4(); childform.MdiParent = this; childform.Show(); このように書いています。 それを 親winform⇒子WPFで //UserControl1はユーザーコントロールWPF UserControl1 childform = new UserControl1(); childform.MdiParent = this; childform.Show(); このように書いてみたのですが、エラーで使えませんでした。 MdiParentとShowに赤い線が引かれ、 自動機能で MdiParentには public Form1 MdiParent { get; set; } Showには internal void Show(){ throw new NotImplementedException(); } が、作られましたが解決には至りませんでした。 環境はvisualstdio2013でC#です。 そもそも子formのみWPFは可能なのでしょうか? 可能であれば、方法を教えてください。

  • C++/CLIとMFC

    よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

  • ピンボールのつくりかた教えて!

    VBを専門学校で習い始めています。課題としてtimerを使い、pictureboxに絵を入れてlocationをいじってつくるのですが、ちょうど端ではねかえるというのがうまくいきません。formのサイズは横450縦300です。pictureboxのlocationは0,0からはじめます。だれか教えて下さい、よろしくお願いします。

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

  • VB2008でMDIフォームを使用した時の不具合

    お世話になります。 VB2008でMDI親フォームから 子フォームを表示して子フォーム内のイベントから クラスモジュールを生成してフォーム内のリストに 表示処理を行っているのですが、クラスは確かに 呼ばれているのですが子フォーム内のリストに データが表示されません。 親フォームに Me.IsMdiContainer = True FRM = New FRMZIP With FRM .MdiParent = Me .Show() End With 以外に子フォームのオブジェクト定義が 必要なのでしょうか? VBは6.0以降殆ど実務では経験ありません。 宜しくお願いいたします。 PS 子フォームを単体で起動すると普通に 動作します。

  • C# コントロールの移動について

    数年のブランクののち、VB6からの乗り換えで、数日前から、C#を始めたところのまったくの素人ですが、よろしく。 起動時に、フォームは、指定の位置に移動・サイズ変更は反映しているのですが、 ピクチャアボックスの、移動は反映されません。 なぜでしょうか。 お手数ですが、素人にも理解できるように、ご教授ください。 ソース・・・ namespace C_TRY { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.Left = 200 ; // X位置 this.Top = 100; // Y位置 this.Width = 640; // 幅 this.Height = 480; // 高さ } private void pictureBox1_Layout(object sender, LayoutEventArgs e) { this.pictureBox1.Location = new Point(1000, 128); } } }

  • C# PanelのRegion設定について

    ボタンクリックにてPanelのRegion領域を変更したいのですが、勝手にリサイズされて困っております。 panel1の初期Location.X=0,Location.Y=0 のときはうまくいくのですが、初期Locationに値が入ると、矩形領域自体がリサイズされてしまいます。 (矩形領域が小さくなります。) なお、下記コードはテスト様に作成したもので、panel1のサイズを取得して、GraphicsPath からRegionを設定しています。 同じサイズなので、変化はないハズなのですが、初期Locationに値を設定すると、リサイズされてしまいます。 panel1のプロパティは panelのAutoSize=False Dock=None Margin=0,0,0,0 です。 private void button1_Click(object sender, EventArgs e) { Rectangle rect = new Rectangle(panel1.Location.X,panel1.Location.Y, panel1.Width,panel1.Height); GraphicsPath path = GetRoundRect(rect, 10); Graphics g = CreateGraphics(); g.SmoothingMode = SmoothingMode.AntiAlias; panel1.Region = new Region(path); } public GraphicsPath GetRoundRect(Rectangle rect, int radius) {   path.StartFigure();   path.AddLine(rect.Left, rect.Top, rect.Right, rect.Top);   path.AddLine(rect.Right, rect.Top,rect.Right, rect.Bottom);   path.AddLine(rect.Right, rect.Bottom,rect.Left, rect.Bottom);   path.AddLine(rect.Left, rect.Bottom,rect.Left, rect.Top);   path.CloseFigure();   return path; } アドバイスよろしくお願いいたします。

  • C#でPictureBoxが二重に表示される

    碁盤を描画し、その上にマウスを合わせたとき付近の交点にPictureBox(サイズは21x21)でカーソルを表示しようと考え、次のように書きました。 int sx = (int)Math.Floor((double)(e.X - 12) / 25) + 1; int sy = (int)Math.Floor((double)(e.Y - 12) / 25) + 1; imgCsObj.Location = new Point(sx*25-21, sy*25); しかし盤上でマウスを動かすと画像のように二重にカーソルが表示される現象が起きました。 おそらく内部的にはカーソルを表示した途端にフォーカスが盤から離れPictureBoxを移動する作業が中断されたせいでは、と思い imgCsObj.Enabled = false; imgCsObj.Location = new Point(sx*25-21, sy*25); imgCsObj.Enabled = true; 一度無効にしてフォーカスがあたらない状態で位置だけ変更しようと思いましたが同じ結果でした。 どうやって以前の位置のカーソルを消せば良いのでしょうか

  • 再描画すると消える

    ピクチャーボックスに以下のような図形を描画するプログラムを書きました。 (PictureBox1のBackGroundImageには最初から適当なイメージが設定されています。) Dim Grp As Graphics Grp = Graphics.FromImage(Me.PictureBox1.BackgroundImage) Grp.FillEllipse(New SolidBrush(PaintSelectedColor), e.X - Me.PictureBox1.Location.X - PaintHutosa \ 2, e.Y - Me.PictureBox1.Location.Y - PaintHutosa \ 2, PaintHutosa, PaintHutosa) Grp.Dispose() Me.PictureBox1.Refresh() しかし、これを実行すると再描画されたときに消えてしまいます。 消えてしまう原因と、消えないようにする対処法をご伝授ください。

  • C# マウスオーバーの記述方法

    クリックの場合は var アイコン = new PictureBox(); アイコン.Location = new System.Drawing.Point(10, 10); アイコン.Name = "アイコン"; アイコン.Size = new System.Drawing.Size(10, 10); アイコン.Click += (f, g) => {                //クリックされた時の処理 }; このように書いているのですが、 マウスオーバー(マウスをアイコンの上に持ってきたときにおこる処理)のかきかたがわかりません。 どのように書けばよいでしょうか?

専門家に質問してみよう