• 締切済み

c# Moveイベなしで子コントロールの移動を感知

 こんにちは。c#初心者です。  今までは子コントロールが移動した事を知るためにはMoveイベントを使ってきたのです。が、ちょっと気になって、OnMoveメソッドを(空のメソッドで)オーバーライドしてMoveイベントを発生させないコントロールを作ってTableLayoutPanelで普通のButtonコントロールと比較実験してみました。  すると、普通のButtonではLeft += 10;とすると、ひとまず左にずれ、イベントが発生し、そこからTableLayoutPanelに戻されて、再びイベントが発生する、という流れでした(もうこの時点でイベントが2回しか発生していないので、次を見なくても分かるのですが)。  その後、Moveイベントを発生させないコントロールで同様にLeft += 10;とすると、無論イベントは発生しませんでしたが、確かに左へ10動いた後、右へ10動きました。  Resizeも同様に比較しましたが、同様の結果が得られました。  何が言いたいかのと言うと、どうやらTableLayoutPanelはMoveイベント(Resizeイベント)を使わずに子コントロールの移動/サイズ変更を感知しているようで、この真似をしたいのですが、どうすればよいのでしょうか?  OnMove(OnResize)メソッドの後に呼び出され、親コントロールに移動/サイズ変更を伝えるメソッドがControlクラスにあると思ったのですが、それも見当たりません。  どなたか、分かる方、いらっしゃいましたら教えていただけませんか?

みんなの回答

回答No.1

細かい動作はUnoducmnetedの様ですが……。 .NET Fx 4.0におけるStackTraceとReference SourceCodeを見る限り, 1. 子コントロールが移動する 2. 子コントロール (のset_Left) が自身のSetBoundsを呼び出す 3. 子コントロールのSetBoundsがSystem.Windows.Forms.Layout.LayoutTransaction.DoLayoutを呼び出す (LayoutTransactionはinternal staticなクラス) 4. 親コントロールのPerformLayoutが呼び出される 5. 親コントロールのOnLayoutが呼び出される→Control.OnLayoutが呼び出される 6. LayoutEngine.Layoutが呼び出される→TableLayout.LayoutCoreが呼び出される (System.Windows.Forms.layout.TableLayoutはLayoutEngineを継承したinternalクラス) 7. 再レイアウトされる という動作になっています。 OnLocationChangedでスタックトレースを出力させて,それに合わせてReference SourceCodeを参照していくことで,上記のような情報が得られます。 ref) Microsoft Reference Source Code Center http://referencesource.microsoft.com/ カスタムのレイアウトを用意したいのであれば,MSDNに記述があります ref) 方法 : カスタム レイアウト エンジンを実装する http://msdn.microsoft.com/ja-jp/library/ms171727.aspx

