【二次開發】將CATIA嵌入到Winform窗體中
阿新 • • 發佈:2019-02-04
由於專案需要,我們需要將CATIA嵌入到我們的軟體之中,要求在軟體啟動後,同時呼叫並啟動CATIA軟體,並能夠遮蔽掉軟體自身的選單和按鈕。通過在網上查閱資料,實現了這一功能。
呼叫並啟動CATIA
public string GetCatiaInstallPath()
{
// 通過讀取登錄檔,獲取CATIA安裝路徑
string keyPath = "CATIA.Analysis\\protocol\\StdFileEditing\\server";
RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyPath);
return key.GetValue("(預設)");
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint newLong);
[DllImport("user32.dll")]
public static extern int SetParent(IntPtr hWndChild,IntPtr hWndParent);
public const int GWL_STYLE = -16 ;
public const int WS_VISIBLE = 0x10000000;
public static void LoadExtApplication(string installPath, IntPtr parentHandle)
{
// 啟動CATIA
Process process = Process.Start(installPath);
process.WaitForInputIdle();
// 嵌入到parentHandle指定的控制代碼中
IntPtr appWin = process.MainWindowHandle;
SetParent(appWin, parentHandle);
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
}
移動CATIA窗體並指定其窗體大小
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);
public static void Move(IntPtr appWin, int x, int y, int nWidth, int nHeight)
{
if (appWin != null)
{
// 其中x,y為CATIA窗體相對於其父窗體左上角的位置
// nWidth為CATIA窗體的寬度,nHeight為CATIA窗體的高度
MoveWindow(appWin, x, y, nWidth, nHeight, true);
}
}
為了隱藏CATIA頂部的選單欄,我們只需將y值設為-20即可隱藏掉選單欄。同時,為了使CATIA窗體能夠填滿其父窗體,需要指定CATIA窗體的寬度和高度與父窗體保持一致。並且在父窗體大小改變時能夠同時調整CATIA窗體的大小。
利用此原理,我們也能夠將其他軟體嵌入到Winform窗體中,只需按需求調整相應的x,y,nWidth,nHeight的值即可。