|
방태윤 님이 쓰신 글 :
: 음..대충 이해가 되는거 같네요.근데 제가 말이 약해서 잘 이해 시킬지 모르겟군요.
: ListView1CustomDrawItem는 프로그램에서 필요할때 호출되는 함수고요.
: 그건 스크롤이 일어났으때나 클릭되었을때나 화면이 복구된다는가 암튼 언제든지
: listview의 화면을 갱신할 필요가 있으면 프로그램에서 호출해서 쓰는 함수입니다.
: 삽입당시에만 호출되는게 아니고요,
: 물론 삽입시도 화면변경요건에 해당되니까 호출된것입니다.
:
: 그러므로
: void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
: TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
: {
: if(Item->Caption=="a") ListView1->Canvas->Brush->Color=clYellow;
: else ListView1->Canvas->Brush->Color=clRed;
: }
:
: 위와 같이 ListView1CustomDrawItem 를 작성하고 실행하면
: 캡션이 a 인 row는 노랑 그외는 모두 빨강으로 표시될것입니다.
: 여기서 만약 현재 5번째row 가 빨강인데 노랑으로 바꾸고 싶다면
: 단지 listView1->Items->Item[4]->Caption="a"; 라고 코딩해주고
: listView1->Repaint() 명령으로 listview 를 갱신시키면
: 자동으로 5번째 row 가 빨강이 되는 것입니다.
: 콜백함수인가?..그런거랑 비슷한 의미죠.
: 제가 설명력이 부족해서 -.-...
: 이번에도 이해가 안되시면 소스를 간단이 만들어서 보여 드릴께요..
:
: 초록물고기 님이 쓰신 글 :
: : 감사합니다.
: : 제가,, 아래와 같은 코드로 테스틀 했는데...
: :
: : void __fastcall TAddressGroupFrame::ListView1CustomDrawItem(
: : TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
: : bool &DefaultDraw)
: : {
: :
: : switch ( Item->Index) //or caption...
: : {
: : case 0 :
: : ListView1->Canvas->Brush->Color= clYellow;
: : break;
: : case 1:
: : ListView1->Canvas->Brush->Color= clGreen;
: : break;
: : case 2:
: : ListView1->Canvas->Brush->Color = clRed;
: : break;
: :
: : }
: : }
: :
: : 이건 분명히... 데이타가 삽입되는 당시 ,, onCustomDrawItem 이라는 이벤트가 발생했을때는 ,
: : 분명 위와 같은 코드로,, 인테스 값및, 특정 caption 값등으로 색을 지정할 수 있는 것 같습니다.
: : 그런데.. 저는 이미 데이타의 삽입은 모두 끝난 상태이고,,,
: : 끝난 상태에서... 특정한 버튼이 눌리면... 리스트 뷰의 처음부터 , 끝까지 검색하여.
: : ===== 버튼이 클릭 됐을때 ====
: : for ( i = ListView1->Items->Count -1 ; i >= 0 ;i -- )
: : {
: : if ( ListView1->Items->Item[i]->Caption =="a" )
: : {
: : //지금 현재의 row를 색깔 바꾸기... <== 이것을 하려고 하는데..
: : //어떻게 바꿔야 하는지? , CustonDrawItem과는 상황이 틀리지 않은가요?
: : // ==> 색깔이 안바뀌는데... 무엇이 잘못 된건지 ... 모르겠습니다.
: : }
: :
: : }
: :
: : 방태윤 님이 쓰신 글 :
: : : 갭션에 따라 색을 바꾸려면 아래와 같은 구문 만 있어도 색갈이 바뀝니다...
: : : void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
: : : TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
: : : {
: : : if(Item->Caption=="a") ListView1->Canvas->Brush->Color=clYellow;
: : : else ListView1->Canvas->Brush->Color=clRed;
: : : }
: : : ListView1CustomDrawItem 이 위와같다면 갭션이 바뀌면 색도 자동으로 바뀌는데...
: : : 안바뀌면 Repaint(); 정도 해주거나요
: : : 음..무언가를 혼동하시는거 같기는 한데 ... 어떻게 도와드려야 할지...
: : :
: : :
: : : 초록물고기 님이 쓰신 글 :
: : : : 답변 감사함니다... 그런데.. 어떻게 하라는 말씀인지... 잘 이해가 안갑니다.
: : : : 일단 저의 상황은...
: : : : 하나의 리스트 뷰에... (예를 들면)
: : : : caption colum1 colum2 colum3
: : : : ======================================
: : : : a data1 data2 data3
: : : : b dtat1 data2 data3
: : : : c dtata data2 data3
: : : : a data1 data2 data3
: : : : b dtat1 data2 data3
: : : :
: : : :
: : : : 위와 같이 이미 리스트 뷰에 데이타가 이미 뿌려져 있습니다.
: : : : 이렇게 이미 데이타가 뿌려진 상태에서... 사용자자 지정하는 색깔로 row의 전체색을 바꾸려고 합니다.
: : : : 예를 들어 cpation 이 "a" 인 row에 대해서는 노랑, 캡션이 "b" 인 rows는 빨강 등입니다.
: : : :
: : : : CustomDrawItem 이벹트에서 , index 값이나, Caption 값 가지고,
: : : : 즉 리스트 뷰에 데이타가 삽입되는 당시에는 , 색깔 지정이 잘 됩니다.
: : : : (ListView1->Canvas->Brush->Color= clYellow; )
: : : :
: : : : 문제는 ... 리스트 뷰에 ..이미 데이타가 뿌려져 있는 상태에서... 특정row에 대한 색깔을 어떻게 바꾸는지가 궁금합니다... 안되는 것 같기도 하고.
: : : :
: : : : 답변 감사 드림다.
: : : : 수고하세요.
: : : :
: : : :
: : : :
: : : :
: : : :
: : : :
: : : :
: : : :
: : : : 방태윤 님이 쓰신 글 :
: : : : : 오우너 드러우를 사용하시는거지요?
: : : : : 어찌됬건간에 색갈에 대한 정보를 어디다 저장해 놓아야 됩니다.
: : : : : 제가 하는 방법은 간단한 구조인 경우에는 그냥
: : : : : 맨마지막에 서브 아이템을 하나 더 생성해서 거기에 정보를 담아둡니다.
: : : : : 화면에는 안나오게 하면 되겟죠?
: : : : :
: : : : : 복잡한 경우에는 item 에보면 data 라는거 있는데
: : : : : 그거랑 외부에 변수 만들어서 연결하면 될거 같고요..
: : : : :
: : : : : 그리고 오너드러우 부분에서 체크해서
: : : : : if (subitems->Strings[5]=="2") ListView1->Canvas->Brush->Color= clYellow;
: : : : : else ListView1->Canvas->Brush->Color= clred;
: : : : :
: : : : : 이런식으로 뿌려주면 되죠..
: : : : :
: : : : : 그러니까
: : : : : : if ( ListView1->Items->Item[i]->Caption == "원하는 문자열" )
: : : : : :
: : : : : 이부분에서 서브아이템의 데이터를 모두 바꾸어주고
: : : : : 리플레쉬한다던가 하면 화면에 반영이 되겟죠...?
: : : : :
: : : : : 암튼 drawitem 부분이 좀 바뀌어야 할거 같네여..
: : : : :
: : : : :
: : : : : 초록물고기 님이 쓰신 글 :
: : : : : : 안녕하세요...
: : : : : :
: : : : : : 리스트 뷰를 사용하다가,,, 간단 할 것 같은데... 막상 해 보니 잘 안되는 것 같아... 글을 올림니다.
: : : : : :
: : : : : : 현재 리스트 뷰에 데이타가 많이 들어 있습니다.
: : : : : : 그리고 그 데이타 들 가운데... 특정 버튼이 눌리면 리스트 뷰에 들어있는 Caption을 비교하여,,,
: : : : : : 찾은 조건에 맞는 데이타 이면, 그 row전체를 색깔을 바꾸어 주려고 합니다.
: : : : : :
: : : : : : void __fastcall TAddressGroupFrame::Button4Click(TObject *Sender)
: : : : : : {
: : : : : : for ( i = 0 ; i < ListView1->Items->Count ; i ++ )
: : : : : : {
: : : : : : if ( ListView1->Items->Item[i]->Caption == "원하는 문자열" )
: : : : : : {
: : : : : : //검색의 조건에 맞은 모든 row 를 특정한 색깔로 표시한다.
: : : : : : ListView1->Canvas->Brush->Color= clYellow; ==>?
: : : : : : //여기서 색깔을 바꿀수 있는 방법을 잘모르겠습니다.
: : : : : : // 불가능한 것인지요?
: : : : : : //아니면 여기서... CustomDrawItem 을 호출할 수 있는지요?
: : : : : : //호출을 하려니까,,, 인자를 어떻게 채워서 호출을 해야 하는지, 좀 어렵습니다.
: : : : : : }
: : : : : : }
: : : : : : }
: : : : : :
: : : : : : 참고로 CustomDrawItem 에서 , index 값이나, Caption 값 가지고,
: : : : : : 즉 삽입되는 당시에는 비교 하여, 색깔 지정이 잘 됩니다.
: : : : : : switch ( Item->Index)
: : : : : : {
: : : : : : case 0 :
: : : : : : ListView1->Canvas->Brush->Color= clYellow;
: : : : : : break;
: : : : : : }
: : : : : : 고맙습니다.
: : : : : : 그럼 수고하세요.
: : : : : :
|