2016-06-05 2 views
0

나는이 거의 존재입니다 ... :) 내가 가진투명한 사각형을 그리려면 어떻게해야합니까?

내 자신의 이중 버퍼를 구현합니다 ...

그래서 내가 비트 맵을 만들 :

if (_Bitmap != null) _Bitmap.Dispose(); 
if (_Graphics != null) _Graphics.Dispose(); 

_Bitmap = new Bitmap(Bounds.Width, Bounds.Height); 
_Bitmap.MakeTransparent(Color.Transparent); 
_Graphics = Graphics.FromImage(_Bitmap); 
_Graphics.FillRectangle(Brushes.Transparent, Bounds); 

내가 가질 수 있다고 생각 비트 맵을 투명하게 수동으로 설정합니다. 내 처리기의 OnPaint 방법에서

은이 수행합니다

protected override void OnPaint(PaintEventArgs e) 
{ 
    if (_pDevice != null) 
    { 
     try 
     { 
      _pDevice.update(); 
      _Graphics.ReleaseHdc(); 

      if (_bZoomWindow) 
      { 
       //_Graphics.DrawRectangle(_selectionPen, _rcRubberBand); 
       using (GraphicsPath gp = new GraphicsPath()) 
       { 
        gp.AddRectangle(_rcRubberBand); 
        gp.Widen(_selectionPen); 
        _Graphics.FillPath(Brushes.WhiteSmoke, gp); 
       } 
      } 

      OdRxDictionary Properties = _graphicsDevice.properties(); 
      //if (helperDevice.UnderlyingDevice.Properties.Contains("WindowHDC")) 
      // helperDevice.UnderlyingDevice.Properties.AtPut("WindowHDC", new RxVariant((Int32)graphics.GetHdc())); 
      if (Properties.ContainsKey("WindowHDC")) 
       Properties.putAt("WindowHDC", new OdRxVariantValue(_Graphics.GetHdc().ToInt32())); // hWnd necessary for DirectX device 
     } 
     catch (System.Exception ex) 
     { 
      _Graphics.DrawString(ex.ToString(), new Font("Arial", 16), new SolidBrush(Color.Black), new PointF(150.0F, 150.0F)); 
     } 

     e.Graphics.DrawImageUnscaled(_Bitmap, 0, 0); 
    } 
} 

문제는 사각형 검은 배경으로 그리기된다는 점이다. 그래서 비트 맵에 그 아래 도면이다 죽이고있다 :

Zoom window

가 어떻게 그냥 사각형을 그릴 수 있습니까? 내가 뭘 놓치고 있니? 이것이 바보 같은 질문이라면 유감입니다! 투명성 페인팅

+0

제가 생각하기에 Graphics.DrawRectangle 메서드가 그 선들을 그릴 것입니다 ... – jimbobmcgee

+0

FillRectangle (Brushes.Transparent ..는 작동해야하지만 불행히도 픽셀을 투명하게 만드십시오. 더 깊어지는 루틴이 필요합니다. 한 가지 간단한 해결 방법은 앤티 앨리어싱을 끄고 필요없는 이상한 색상을 그려서 maketransparent라고 부르는 것입니다. – TaW

+0

@TaW 나는 제안에 개방적이다. 만약 내가 4 줄씩 하나씩 그리면? –

답변

1

불행히도 한 방향으로 만 지원되는 다음 alpha 값 strenght에 RGB 채널을 적용함으로써.

alpha = 0없음이 발생합니다.

다른 모드가 바람직하지만 도면 번호 GDI+에서는 지원되지 않습니다.

하나의 간단한 해결 방법은 물론

Bitmap bmp = new Bitmap(244, 244, PixelFormat.Format32bppArgb); 
Color funnyColor = Color.FromArgb(255, 123, 45, 67); 

using (Graphics g = Graphics.FromImage(bmp)) 
{ 
    g.Clear(Color.LawnGreen); 
    using (SolidBrush br = new SolidBrush(funnyColor)) 
    { 
     // no anti-aliased pixels! 
     g.SmoothingMode = SmoothingMode.None; 
     // draw your stuff.. 
     g.FillEllipse(br , 14, 14, 88, 88); 
    }  
    bmp.MakeTransparent(funnyColor); 
    // do what you want.. 
    bmp.Save(someFileName, ImageFormat.Png); 
} 

.. 안티 앨리어싱을 해제 이상한 색깔 당신이 필요로하고 MakeTransparent를 호출하지 않습니다에 그릴 수 있습니다 할 수 있습니다 미국 FillPath 또는 DrawRectangle을 포함한 모든 DrawXXX 방법 ..

그 결과 투명 구멍이있는 녹색 비트 맵이 표시됩니다. 여기 Paint.Net에 있습니다 :

다른 모드에 대한

**enter image description here**

, 그것은 아마 당신이 당신의 자신의 루틴을 작성해야 또는있는 lib 디렉토리를 찾을 것이라고 알파 채널을 복사하거나 이전 값으로 혼합 것 그것은,하지만 당신이 필요로하는 모든 것이 atm해야한다고 생각합니다.

관련 문제