개발자 블로그

C# TextBox BackgroundImage 적용하기 본문

프로그래밍/Windows

C# TextBox BackgroundImage 적용하기

로이드.Roid 2016. 3. 25. 19:26

프로그램을 좀 더 이쁘게 꾸미고 싶어서 텍스트박스에 배경이미지를 넣고 싶었는데, 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. 텍스트 주변으로 배경색이 덧칠해진것 처럼 그려진다. 
  3. 리소스 사용률이 너무 높다.


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

참고2 : http://yoshiki.tistory.com/entry/WPF-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%A0%95%EC%9D%98-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EC%9D%84-WinForm-%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B2%95

Comments