C#팁

WinForm 투명 컨트롤 ~ 작은 경험 하나 공유합니다. Booh 평점: 없음 조회: 5805
윈폼이 많이 사용되지 않는지? 모르겠으나. 투명 컨트롤과 관련된 내용을 찾아서 적용해보는데 처음에 의외로 잘 안되서 난감했었죠. ㅠㅠ

투명 컨트롤을 만들때 단순히 아래와 같이 하면 된다고만 나온 부분이 많이 있어서...(아마 저도 좀 더 깊게 파본 후 이런 정보글을 올리지 못했다는 측면에서 같은 부류라 생각되지만요.)

투명 컨트롤과 관련해서 알게된 내용이 있어서 그냥 무턱대고 싸질러 봅니다.

투명 컨트롤 만들 때 인터넷 검색하면, 아래 코드와 같이 OptimizedDoubleBuffer 스타일을 지정하거나, Opaque 스타일을 지정하는 경우가 많이 찾을 수 있었거든요.

public partial class ImageButton : UserControl
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }
 
    private void InitializeStyles()
    {
        this.SetStyle(/* ControlStyles.OptimizedDoubleBuffer | */
            ControlStyles.Opaque |
            ControlStyles.AllPaintingInWmPaint |
            ControlStyles.SupportsTransparentBackColor, true);
        this.UpdateStyles();
    }
 
    private void ImageButton_Paint(object sender, PaintEventArgs e)
    {
        ... 생략 ...
    }
}

문제는 SetStyle에서 ControlStyles.SupportsTransparentBackColor 스타일을 사용하면서 ControlStyles.OptimizedDoubleBuffer와 ControlStyles.Opaque 스타일을 동시에 쓰니 아래와 같은 배경이 검정색으로 나옵니다. (이게 원하는 결과는 아니었죠. 요거 때문에 엄청난 삽질을 했었다는...)



1. ControlStyles.OptimizedDoubleBuffer와 ControlStyles.Opaque 스타일 중 하나만 사용하니 아래와 같은 투명화된 이미지가 나오는 결과물을 볼 수 있었네요.

ControlStyles.OptimizedDoubleBuffer


ControlStyles.Opaque 


2. SetStyle에서 ControlStyles.ControlStyles.AllPaintingInWmPaint 은 WIN32 API에서 WM_ERASEBKGND를 무시하는 거라고 MSDN에 설명되어 있더라구요. 이 스타일을 지정하면, 굳이 OnPaintBackground 함수를 오버로딩 할 필요가 없어보입니다.

자세한 내용은 아래 MSDN 링크를 참조하시면 됩니다.
https://msdn.microsoft.com/ko-kr/library/system.windows.forms.controlstyles(v=vs.110).aspx

3. 위에서 ControlStyles.OptimizedDoubleBuffer와 ControlStyles.Opaque 스타일을 지정할 때, CreateParams 를 오버로딩해야 하나 안해도 되나의 문제인데요.

ControlStyles.Opaque 스타일을 지정할 때만, CreateParams를 오버로딩 하시면 됩니다. ControlStyles.OptimizedDoubleBuffer를 사용할 땐 ControlStyles.SupportsTransparentBackColor 만 지정하는 것으로 배경이 투명해지네요. ^^

좀 더 살펴봐야할 부분이 있을 것 같지만, 찾기가 여간 쉽지 않아 일단 미뤄야 할 듯 하네요. ^^ (귀찮음이네요.)

다 작성하고 나니 정리한게 아니라 테스트 한 내용 그냥 막 써내려간 느낌이네요. 이렇게 하니 이렇게 보이더라, 저렇게 하니 저렇게 보이더라 이런 느낌 
태그 : 사용자 지정 컨트롤, 투명컨트롤 UserControl,
작성자 정보
Booh
Level 5
 [EXP.15/16]

메일:  비공개
글등록 +12 36 덧글등록 +3 9
자기소개
임베디드쪽으로 관심만 많은 개발자입니다.
글 공유하기 |
  tweet facebook
2015-01-23 오후 10:49:11
나도한마디
사용자
지송닷넷            [2015-01-23]
Level 99
 [EXP.만랩]
