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
[934] TListView의 CheckBox를 AdvancedCustomDrawItem에서 그리기
박영목.월천 [gsbsoft] 15836 읽음    2009-11-14 03:22
C++Builder 6.0 에서.. 왜 이렇게 시작... 아직 6.0을 사용하는 분이 많지 않을 것 같아서..입니다.
저는 3년 더 사용하려고 생각 중입니다. 5년 더 할까?  ㅋㅋㅋ  그러니... 참 불편할 때가 많습니다.

이번에도 디자인을 이쁘게 입혔습니다. 그런데. TListView의 CheckBox, Window의 기본 리소스를
가져와서 보여주는 것으로 생각되는데... 너무 숨이 막혀... 그래서 왠만하면... 그 뭐더라...
XP Style로 만들어 주는 ThemeManager인가를 사용했습니다.


그런데... 이것을 적용시키면...

화면이 갱신이 빈번한 프로그램에서는 프로그램이 힘들게 돌아갑니다. 그래서 이번에는 사용을 하면

안되겠더군요... 그래서 아주 멋없게 내버려 두었는데... 디자인을 더 추가하다 보니... 욕심이...

생기더군요. 저것도 해야겠다.  어떻게 하지... 안해본 것이 이리도 많은지.... 그리고 될 수 있으면

기본 컴포넌트만 사용하고... 특별하지 않으면... 많이 사용하지 않습니다. 많이 사용하다 보면...

프로그램이 불안정해질 수 있지요... 아무래도 무거워 지겠지... 여러 사람이 손을 댄 것을...

합치니... 문제가 있겠지요... 물론 아주 잘 만든 것들은 괜찮은데... 그래도 왠만하면 자제...

그래서... ListView에 CheckBox 하나 바꾸는 것도 힘드네요... ㅋㅋㅋㅋ


그래서 또 google 바다 따라... 돌아 다녔습니다. 역시 google.. 행님...~

금방 나오내요...   Delphi... 음 역시 Delphi쪽은 좀 있군요.. 예가...

그래서 비슷하게 꾸역꾸역 따라했습니다. ListView1AdvancedCustomDrawItem에서 좀 만지니....

뭐 간단히 되군... ㅋㅋㅋ  그런데... 스벌....!!!


폰트체가 바뀌 버리내요... 뭐 윈도우의 기본 폰튼가? 여하턴 보기 싫은 뚜꺼운 글씨로... 이제 이것을

또 잡아야 하는데...  자체 버그인지...  똑같은 코드를 수십번 이래 저래... 맹인이 길가듯...

(문자열도 다 OwnerDraw 하려니 귀찮아서....  그래서.. 계속 찾았습니다)


이미지를 뿌리 때 DC가 파괴되나?.. 그래서 이미지 다시 몇번 다르게 만들고... 이것도 아닌 것 같에..

