如何将非托管 C++ 表单嵌入到 .NET 应用程序中?

2024-04-19

我已经能够成功包装我的非托管 Borland C++ dll,并从 C# .NET 4.0 应用程序启动它的表单。是否可以将 dll 中的表单直接嵌入到 .NET 应用程序中?

澄清一下,原始形式已经被用作 Borland C++ 项目中的嵌入式控件。它本质上看起来像一个自定义控件,位于应用程序的面板上。

当我说“嵌入”时,我的意思是放入表单,就像将按钮、面板等拖放到表单上一样。我不想只制作一个儿童表格。

如果这是不可能的,那么也许更好的问题是如何将未管理的自定义控件嵌入到 .Net 应用程序中?


是的,您只需要使用 user32.dll 中的一些低级 win32 函数: SetParent、GetWindowLog、SetWindowLong 、 MoveWindow 。您可以创建一个空的.NET容器控件,将本机窗口的父级设置为.NET控件,然后(可选)修改窗口样式(即删除本机窗口的边框),并注意将其大小与.NET 控件。请注意,在托管级别,.NET 控件将不知道它有任何子控件。

在 .NET 控件中执行类似的操作

public void AddNativeChildWindow(IntPtr hWndChild){

        //adjust window style of child in case it is a top-level window
        int iStyle = GetWindowLong(hWndChild, GWL_STYLE);
        iStyle = iStyle & (int)(~(WS_OVERLAPPEDWINDOW | WS_POPUP));
        iStyle = iStyle | WS_CHILD;
        SetWindowLong(hWndChild, GWL_STYLE, iStyle);


        //let the .NET control  be the parent of the native window
        SetParent((IntPtr)hWndChild, this.Handle);
         this._childHandle=hWndChild;

        // just for fun, send an appropriate message to the .NET control 
        SendMessage(this.Handle, WM_PARENTNOTIFY, (IntPtr)1, (IntPtr)hWndChild);

}

然后重写 .NET 控件的 WndProc 以使其适当地调整本机窗体的大小,例如填充客户区域。

 protected override unsafe void WndProc(ref Message m)
    {

        switch (m.Msg)
        {
            case WM_PARENTNOTIFY:
                   //... maybe change the border styles , etc
                   break;
              case WM_SIZE:
                iWid =(int)( (int)m.LParam & 0xFFFF);
                iHei= (int) (m.LParam) >> 16;
                if (_childHandle != (IntPtr)0)
                {

                    MoveWindow(_childHandle, 0, 0, iWid, iHei, true);

                }
                break;

        }

 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将非托管 C++ 表单嵌入到 .NET 应用程序中? 的相关文章

随机推荐