下面说一下:如何将Dephi的窗体显示在自己的页面中(且不能显示Delphi窗体的标题栏,实现无缝的结合)。
将dephi的窗体签入到自己的C#系统里 还有一点比较重要,我们是调用Delphi的窗体,此时显示在我们C#窗体中会有Delphi的窗体,
这时我们怎么办呢, 怎么去除Delphi中的窗体呢? 这时我们就需要用API函数了。 因为WINDOWS API是一种比较底层的语言,可以通过它进行操作。
在C#中是这么引用的: [DllImport("user32.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void MoveWindow(IntPtr handler, int x, int y, int width, int height, bool repaint);
下面插入一个类,这里面包含了怎么引用dephi的dll 以及怎么申明:
{
public static string strPath = "";
/// <summary>
/// 初始化
/// </summary>
/// <param name="handle"></param>
/// <param name="methodAddress"></param>
[DllImport("WZFSE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void InitDll(IntPtr handle, bool methodAddress);
/// <summary>
/// 加载相应的服务
/// </summary>
/// <param name="str"></param>
/// <param name="str2"></param>
/// <param name="i"></param>
/// <returns></returns>
[DllImport("WZFSE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr wzLoadModule(string str, string str2, int i);
/// <summary>
/// 去除相应的服务
/// </summary>
/// <param name="handle"></param>
/// <returns></returns>
[DllImport("WZFSE.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool wzUnloadModule(IntPtr handle);
#region API函数
/// <summary>
/// API函数 设置主辅窗体
/// </summary>
/// <param name="child"></param>
/// <param name="parent"></param>
[DllImport("user32.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void SetParent(IntPtr child, IntPtr parent);
/// <summary>
/// API函数 移动窗体
/// </summary>
/// <param name="handler"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="repaint"></param>
[DllImport("user32.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void MoveWindow(IntPtr handler, int x, int y, int width, int height, bool repaint);
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern long GetWindowLong(IntPtr hwnd, int nIndex);
/// <summary>
/// API函数 去除窗体的标题栏
/// </summary>
/// <param name="hwnd"></param>
/// <param name="nIndex"></param>
/// <param name="dwNewLong"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
public const int GWL_EXSTYLE = -16;
public const int WS_EX_TRANSPARENT = 0x20;
public const int WS_EX_LAYERED = 0x80000;
public const int LWA_ALPHA = 2;
public const int WS_CAPTION = 0xC00000;
#endregion
}
其中API中的SetWindowLong这个方法是可以实现去除窗体的标题栏的, 具体调用SetWindowLong(common.p, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) & (~WS_CAPTION));
但一般完整利用API函数的调用是这样的
InitDll(this.Handle, de1(this.Handle));//初始化
IntPtr p = wzLoadModule("DoRiskSetup", "", 0);//取得句柄
if (p != (IntPtr)0)//判断该句柄不是弹出窗体时
{
//去除dephi窗体的标题栏
SetParent(p, panel1.Handle);
SetWindowLong(p, GWL_EXSTYLE, GetWindowLong(p, GWL_EXSTYLE) & (~WS_CAPTION));
MoveWindow(p, 0, 0, panel1.ClientSize.Width, panel1.ClientSize.Height, false);
}
SetWindowLong(IntPtr handle, int t,long l) 第一个参数为句柄,是你调的dephi窗体的句柄,第二个参数为整型,在dephi用常量GWL_EXSTYLE表示,表示要显示的样式,在C#中翻译过来的他值为(-16),而第三个函则为长整型和第二个参数一起表示要去除第一个参数句柄窗体的标题栏在Delphi中表示为:GetWindowLong(handle,GWL_EXSTYLE) and (not WS_CAPTION) 在C#中则翻译为:GetWindowLong(handle,-16)&(~0xC00000),handle是指要调用的Delphi窗体的句柄,GetWindowLong这个函数是获得该窗体的相关信息。大体上是这个用法,如有不懂大家可以提出来 共同探讨。
一般类型对应如下:
Dephi-->C#
intger -->int
longint -->long
pchar -->string
THandle -->IntPtr
上图为C#窗体调用的Delphi的情况。
注:上面的dll的名称只是个例子 具体还要看你要引用哪个dll API中的函数在C#中是这样引用的