2013-05-06 2 views
1

몇 년 동안 VB 6.0을 시작한 지 얼마 지나지 않아 VB.net에서 시작했습니다. 몇 가지 그래픽으로 시작한다고 생각했습니다.비트 맵을 사용하여 비트 맵을 그리는 VB.NET은 검은 색 사각형을 렌더링합니다.

그냥 재미있게 BitBlt를 사용하여 리소스로로드하고 양식에 그리는 비트 맵을 그립니다. 나는 picturebox에서 기존 이미지를로드하고 bitblt 할 수있다. 리소스에서 비트 맵을로드하여 picturebox에 저장할 수도 있지만 비트 맵을 가져올 때이를 GDI Graphics 개체로 변환하고 BitBlt를 폼으로 가져 오면 모두 크기가 같은 검은 색 사각형이됩니다. 비트 맵.

여기 내 코드입니다 : 나는 비트 블리트를 사용하려는 이유는) 내가 전에 사용했습니다있다

Dim srcBmp As New Bitmap(Me.GetType, "colorwheel.bmp") 
    Dim drect As New Rectangle(0, 0, 233, 233) 
    'srcGrp = PictureBox1.CreateGraphics 'This works. 
    srcGrp = Graphics.FromImage(srcBmp)  'This doesn't 
    targetGrp = Me.CreateGraphics 'destination graphics 

    srcHdc = srcGrp.GetHdc 
    TargetHdc = targetGrp.GetHdc 

    BitBlt(TargetHdc, 0, 0, 233, 233, srcHdc, 0, 0, SRCCOPY) 

    srcGrp.ReleaseHdc(srcHdc) 
    targetGrp.ReleaseHdc(TargetHdc) 
    targetGrp.Dispose() 
    srcBmp.Dispose() 
    srcGrp.Dispose() 

, 그래서 나의 첫 번째 선택이었다. b) 일부 영역을 투명하게 마스킹하기 위해 흑백 마스크를 사용하는 것이 가능하다는 것을 알고 있습니다. 이는 내가 필요한 것입니다. b) 그래픽이 자주 움직이는 경우.

투명한 배경을 가진 그래픽을 양식이나 그림 상자에 그리는 더 좋은 방법이 있습니까? 예 : 알파 채널이있는 PNG?

+0

여기에 스레드를 부딪 치는 방법이 있다고 생각하지 않습니까? :) –

답변

2

1) 부하 비트 맵 2) 비트 맵 3에서 HBITMAP을 얻을) DC 스트림

 Dim srcBmp As New Bitmap(Me.GetType, "colorwheel.png") 
     Dim hbm As IntPtr = srcBmp.GetHbitmap() 
     Dim sdc As IntPtr = GetDC(IntPtr.Zero) 
     Dim hdc As IntPtr = CreateCompatibleDC(sdc) 

그런 다음 HDC와 비트 블리트 수에서 호환 DC를 만들 수) 빈 DC 스트림 (4)를 만들 수 있습니다. 그 bitblt가 VB에서 사용했던 것과 같은 .net에서 작동하지 않는다는 것을 발견했습니다. 대신 DrawImage 메서드를 사용해 보겠습니다.

+0

이 대답이 유용하다고 생각했습니다. 감사. 위의 코드에서'GetDC' 함수 (즉,'sdc')에 의해 할당 된 DC가 어떻게 든 해제되어야합니까? 'CreateCompatibleDC' 함수 (즉, 코드에서'hdc')에 의해 리턴 된 DC에 대해서도 같은 질문이옵니다. – Bliss

관련 문제