|
질문이 2003년도 것이라 이미 해결 내지는 포기했으리라 보지만
저와 같이 이런 답을 찾아 헤메시는 분을 위해 여기에 한마디 적을께요..
ListView에 배경그림을 그리는 것은 검색해 보면 나옵니다. WM_ERASEBKGND 를 이용하여 그리는 방법이고요
여기에 Icon을 큰 것으로 선택하고 나면 위의 질문처럼 여백이 흰색이나 기타의 색깔로 나옵니다.
그래서 저도 이곳저곳 검색해 봤더니 다음과 같이 하라더군요. 너무 간단해요.. ㅜㅜ;;
ListView에 onCustomDraw 이벤트에 다음과 같이 3줄을 추가합니다. 아래와 같이요.
void __fastcall TForm1::ListView1CustomDraw(TCustomListView *Sender,
const TRect &ARect, bool &DefaultDraw)
{
SetBkMode(ListView1->Canvas->Handle,TRANSPARENT);
Perform(LVM_SETTEXTBKCOLOR,0,Longint(CLR_NONE));
ListView_SetBkColor(ListView1->Handle,CLR_NONE);
}
이러면 Transparent 하게 아이콘이 나올 겁니다. 물론 아이콘 밑에 Caption이 지정되어 있는 경우도
투명하게 처리됩니다. 참고로 전 Windows XP에서 실험해 봤습니다.
참고로 WM_ERASEBKGND 를 이용하지 않는 방법은 BitBlt() 함수를 위의 SetBkMode() 앞에 써 주면 됩니다.
한가지 이점은 WM_ERASEBKGND 이용 했을때 생길 수 있는 잔상(?)이 없어 지더군요. 전 다음과 같이 했습니다.
이 방법이 좋은지 나쁜지는 모르겠네요.
void __fastcall TForm1::ListView1CustomDraw(TCustomListView *Sender,
const TRect &ARect, bool &DefaultDraw)
{
BitBlt(ListView1->Canvas->Handle, 0, 0, ListView1->Width,
ListView1->Height, Image1->Canvas->Handle, 0, 0, SRCCOPY);
SetBkMode(ListView1->Canvas->Handle,TRANSPARENT);
Perform(LVM_SETTEXTBKCOLOR,0,Longint(CLR_NONE));
ListView_SetBkColor(ListView1->Handle,CLR_NONE);
}
그럼 이만.
김태우 님이 쓰신 글 :
: 일단 답변 감사드립니다.
: 그런데 저의 경우 이미지 리스트에 아이콘을 넣으면
: 배경색이 일단 흰색으로 지정됩니다.(여백이 흰색이기 때문에)
: 그런데 이미지 리스트에 아이콘들을 넣고 이미지 리스트를 닫은후
: 다시 열면 여백의 색깔이 'none'로 바뀌어 있습니다.
: 때문에 여백이 투명처리가 되지 않구요.
:
: 아시는분은 답변좀 부탁합니다.
|