리스트뷰에 배경 그림 넣기 1탄은
아주 오래전에 임프님께서 올리신적 이 있습니다.(10년이 다 되어가네요)
1. http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=39
위 임프님에 기사를 보면 ListView에 배경이미지를 넣는 방법이 원래부터 제공되지
않는것처럼 말씀하셨는데...
CommCtrl.h 파일에 보면
구조체 tagLVBKIMAGE 가 있고
메세지로 LVM_SETBKIMAGE , LVM_GETBKIMAGE 등의 정의 되어있습니다.
메세지를 보면 분명히 ListView에 BackImage를 설정하고 또 가져오는 방법이
원래부터 제공된다는 얘기인데....
그래서 LVM_SETBKIMAGE 로 구글링 해보니 주루룩... 뜨더군요
그중에 bcbjournal이라는 C++Builder 잡지의 2000년 기사에
Adding a background image to a listview 라는 제목으로 아주 자세히 설명해서 실어 놓았더군요
http://bcbjournal.org/articles/vol4/0012/Adding_a_background_image_to_a_list.htm
원리는
1. LVM_SETBKIMAGE 메세지로 LVBKIMAGE 구조체에다가 적절히 데이타 설정해서
SendMessage하는데...
|
void __fastcall TForm1::Button1Click(TObject *Sender)
{
LVBKIMAGE lvbki = {0};
lvbki.ulFlags = LVBKIF_SOURCE_URL | LVBKIF_STYLE_TILE;
lvbki.pszImage = TEXT("C:\\test.bmp\0");
SendMessage( ListView1->Handle, LVM_SETBKIMAGEA, 0, (WPARAM)&lvbki );
| |
2. ListView 자체에서 이 기능을 COM을 이용해서 구현한것이기 때문에
CoInitialize 를 SendMessage하기 전에 호출해 줘야하구요
|
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if(FAILED(CoInitialize(NULL)))
{
throw EWin32Error( "Failed to initialize the COM libraries!" );
}
}
| |
3. 중요한것 한가지더 ListView의 WM_ERASEBKGND 메세지를 잡아서
DefaultHandler로 메세지를 처리해 줘야 합니다.
|
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OrgProc=ListView1->WindowProc;
ListView1->WindowProc=ListVProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListVProc(TMessage &Msg)
{
if( Msg.Msg==WM_ERASEBKGND)
ListView1->DefaultHandler(&Msg);
else
OrgProc(Msg);
}
//---------------------------------------------------------------------------
| |
delphifaq.com 의 Delphi 예제
http://www.delphifaq.com/faq/delphi/windows_GUI/f670.shtml
|
type
TMyListView = class(TListView)
protected
procedure WndProc(var Message: TMessage);
override;
end;
procedure TMyListView.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_ERASEBKGND then
DefaultHandler(Message)
else
inherited WndProc(Message);
end;
procedure TForm1.LVBGImage;
var
BKimg : TLVBKIMAGE;
begin
FillChar(BKimg, SizeOf(BKimg), 0);
BKimg.ulFlags := LVBKIF_SOURCE_URL or LVBKIF_STYLE_TILE;
BKimg.pszImage := PChar('c:\windows\angler.bmp');
BKimg.xOffsetPercent := 0;
BKimg.yOffsetPercent := 0;
CoInitialize(nil);
SendMessage(ListView1.Handle, LVM_SETTEXTBKCOLOR, 0, integer(CLR_NONE));
SendMessage(ListView1.Handle, LVM_SETBKIMAGE, 0, integer(@BKimg));
CoUninitialize;
end;
| |
그밖에 자세한 사항은 bcbjournal의 기사를 참조하세요
http://bcbjournal.org/articles/vol4/0012/Adding_a_background_image_to_a_list.htm
그럼..
|
예전에 bcbjournal에서 언듯 봤을때는 쓸 일이 없어 그냥 두었다가 잊었는데
오늘 장성호님이 옮기신 팁으로 실험해보니 아주 깔끔하게 잘 들어가네요.
그런데 TreeView 에 대한 배경 그림 넣는 것은 없나요?
메신저에 보면 주로 TreeView를 이용하는데 여기에 배경 그림 넣을 수 있다면
좋겠군요.