Bitmap bitmap = (Bitmap)img;
            IntPtr hObject = IntPtr.Zero;
            IntPtr zero = IntPtr.Zero;
            IntPtr hDC = Win32.GetDC(IntPtr.Zero);
            IntPtr ptr2 = Win32.CreateCompatibleDC(hDC); 
         
            hObject = bitmap.GetHbitmap(Color.FromArgb(0, 0, 0));            zero = Win32.SelectObject(ptr2, hObject);
            Win32.Size size2 = new Win32.Size(bitmap.Width, bitmap.Height);
            Win32.Size psize = size2;
            Win32.Point point3 = new Win32.Point(0, 0);            Win32.Point pprSrc = point3;
            point3 = new Win32.Point(0, 0);            Win32.Point pptDst = point3;
            Win32.BLENDFUNCTION pblend = new Win32.BLENDFUNCTION();
            pblend.BlendOp = 0;
            pblend.BlendFlags = 0;
            pblend.SourceConstantAlpha = 0xff;
            pblend.AlphaFormat = 1;
            Win32.UpdateLayeredWindow(this.Handle, hDC, ref pptDst, ref psize, ptr2, ref pprSrc, 0, ref pblend, 2);
            Win32.ReleaseDC(IntPtr.Zero, hDC);
            if (hObject != IntPtr.Zero)
            {
                Win32.SelectObject(ptr2, zero);
                Win32.DeleteObject(hObject);
            }
            Win32.DeleteDC(ptr2);
//请求,详细注视。
对windows api一点都不熟·#

解决方案 »

  1.   

    Bitmap bitmap = (Bitmap)img;
                IntPtr hObject = IntPtr.Zero;
                IntPtr zero = IntPtr.Zero;
                //获取设备上下文
                IntPtr hDC = Win32.GetDC(IntPtr.Zero);
                //创建一个与指定的hDC相容的内存设备上下文
                IntPtr ptr2 = Win32.CreateCompatibleDC(hDC);
                hObject = bitmap.GetHbitmap(Color.FromArgb(0, 0, 0));
                //选定一个对象到设备上下文
                zero = Win32.SelectObject(ptr2, hObject);
                Win32.Size size2 = new Win32.Size(bitmap.Width, bitmap.Height);
                Win32.Size psize = size2;
                Win32.Point point3 = new Win32.Point(0, 0);
                Win32.Point pprSrc = point3;
                point3 = new Win32.Point(0, 0);
                Win32.Point pptDst = point3;
                Win32.BLENDFUNCTION pblend = new Win32.BLENDFUNCTION();
                pblend.BlendOp = 0;
                pblend.BlendFlags = 0;
                pblend.SourceConstantAlpha = 0xff;
                pblend.AlphaFormat = 1;
                //更新位置,大小,形状,内容和一个半透明的窗体图层
                Win32.UpdateLayeredWindow(this.Handle, hDC, ref pptDst, ref psize, ptr2, ref pprSrc, 0, ref pblend, 2);
                //释放设备上下文
                Win32.ReleaseDC(IntPtr.Zero, hDC);
                if (hObject != IntPtr.Zero)
                {
                    Win32.SelectObject(ptr2, zero);
                    //Deletes the attached Windows GDI object from memory by freeing all system storage associated with the Windows GDI object.
                    //从内存中删除这个附加的Windows GDI对象,通过释放所有系统存储器关联的Windows GDI对象
                    Win32.DeleteObject(hObject);
                } 
                Win32.DeleteDC(ptr2);
      

  2.   

    简单说就是临时使用一个句柄,在这个句柄上画图,然后由系统合成到桌面上,但仅仅以上代码是完全不够的,还需要窗体本身进行扩展样式消息处理.如果觉得麻烦可以用这个:DYD.DLL单窗体实现层窗体显示控件
    http://download.csdn.net/detail/dylike/4028682