2010-03-31 6 views
2

비트 맵 표현을 가져 오려는 WinForm에 창이 있습니다. 이 캡처시에 창에 깜빡 일 경우캐럿없이 비트 맵에 WinForm 창을 캡쳐하는 방법

public Bitmap GetBitmap() 
    { 
     IntPtr srcDC = NativeMethods.GetDC(codeEditor.Handle) ; 
     var bitmap = new Bitmap(codeEditor.Width, codeEditor.Height) ; 

     Graphics graphics = Graphics.FromImage(bitmap) ; 

     var deviceContext = graphics.GetHdc() ; 
     bool blitted = NativeMethods.BitBlt(
      deviceContext, 
      0, 
      0, 
      bitmap.Width, 
      bitmap.Height, 
      srcDC, 
      0, 
      0, 
      0x00CC0020 /*SRCCOPY*/) ; 
     if (!blitted) 
     { 
      throw new InvalidOperationException(
       @"The bitmap could not be generated.") ; 
     } 

     int result = NativeMethods.ReleaseDC(codeEditor.Handle, srcDC) ; 
     if (result == 0) 
     { 
      throw new InvalidOperationException(@"Cannot release bitmap resources.") ; 
     } 

     graphics.ReleaseHdc(deviceContext) ; 
     graphics.Dispose() ; 

의 문제점은, 이것은 캐럿을 캡처 :이를 위해 , 나는 (codeEditor 내가의 비트 맵 표현을 원하는 컨트롤입니다) 다음 코드를 사용합니다. 캡처하기 전에 Win32 메서드 HideCaret을 호출 해 보았습니다. 그러나 어떤 효과도없는 것 같습니다.

+0

여기에 C# 태그가 필요합니다. – MusiGenesis

답변

3

글쎄, 한 가지 방법은 폼의 다른 컨트롤에 포커스를 설정하고 나중에 포커스를 텍스트 필드로 복원하는 것입니다.

2

단지 이렇게하면 어떻게됩니까?

public Bitmap GetBitmap() 
{ 
    Bitmap bmp = new Bitmap(codeEditor.Width, codeEditor.Height); 
    Rectangle rect = new Rectangle(0, 0, codeEditor.Width, codeEditor.Height); 
    codeEditor.DrawToBitmap(bmp, rect); 
    return bmp; 
} 
+0

좋은 가정 - 윈도우에 타사 구성 요소가 포함되어 있고 그 중 하나가 DrawToBitmap을 사용할 때 올바른 이미지를 제공하지 않는다고 지적 했어야합니다. –

+0

@Steve : 이상합니다. DrawToBitmap이 수행중인 작업을 그냥 감추고 있다고 가정했을 것입니다. 어쨌든, 그리고 같은 이미지를 생산할 것입니다. 절름발이 아이디어가 있습니다. 캐럿이 항상 같은 장소에 있다면 (아마도 캐리지가 아닌 경우) 비트 맵에서 캐럿을 지울 수 있습니까? 즉, 캐럿 상단에 배경색을 그립니다. – MusiGenesis

+0

글꼴에 따라 캐럿이 텍스트와 겹칠 수 있습니다. – EFraim

관련 문제