그러다 느낌이 조금 오더군요...  ListView1->StateImages->Draw( ListView1->Canvas, ... 에서

check이미지를 뿌릴 때 내부에서 폰트를 그냥 바꾸어 버리는 것 같은 느낌(C의 포인터 부작용인지...
포인터를 인한 버그... 아마 델파이에는 없지 않을까? ㅋㅋㅋ)

헤헤... 그러면 다시

ListView1->Canvas->Font->Name = ListView1->Font->Name; 요렇게 바꾸어 주면 이 뒤편에 문자열을 쓸
때 이 이 폰트로 쓰겠지.....  ㅋㅋㅋ...  끝났어....

그런데... 멍....  왠걸... 이게 안 바뀌내요...

또 쓸데 없이 몇 번 컴파일 하고... 또 다른 시도를.... 아... 혹 처음 정한 폰트명과 같으면....

내부에서 바꾸지 않을 것 같다. 바꾸는 데도 부하와 시간이 걸리니... 앞에서 IF로 처리해서...

같으면 바꾸지 않게!(C++Builder 프로그래머도 비슷하게 하겠지.. 하고 아래와 같이 해 보았습니다)


  ListView1->Canvas->Font->Name = "1";
  ListView1->Canvas->Font->Name = ListView1->Font->Name;

그런데 덜컹덩 되어 버리내요.... 얼마나 기쁜지....  호호호.....  그래서....  

  ListView1->Canvas->Font->Name = "";
  ListView1->Canvas->Font->Name = ListView1->Font->Name;

이렇게도 해보았지요.  땡 안되네요....   Name으로 NULL이 넣어 오면... 빠져나가게 해 놓은 것 같네요.
C++빌더 만든 분도... 철저히 기본을 지키고 있군요.... ㅋㅋㅋ 

이것 때문에 2시간 보내 버렸네요...  ㅋㅋㅋ    내일(아 오늘) 등산가야 하는데.... 추워서 가겠나?... 

우동이나 먹고 올까?  쯥...   생각난다.... 우~ 동~ ...................


----  소스, 폼에 TimageList 하나 두고... 이지미(16*16) 2개 넣고 StateImages에 연결하시면 됩니다.

                (뭐 보니 연결 안하고 직접 그려도 되겠네요. 연결해서 하면 편한 것 같기도 하고...)



void __fastcall TForm1::ListView1AdvancedCustomDrawItem(
      TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
      TCustomDrawStage Stage, bool &DefaultDraw)
{
  //DefaultDraw=true;

  TRect r;

  r = Item->DisplayRect(drIcon);


  if( Item->Checked==true )
  {
    ListView1->StateImages->Draw( ListView1->Canvas, r.Left-16, r.Top-1, 1 );
  }
  else
  {
    ListView1->StateImages->Draw( ListView1->Canvas, r.Left-16, r.Top-1, 0 );
  }

  ListView1->Canvas->Font->Name = "1";
  ListView1->Canvas->Font->Name = ListView1->Font->Name;
}
//---------------------------------------------------------------------------




* 참..... 그러고 보니.....

어제도 이상한 Error가...   Sub Form을 하나 만들고 자주 불러와야 할 것이기에...

처음에 실행될 때 생성되게 해 두고.. Show, Hide로 보여주고 감추고 하는데...

그냥 버튼 TButton에 닫기 버튼에 Close() 호출...     FormClose에서  Action = caHide; 로 해놓았길래..

잘 동작했음... 그런데... 이 버튼을 이쁘게 하려고 TImageButton을 바꾸고 나니...

프로그램 종료 때 마다 헉... 비정상적인 종료...  나 미쳐.... 그래서 다시 TButton으로 바꾸니...

또 종료가 잘 됨....  끝날 때... 뭔가 바쁘고... 그래서 문제 있는 모양이다...

그러면 끝날 때는 니가 알아서 해라 니가 좋을 때 안 바쁠 때...

그래서 Close()을 ::PostMessage( this->Handle, WM_CLOSE, 0, 0 ); 요로게 바꾸니 잘 종료되네요...

Sub 폼들 다 이렇게 바꾸어야겠다...    이게 안전한가?  ... 에고  자야겠다....

* "참.....  "   위의 글 수정합니다.  무슨 이유인지 몰라도 버튼 때문에 그런 것은 아니란는 결과가 또 나왔네요...
   여하튼 프로그램이 너무 복잡하다보니...  얼키고 얼켜서... 그런 것 같네요... 논리적으로 정확하게 보이나...
   어떤 내부 버그인지...  그래도 깔금히 해결했습니다.
망치 [mangchy]   2009-11-16 13:12 X
ㅎㅎ 애쓰셨네요.. 남의것을 가져다쓸때 그 제작하는 사람의 제작할때의 머리를 전부다 내 머리에 가져오기란 쉽지가 않네요...
박영목.월천 [gsbsoft]   2009-11-16 18:03 X
감사요... 망치님.... ㅋㅋㅋ

+ -

관련 글 리스트
934 TListView의 CheckBox를 AdvancedCustomDrawItem에서 그리기 박영목.월천 15836 2009/11/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.