関連するQ&A

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

    添付図左側のようにある決められた領域内いっぱいにAというコントロールがあります。 そこにBというコントロールをドラッグ&ドロップすると添付図右側のように自動でサイズ調整し、接合するようにしたいです。 図ではコントロールのサイズを決めていないのですが、ドラッグ&ドロップをして新しくコントロールを追加するたびに決められた領域内で均等なサイズにリサイズされれば良いと思っています。 設定方法やメソッドの使いかた等教えてもらえると助かります。 宜しくお願い致します。

  • 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); } } }

  • VBのイベント処理について

    お世話になります。 VB6.0のイベント処理について教えてください。 VB.NETでは、イベント処理のメソッド(VBだとプロシージャですか) のシグニチャのおしりに Handles Button1.Click という記述がされているので、このメソッドはButton1のクリックという イベントが発生したときに行われる処理だなと見当がつくのですが、 VB6.0ではその記述をしないのが一般的とみました。 してそのときに、このメソッドがButton1のクリック時のイベントだと いうのは、どのように判断されるのですか?メソッド名が Button1_Click みたいに勝手につけられるので、それで判断されるのですか?という ことはメソッド名を変えたらそのメソッドはButton1のクリック時の イベント処理メソッドではなくなってしまうのですか? よろしくご教授ください。

  • エクセルのプログラムでイメージコントロールで表示した画像のサイズを変更したり移動する方法

    エクセルでまずユーザーフォーム、イメージコントロール、コンボボックス(サイズ変更)、スクロールバー(表示位置)を作り、 Set イメージ.Picture = Load Picture("C\xxx.xxx") というようにイメージコンロールに画像を表示させ、イメージコントロールのサイズや位置を変えることなくその中にある画像の部分のみサイズや表示位置を変えたいのですがどのようにすればよいのでしょうか? MoveメソッドやPictureSizeModeを使うとイメージコントロール自体が変わってしまいます。 回答よろしくお願いします。

  • 実行時のコントロール移動について

    実行時にデザイン時と同じようにコントロール移動をおこないたいのですが、コードを忘れてしまいました。もしご存知の方ご教授お願いします。下記にしめしたものが少しだけ覚えているものです。したがってうまく起動できていません。よろしくお願いしたいます。VB6です。w2k Private Sub cmd_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) x1 = X y1 = Y End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then cmd.Left = (X - x1) + x1 cmd.Top = (Y - y1) + y1 End If End Sub

  • ASP.NET 動的コントロールのフォーカス移動

    ASP.NET(VB)で開発しています。 Page_init時に生成されるテキストボックス1、2(動的コントロール)を表示します。 テキストボックス1のテキストチェンジイベント時に テキストボックス2にフォーカスが移動するようにしたいです。 テキストチェンジでPostBackが発生し、サーバ側でテキストボックス2.Focus() と記述しているのですが、動作は、テキストボックス2に フォーカスが移らず、画面上のどこにもフォーカスがあたっていない状態になってしまいます。 動的コントロールへ、PostBack時にフォーカス移動させるにはどうしたら良いか お願いいたします。

  • 押しっぱなしの処理

    今Windows APIでゲームを作っています。 例えばキャラクターがマスを移動するときに左ボタンを押すと左に動き 押し続けると一定時間あいたあとにある速さで連続して左に動きます。 case WM_KEYDOWN: if(wParam == VK_LEFT){ Move(LEFT); } 現状のプログラムはこんな感じです。 それを押し続けて時間があいてからではなくすぐに左に動くようにしたいです。 それとその後の左に行き続ける速さもできれば調節したいです。 そうするにはどうすればよいのでしょうか?

  • C# 簡単なシューティング 自機移動について

    かなりの初心者で困っています。 簡単なシューティングを作ろうとおもっています。 使用ソフトはVisualC#2005です。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //自機(右移動) private void button3_Click(object sender, EventArgs e) { if (timer1.Enabled == false) { timer2.Enabled = false; timer1.Enabled = true; } else { timer1.Enabled = false; timer3.Enabled = false; timer4.Enabled = false; } } private void timer1_Tick(object sender, EventArgs e) { pictureBox1.Left = pictureBox1.Left + 2; } //自機(左) private void button4_Click(object sender, EventArgs e) { if (timer2.Enabled == false) { timer1.Enabled = false; timer2.Enabled = true; } else { timer2.Enabled = false; timer3.Enabled = false; timer4.Enabled = false; } } private void timer2_Tick(object sender, EventArgs e) { pictureBox1.Left = pictureBox1.Left - 2; } //自機(上) private void button1_Click(object sender, EventArgs e) { if (timer3.Enabled == false) { timer4.Enabled = false; timer3.Enabled = true; } else { timer1.Enabled = false; timer2.Enabled = false; timer3.Enabled = false; } } private void timer3_Tick(object sender, EventArgs e) { pictureBox1.Top = pictureBox1.Top - 2; } //自機(下) private void button2_Click(object sender, EventArgs e) { if (timer4.Enabled == false) { timer3.Enabled = false; timer4.Enabled = true; } else { timer1.Enabled = false; timer2.Enabled = false; timer4.Enabled = false; } } private void timer4_Tick(object sender, EventArgs e) { pictureBox1.Top = pictureBox1.Top + 2; } } } 自機は画像(PictureBox)でボタンによって上下左右に移動します。 FormのSizeは800,630です。 自機の移動がボタンなのでキー入力によって操作できるようにしたいのですが、 それと、自機の移動範囲を画面からでないようにしたいです。 あまりC#を理解できてない上でつくったのでおかしな点が多々あると思います。 教えていただける方がいると助かります。

  • VB6 自分自身のフォームが移動したことを知る方法

    お世話になります。 VB6でメインフォーム(*.exeで起動されるフォーム)がデスクトップ内で移動したことをそのフォーム自身が知るためにはどのようにすればよいでしょうか。 目的は、移動後のフォームの位置情報の取得です。 フォームのサイズを変更した時は"Resize"イベントが発行されるので、それをきっかけにLeft,Top情報を取得できます。 同じようにフォームが移動した時にLeft,Top情報を取得する方法を知りたいです。 API等の利用で可能になるのであればそれでもかまいません。 よろしくお願いします。

  • ActionScriptのイベント処理で任意の時間遅らせて処理する方法

    こんばんは。 現在、Actionscript3.0にてFLASHコンテンツを制作しております。 あるイベント処理の際に、任意の秒数処理を遅らせて実行したいと考えております。 例えば、 1.ブラウザのサイズを任意にリサイズする  (addEventListener RESIZEイベント呼び出し) ↓ 2.変更したサイズに合わせてステージ上のオブジェクトが指定の位置に移動する  (オブジェクトの位置を移動させる処理の実行) 2の動きを、ブラウザリサイズ後、任意の秒数置いてから実行させたいと考えています。 例で言うと以下サイトでブラウザをリサイズした際に、後からオブジェクトが追従するような動きです。 http://www.duras.jp/ ご教授宜しくお願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう