개발자 블로그
C# TextBox BackgroundImage 적용하기 본문
프로그램을 좀 더 이쁘게 꾸미고 싶어서 텍스트박스에 배경이미지를 넣고 싶었는데, C#의 텍스트박스는 기본적으로 배경이미지(Background Image)를 지원하지 않는다.
구글링을 통해서 몇 가지 방법을 찾았는데 딱히 적당한 방법이 없어서 일단은 배경이미지 없이 개발하기로 마음먹었다. 추후 다시한번 검토를 해본 뒤 적용할 예정이다.
나중에 다시 구글링 하는 수고를 덜기위해서 찾아놓은 방법들을 정리해본다. 다만, 사전조사 차원에서 찾아본 것이라서 내용이 약간(?) 부실 할 수 있다. 추가적인 정보가 필요한 경우에는 링크를 참조하거나 관련 키워드로 검색해보면 될 것 같다.
1. Textbox 상속을 통한 paint 이벤트 오버라이드
TextBox를 상속받아서 새로운 TextBox를 만드는 방법. OnPaint 이벤트를 오버라이드하면 배경으로 이미지를 그릴 수 있을 것 같다.
참고 : http://hoons.net/Board/QACSHAP/Content/26067
2. 투명배경(Transparent)을 지원하는 TextBox 컨트롤 사용
TextBox의 배경색을 투명으로 지정할 수 있다면, 배경이미지를 지정한 것과 같은 효과를 얻을 수 있다. 간단히 설명하면 TextBox를 패널위에 올리고 패널에 배경이미지를 설정한 뒤 TextBox의 투명도를 조절하는 방법이다.
기본적으로 C#의 TextBox는 BackColor로 투명(Transparent)을 지원하지 않는다. 하지만 CodeProject에서 투명배경을 지원하는 TextBox 컨트롤을 구할 수 있다. "AlphaBlendTextBox"라는 이름의 컨트롤인데, 사용해본 결과 심각한 문제가 몇가지 있다.
- 전경색과 배경색이 같은 경우에는 텍스트가 표시되지 않는다.
- 텍스트 주변으로 배경색이 덧칠해진것 처럼 그려진다.
- 리소스 사용률이 너무 높다.
1번 문제는 내부적으로 색상선택을 제어해서 해결가능할 것 같다. (해당 글의 댓글을 보면 작성자도 이미 알고 있는 문제인 듯 하다.)
문제는 2번이다. 아래 첨부한 이미지는 "AlphaBlendTextBox" 데모 프로그램을 약간 수정해서 실행해본 결과다.
왼쪽의 텍스트박스는 그나마 티가 덜 나는데, 오른쪽에서 보여지는 에디트는 전경색과 배경색이 뒤섞여서 가독성이 너무 떨어진다. 전경색과 배경색이 유사한 색상인 경우에는 티가 잘 나지 않는데, 검정색-노란색 처럼 대비가 큰 색상의 경우에는 쓰기 힘들 것 같다.
다만 해당 글에 첨부된 테스트 이미지에는 이런 문제점이 보이지 않는걸로 보아 예전에는 문제가 안되었던 것 같다. (참고로 글이 작성된 시점은 2003년이다.)
2번 문제가 없었다고 하더라도 3번 문제 때문에 아마 사용 못 했을 것 같다. 이 컨트롤 적용전에는 메모리 사용률이 12MB 남짓이었는데, AlphaBlendTextBox를 적용하니깐 500MB까지 메모리 사용률이 올라간다. CPU 사용률도 마찬가지로 훨씬 올라갔다. 단순 텍스트 에디터인걸 감안하면 이정도의 리소스 사용률은 받아들이기 힘들 것 같다. (참고로 댓글에 보면 메모리 누수(Memory Leak)에 대한 얘기가 있다.)
참고 : http://www.codeproject.com/Articles/4390/AlphaBlendTextBox-A-transparent-translucent-textbo
3. WPF 컨트롤 작성 후 윈폼(C#)에서 사용
WPF를 사용해보지 않아서 잘은 모르겠지만 아래 링크를 보면 TextBox에 이미지를 넣는 것이 가능해 보인다.
※ TextBox에 워터마크 추가 : https://msdn.microsoft.com/ko-kr/library/bb613590(v=vs.110).aspx
이게 가능하다면, WPF로 컨트롤을 작성한 뒤에 해당 컨트롤을 윈폼에 포함해서 개발하면 깔끔하게 개발이 가능하지 않을까 싶다.
WPF에서 만든 컨트롤을 윈폼으로 포함해서 사용하는 방법은 아래 링크를 참고하자.
참고1 : https://msdn.microsoft.com/ko-kr/library/ms742215(v=vs.110).aspx
'프로그래밍 > Windows' 카테고리의 다른 글
Visual Studio에서 아이콘을 제대로 변경했는데도 안바뀐다면? (2) | 2016.04.29 |
---|---|
C# 윈폼 - 소스코드를 통한 콤보박스 변경시 이벤트 안받게하려면 (0) | 2016.04.13 |
카카오톡PC에서 사용하는 오픈소스 라이브러리 (0) | 2016.03.18 |
C# 이미지 저작 툴을 개발하면서 참조한 사이트들 (0) | 2016.03.08 |
C# resx 리소스 문자열 개행처리 (0) | 2016.02.25 |