Alex Shulgin wrote: > Hi, > > I'm trying to add some custom control to ToolStripDropDown using > ToolStripControlHost. > > This works fine with .NET, but with Mono (2.2) the control is always > resized to 22 pixels tall... Too bad I can't find a workaround for a > few days now. > > Any help & suggestions are much appreciated. :)
If someone could tell how to create a popup window w/o using ToolStripDropDown I'd be grateful. Since it's exactly the thing I'm trying to accomplish--using ToolStripDropDown is just the shortest way in .NET, but it seems to be broken in Mono. I've tried to override CreateParams property of Control class with the code similar to the one found in Mono's ToolStripDropDown sources, but no luck: public class PopupWindow : System.Windows.Forms.Control { private Control content; public PopupWindow(Control _content) { this.content = _content; this.Size = _content.Size; this.MinimumSize = this.Size; } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.Style = unchecked((int)0x82000000); // WS_POPUP | WS_CLIPCHILDREN cp.ExStyle |= 0x00000088; // WS_EX_TOOLWINDOW | WS_EX_TOPMOST Console.WriteLine("PopupWindow.get_CreateParams: returning {0}; cp.Style=0x{1}", cp, cp.Style.ToString("X")); return cp; } } protected override void OnResize(EventArgs e) { Console.WriteLine("PopupWindow.OnResize: Bounds={0}", Bounds); } protected override void OnPaint(PaintEventArgs e) { Console.WriteLine("PopupWindow.OnPaint: Bounds={0}", Bounds); base.OnPaint(e); using (Pen p = new Pen(Color.Black)) { e.Graphics.DrawRectangle(p, Bounds); } } } The program output is (after right-clicking on the form once): MyControl.OnResize: Bounds={X=0,Y=0,Width=50,Height=50} PopupWindow.get_CreateParams: returning CreateParams {'SWFClass0', '', 0x28, 0x88, {0, 0, 0, 0}}; cp.Style=0x82000000 PopupWindow.get_CreateParams: returning CreateParams {'SWFClass0', '', 0x28, 0x88, {0, 0, 0, 0}}; cp.Style=0x82000000 PopupWindow.OnResize: Bounds={X=0,Y=0,Width=50,Height=50} No window is shown and OnPaint event handler isn't called at all... What I'm missing? -- Alex > --8<----8<----8<----8<----8<----8<----8<----8<-- > > using System; > using System.Collections.Generic; > using System.ComponentModel; > using System.Data; > using System.Drawing; > using System.Text; > using System.Windows.Forms; > > namespace winforms_toolstrip > { > static class Program > { > [STAThread] > static void Main() > { > Application.EnableVisualStyles(); > Application.SetCompatibleTextRenderingDefault(false); > Application.Run(new Form1()); > } > } > > public class PopupWindow : ToolStripDropDown > { > private Control _content; > private ToolStripControlHost _host; > > public PopupWindow(Control content) > { > this.AutoSize = false; > this.DoubleBuffered = true; > this.ResizeRedraw = true; > > this._content = content; > this._host = new ToolStripControlHost(content); > > this.MinimumSize = content.MinimumSize; > this.MaximumSize = content.GetPreferredSize(Size.Empty); > this.Size = this.MaximumSize; > content.Location = Point.Empty; > > this.Items.Add(this._host); > } > } > > public class Form1 : Form > { > public Form1() > { > this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); > this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; > this.ClientSize = new System.Drawing.Size(292, 266); > this.Name = "Form1"; > this.Text = "Form1"; > > this.myControl = new MyControl(); > > this.MouseClick += new MouseEventHandler(form1_MouseClick); > } > > internal void form1_MouseClick(object sender, MouseEventArgs e) > { > if (e.Button == MouseButtons.Right) > { > PopupWindow popup = new PopupWindow(myControl); > popup.Show(this.Location.X + e.X, this.Location.Y + e.Y); > } > } > > internal class MyControl : UserControl > { > public MyControl() > { > Size = new Size(50, 50); > } > > protected override void OnResize(EventArgs e) > { > Console.WriteLine("MyControl.OnResize: Bounds={0}", > Bounds); > } > > protected override void OnPaint(PaintEventArgs e) > { > Console.WriteLine("MyControl.OnPaint: Bounds={0}", Bounds); > Graphics g = e.Graphics; > using (Brush b = new SolidBrush(Color.Black)) > { > g.FillRectangle(b, Bounds); > } > } > > public override Size GetPreferredSize(Size constr) > { > Console.WriteLine("MyControl.GetPreferredSize"); > return new Size(50, 50); > } > > public override Size MinimumSize > { > get > { > return GetPreferredSize(Size.Empty); > } > set > { > base.MinimumSize = value; > } > } > }; > > internal MyControl myControl; > } > } _______________________________________________ Mono-winforms-list maillist - Mono-winforms-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-winforms-list