2011-12-31 4 views
2

필자는 수직으로 움직일 수있는 PictureBox를 가지고 있습니다. PictureBox에 표시된 이미지는 투명한 GIF이므로 이미지 뷰어에서 볼 때 배경이 없습니다.PictureBox를 실제로 투명하게 만드는 방법

문제는 응용 프로그램에서 PictureBox를 움직이면 PictureBox의 배경이 너무 이상하게 움직입니다. 마치 PictureBox에 배경이있는 것과 같습니다.

전 :

enter image description here

(이동하면서) 후 :

enter image description here

일부 코드 :

path = "C:\\note.gif"; 
note.Image = Image.FromFile(path); 
note.Visible = true; 
note.BackColor = Color.Transparent; 
panel.Controls.Add(note); 

필자도 picturebox를 이중 버퍼링으로 만들려고했으나 작동하지 않습니다.

+0

GIF를 투명도가 설정된 PNG로 바꾸면 어떻게됩니까? – ChrisF

+0

GIF 이전에 PNG를 시도했지만, 불행하게도 똑같은 시나리오. –

+0

'note.Invalidate();'를 호출 한 후 이동하면 도움이됩니까? 또는'panel.Invalidate();'? – LarsTech

답변

4

WinForms는 사용자 정의 컨트롤의 투명도에 적합하지 않지만 가능합니다. 여기 this article을 참조하십시오. 이 기사에서 저자는 UserControl이 아니라 Panel에서 파생되고 OnPaintBackground 메서드를 재정 의하여 아무것도 수행하지 말 것을 제안합니다. 이렇게하면 배경이 그려지지 않습니다.

protected override void OnPaintBackground(PaintEventArgs pevent) 
{ 
    //do nothing 
} 

protected override void OnMove(EventArgs e) 
{ 
    RecreateHandle(); 
} 

// Override the CreateParams property: 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT 
     return cp; 
    } 
} 

마지막으로 OnPaint 함수를 재정 의하여 그림 상자를 그릴 수 있습니다. 당신이 실시간으로 화면을 이동하는 경우가 깜박임과 흐림을 얻을 것이다주의 있지만

protected override void OnPaint(PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 

    //Do your drawing here 
} 

, 투명도와 사용자 정의에 PictureBox를 만들 수 있습니다이 사용.

이와 비슷한 기술을 사용하여 우리는 WinForms 앱 (Premex XPort)을 사용하여 웹 사이트에 유사한 브랜딩을 렌더링했습니다. 여러 개의 투명한 컨트롤, 그림 그리기 및 모든 종류의 디스플레이가 올바르게 표시되도록했습니다.

결론적으로 Winforms가이 작업을 제대로 수행하지 못하는 이유는 Win32 기반 기술에서 한 컨트롤이 화면의 한 픽셀을 소유하기 때문입니다. HTML 또는 WPF에서 예상하는 것처럼 투명도가있는 픽셀을 실제로 합성 할 수있는 방법은 없습니다. 나중의 Windows 기술 (WPF)은이 작업을 특히 잘 수행하므로 앱에서 투명도를 많이 사용하고자한다면 적어도이 플랫폼으로 이동하는 것이 좋습니다 (WPF는 WinForms 내에서 호스팅 될 수 있으며 그 반대의 경우도 가능).

감사합니다.

+0

도움을 주셔서 대단히 감사합니다. 내일 사용해 보겠습니다 :) –

2

Win32 컨트롤은 실제로 투명하지 않습니다.

귀하의 선택 사항은 다음과 같습니다

  • 변경 WPF
  • 에 무엇을 할 which'll 제 3 자 컨트롤이있는 경우
  • 참조
  • 사용 PictureBox.Region 컨트롤의 원치 않는 ("투명") 영역을 클립하기 원하는 경우
+0

기본적으로 당신이 말하는 것은 WinForms로 이것을 해결할 방법이 없다는 것입니다. PictureBox의 다른 유형이 많아서 PictureBox.Region 이외의 다른 것입니다. –

+1

@Sean'안돼요. '조금은 늘리지 만 그만한 가치는 없습니다. 항상 가짜로 보임 - WPF와는 달리 Windows Forms는 이러한 우려를 염두에두고 만들지 않았습니다. 자, 왜 * WinForms'PictureBox '를 사용하는 것이 필요한지 모르겠지만 실제 프로젝트라면 ** 작업에 적합한 도구를 고를 것을 권장합니다 **. – Adam

+0

그것은 대학을위한 프로젝트입니다. 그것이 바로 요구 사항입니다. 현실 세계 프로젝트라면 실용적 일 것입니다. –

관련 문제