멋지시네요.

그럼 클릭 이벤트를 걸면 이미지에서만 클릭이 반응하나요?
사용자
Booh            [2015-01-24]
Level 5
 [EXP.15/16]
마우스 이벤트(클릭, 오버, 다운, 업 등등)에 따라 FLAG를 설정하고 클리어하는 등의 구현한 후, PAINT 이벤트에서 FLAG 조건에 따라서 이미지를 그리면 충분히 가능해요.
사용자
Booh            [2015-01-24]
Level 5
 [EXP.15/16]
추가로 Opaque를 사용하면 폼 사이즈 조절시 깜빡임 문제가 있네요.

그래서 DoubleBuffering 스타일을 적용하니 깜빡임 문제는 다행이도 없는데, 또 따른 문제가...

이것도 자답을 구했습니다.

아래 질문답변은 제가 올린 건데 지금은 댓글이 하나밖에 없지만, 참고하시면 좋을 것 같습니다.
(자문자답)

http://www.hoons.net/Board/qacshap/Content/69691
태그로 엮인글
[C#.NET Q&A] 투명 컨트롤 포커싱 잃음 문제  HISS
[ASP.NET Q&A] 사용자 'Web'이(가) 로그인하지 못했습니다. 오류해결 부탁드립니다.[1] 파일첨부 리신킥
[C#.NET Q&A] 사용자 정의 컨틀롤 사용방법 문의..  나가사끼짬뽕
[C#.NET Q&A] [RE] 유연한 타입에 입력 창?[1]  차가워
[C#.NET Q&A] Telnet을 통해 Server의 Console 프로그램 실행시 접속한 Client의 IP 어떻게 알수 있는가요?  블루쭈니
[C#.NET Q&A] TextBox 안에 Word 양식 넣기 혹은 Word 양식처럼 만들기![1]+2  Windy
[C#.NET Q&A] 파일 저장경로 설정 질문입니다.[4]+3  플라티너스
[ASP.NET Q&A] 개발PC와 실서버 환경이 다른경우 경로 지정 어떻게 하시나요?[1]  박원웅
[C#.NET Q&A] 사용자 컨트롤 질문드립니다.[1]+2  하이앤드가이
[C#.NET Q&A] 사용자 정의 컨트롤 질문입니다..[2]  Syam
글리스트
비동기 소켓 프로그래밍에 대해 질문이 있습니다... ㅠㅠ  궁금해욥
딕션어리 vs 데이터 테이블(값이 자주 변경)[2]  레미콘
C#으로 시리얼통신을 해보자! 시리얼 통신의 원리부터 구현까지[11] 파일첨부 아이프리드
트리뷰 + - 버튼을 이미지로 바꿀 수 있나요 ?[1]+1  훈스훈스훈스
안녕하세요. PartialView에 대한 질문 드립니다.[3] 파일첨부 노찬이
두 가지 간단한 질문..[2]+1  븅멍뭉친구
OS X의 파일명의 한글 자모음이 분리되어 보이는 경우[4]  sa2랑
달력컨트롤 예시 입니다.[4] 파일첨부 방랑개죽
 ★현재글->   WinForm 투명 컨트롤 ~ 작은 경험 하나 공유합니다.[2]+1  Booh
Hoons.net에 게시물에 소스코드를 이쁘게 넣고 싶다!! 하시는분들...[5]  아이프리드
모든 개발자들을 위한 비주얼 스튜디오[5]+7  sky
허접한 dllImport tip 입니다. [1]+1  비니픽
Ibatis.Net 트랜젝션 문제 해결하기 [3]+1  호랭이
MVC.NET 을 제외한 C# 프로젝트 내에서 Razor를 이용하여 Html 소스 가져오기[1]  호랭이
Reactive Extensions라이브러리 2 -event thread  Lookvv
C# 람다식(Lambda __EXPRESSION__) - 문형식 람다식 예제[1]  오엔제이
Reactive Extensions라이브러리 1 -Time관련[1]  Lookvv
zero padding, 숫자 앞에 0 추가하여 자릿수 맞추기 예) 00099[1]  안떠니
string 에서 ESC 문자 제거하기  안떠니