C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[779] [Controls] 리스트뷰(ListView)에 배경 그림 넣기 2
장성호 [nasilso] 9132 읽음    2008-07-15 12:59
리스트뷰에 배경 그림 넣기  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



그럼..
김태선 [cppbuilder]   2008-07-16 21:35 X
아주 멋진 팁이네요.
예전에 bcbjournal에서 언듯 봤을때는 쓸 일이 없어 그냥 두었다가 잊었는데
오늘 장성호님이 옮기신 팁으로 실험해보니 아주 깔끔하게 잘 들어가네요.

그런데 TreeView 에 대한 배경 그림 넣는 것은 없나요?
메신저에 보면 주로 TreeView를 이용하는데 여기에 배경 그림 넣을 수 있다면
좋겠군요.
김태선 [cppbuilder]   2008-07-16 21:36 X
Classes::TWndMethod OrgProc;
김태선 [cppbuilder]   2008-07-16 21:37 X
CoInitialize를 쓰려면
NO_WIN32_LEAN_AND_MEAN
매크로를 선정의 해주면 됩니다.
김태선 [cppbuilder]   2008-07-16 21:41 X
위에 2개 리플은 실험해 보실분들을 위한 개미 발자국 만큼의 도움.

+ -

관련 글 리스트
779 [Controls] 리스트뷰(ListView)에 배경 그림 넣기 2 장성호 9132 2008/07/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.