I am new to microstation programming and am making an addin. I get everything to work properly but I cannot size the dockpanel. I have a keyin called 'Show' that triggers the showform function below:
internal static void ShowForm(Bentley.MicroStation.AddIn addIn) { s_current = null; s_current = new AreaWindow(addIn); s_current.AutoSize = false; s_current.AttachAsTopLevelForm(addIn, true); s_current.NETDockable = false; Bentley.Windowing.WindowManager windowManager = Bentley.Windowing.WindowManager.GetForMicroStation(); s_current.m_windowContent = windowManager.DockPanel(s_current, s_current.Name, s_current.Name, Bentley.Windowing.DockLocation.Floating, new Size(350, 0), new Size(0,250)); s_comApp = BMI.Utilities.ComApp; }
Everything works properly except the dockpanel is not 350 x 250. My form is that size but the dock panel i'm putting it into stretches larger for some reason. and just leaves padding to the right.
I've tried with/without autosize, with/without dockable. Nothing seems to work on it. Any ideas?
I had faced the similar problem earlier. After adding docking functionality the actual size of the form changed to some random height and width. I have used Win32 API to restore the correct size of the form. With the help of Dan Paul post http://communities.bentley.com/products/microstation/microstation_programming/f/19569/p/58662/139641.aspx I came up with the following class file.
Create a class ResizeAddinWindow.cs in your project and copy the following code. Change the namespace (Utilities) to your project namespace.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;using Bentley.Windowing;using System.Windows.Forms;namespace Utilities{ /// <summary> /// Class to resize Addin window /// </summary> public class ResizeAddinWindow { // Rectangle layout [StructLayout(LayoutKind.Sequential)] public struct RECT { public int X; public int Y; public int Width; public int Height; } // resizing window methods [DllImport("user32")] public static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect); [DllImport("user32")] public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [Flags] private enum SWP { SWP_NOSIZE = 0x0001, SWP_NOMOVE = 0x0002, SWP_NOZORDER = 0x0004, SWP_NOREDRAW = 0x0008, SWP_NOACTIVATE = 0x0010, SWP_FRAMECHANGED = 0x0020, SWP_SHOWWINDOW = 0x0040, SWP_HIDEWINDOW = 0x0080, SWP_NOCOPYBITS = 0x0100, SWP_NOOWNERZORDER = 0x0200, SWP_NOSENDCHANGING = 0x0400, SWP_DRAWFRAME = SWP_FRAMECHANGED, SWP_NOREPOSITION = SWP_NOOWNERZORDER, SWP_DEFERERASE = 0x2000, SWP_ASYNCWINDOWPOS = 0x4000 } // Method to resize the actual window public static bool ResizeWindow(WindowContent _contentManager, int _windowWidth, int _windowHeight) { try { Form _frm = _contentManager.Zone.FindForm(); if (_frm != null) { // To set the correct height and width RECT _currWindowRect = new RECT(); if (GetWindowRect(_frm.Handle, ref _currWindowRect)) MoveWindow(_frm.Handle, _currWindowRect.X, _currWindowRect.Y, _windowWidth, _windowHeight, true); SetWindowPos(_frm.Handle, new IntPtr(1), 0, 0, 0, 0, (uint)(SWP.SWP_NOSIZE | SWP.SWP_SHOWWINDOW | SWP.SWP_FRAMECHANGED | SWP.SWP_NOMOVE | SWP.SWP_NOZORDER)); } } catch { return false; } return true; }}}
Usage:
Bentley.Windowing.WindowManager windowManager = Bentley.Windowing.WindowManager.GetForMicroStation();
s_current.m_windowContent = windowManager.DockPanel(s_current, s_current.Name, s_current.Name, Bentley.Windowing.DockLocation.Floating);
ResizeAddinWindow.ResizeWindow(s_current.m_windowContent, 350, 250);
Clean and Rebuild your solution.
Let me know if this is not what you are looking for.
Answer Verified By: zCane75
This worked perfectly! Thank you very much!