c# – 如何将非托管C表单嵌入到.NET应用程序中?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何将非托管C表单嵌入到.NET应用程序中?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1666字,纯文字阅读大概需要3分钟。
内容图文
我已经能够成功地包装我的非托管Borland C dll,并从C#.NET 4.0应用程序启动它的表单.是否可以将表单从dll直接嵌入到.NET应用程序中?
为了澄清,原始表格已经在Borland C项目中用作嵌入式控件.它本质上看起来像一个自定义控件,坐在应用程序中的面板上.
当我说’嵌入’时,我的意思是将INTO放在一个表单中,就像将按钮,面板等放到表单上一样.我不打算做个孩子.
如果这是不可能的,那么或许更好的问题是如何将无人管理的自定义控件嵌入到.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;
}
}
内容总结
以上是互联网集市为您收集整理的c# – 如何将非托管C表单嵌入到.NET应用程序中?全部内容,希望文章能够帮你解决c# – 如何将非托管C表单嵌入到.NET应用程序中?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。