1. 程式人生 > >【二次開發】將CATIA嵌入到Winform窗體中

【二次開發】將CATIA嵌入到Winform窗體中

由於專案需要,我們需要將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的值即可。