首先是背景黑色的   显示正确然后是在半黑半白色的背景   就出现不同颜色了  现在是背景全白的样子    图片也全部白色了。各种背景颜色测试后 得出  图片跟随背景颜色改变  问题:
这是大概什么原因呢?  而且鼠标还会穿透  但是我没有设置它可以穿透的
                int EXSTYLE = GetWindowLong(Hwnd, GWL_EXSTYLE);
                SetWindowLong(Hwnd, GWL_EXSTYLE, EXSTYLE | WS_EX_LAYERED);
                //初始化窗口风格
                TempHdc = GetDC(Hwnd);
                Hdc = CreateCompatibleDC(TempHdc);
                //创建Hdc
                BITMAPINFO BMI = new BITMAPINFO();
                BMI.bmiHeader.biSize = 40;
                BMI.bmiHeader.biWidth = Size .cx ;
                BMI.bmiHeader.biHeight = Size.cy;
                BMI.bmiHeader.biPlanes = 1;
                BMI.bmiHeader.biBitCount = 32;
                BMI.bmiHeader.biSizeImage = BMI.bmiHeader.biWidth * BMI.bmiHeader.biHeight * 32 / 8;
                hDIB = CreateDIBSection(Hdc,ref  BMI,0,0,0,0);
                SelectObject(Hdc, hDIB);这是DIB的申明 
            BLENDFUNCTION TempBlend = new BLENDFUNCTION();            TempBlend.AlphaFormat = 1;
            TempBlend.BlendFlags = 0;
            TempBlend.BlendOp = 0;
            TempBlend.SourceConstantAlpha = Alpha;            bool a = UpdateLayeredWindow(Hwnd, 0, ref Point, ref  Size, Hdc, ref TempPoint, 0, ref TempBlend, 2);
这是Blend的申明  其中Alpha=255            IntPtr khb = CreatePen(5, 0, 0);
            IntPtr open = SelectObject(Hdc , khb);
            IntPtr brush = CreateSolidBrush(Color);
            IntPtr obrush = SelectObject(Hdc , brush);
            Rectangle(Hdc, x, y, Widht , hegith );
            SelectObject(Hdc, open);
            SelectObject(Hdc, obrush);
            DeleteObject(khb);
这是绘制函数。 GDI好像没有直接绘制透明通道的 需要复制之后才行
各位朋友帮忙看看 大概什么地方出现问题了 我想要它不透明  不会鼠标穿透。  先谢谢了 

解决方案 »

  1.   

    已经找出原因。
    原因出在UpdateLayeredWindow上、我忽略了dwFlags值,
      dwFlags 这个参数可以是以下值之一:
      ULW_ALPHA 使用pblend为混合功能,如果显示模式为256色或更少,这个值和ULW_OPAQUE效果相同;
      ULW_COLORKEY 使用crKey值为颜色的透明度
      ULW_OPAQUE 绘制一个不透明分层窗口
    我选择的是ULW_OPAQUE 所以出现了上面的情况问题解决。
      

  2.   

      该UpdateLayeredWindow函数更新一个分层的窗口的位置,大小,形状,内容和半透明度;
      BOOL UpdateLayeredWindow(
      HWND hwnd,
      HDC hdcDst,
      POINT *pptDst,
      SIZE *psize,
      HDC hdcSrc,
      POINT *pptSrc,
      COLORREF crKey,
      BLENDFUNCTION *pblend,
      DWORD dwFlags
      ); 我又学到一课,呵呵