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

C++빌더 Q&A
C++Builder Programming Q&A
[75417] Re:Re:Re:Re:Re:Re: 엉성하게 만들어져있는 VCL 라이브러리 문제
빌더(TWx) [builder] 2554 읽음    2019-05-15 13:57
송신영 님이 쓰신 글 :
: 코드를 올려보세요.
:
:
:
: 테두리 님이 쓰신 글 :
: : 소스를 확인하고 있는데, FillRect 말곤 관련되어있을 만한게 안보이는데 Fillrect를 빼면, Focus된 사각영영(점선)이 사라지는게 아니고, 말그대로 채워진 임의 Rect만 빠져서 원하는 결과가 안나오네요 ㅠ
: : 사진 첨부해드립니다. 사진에 보이는 점선이 문제고 그 부분을 없애고 싶습니다. 어떻게 접근하는게 좋을까요...
: :
: :
: :
: :
: :
: : 정성훈.해미 님이 쓰신 글 :
: : : DefaultDrawing 를 false로 하면
: : : 그리드 껍데기 모양만 그려지는게 정상입니다.
: : :
: : : 어딘가에서 포커스된 셀을 따로 그려주는건 아닌지
: : : 소스를 다시 확인해 보셔야 할 것 같습니다.
: : :
: : :
: : :  님이 쓰신 글 :
: : : : 정성훈.해미 님이 쓰신 글 :
: : : : : 스트링그리드 속성중에
: : : : : DefaultDrawing이 있습니다.
: : : : :
: : : : : 기본이 DefaultDrawing = true인데
: : : : :
: : : : : true일 경우,
: : : : :  그리드가 자동으로 그려집니다.
: : : : :
: : : : : false로 하면
: : : : : 그리드를 원하는 대로 그릴수 있습니다.
: : : : :
: : : : : DefaultDrawing 를 false로 하고
: : : : :
: : : : : OnDrawCell 이벤트에서 직접 그려주면 원하는 것을 할 수 있습니다.
: : : : :
: : : : : 예)
: : : : : 1. 스트링그리스 속성에서
: : : : : DefaultDrawing 를 false로 하거나
: : : : :
: : : : : 폼 생성자에 아래 코드를 추가합니다.
: : : : :     StringGrid1->DefaultDrawing = false;
: : : : :
: : : : : 2. 스트링 그리드의 OnDrawCell 이벤트를 아래와 같이 작성합니다.
: : : : : void __fastcall TForm2::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
: : : : : {
: : : : : // 셀 그리기
: : : : :     // 고정 셀은 버튼 모양으로
: : : : :     if(State.Contains(gdFixed)) {
: : : : :         StringGrid1->Canvas->Brush->Color = clBtnFace;
: : : : :         StringGrid1->Canvas->Font->Color = clWindowText;
: : : : :         StringGrid1->Canvas->FillRect(Rect);
: : : : :         Frame3D(StringGrid1->Canvas, Rect, clBtnHighlight, clBtnShadow, 1);
: : : : :     }
: : : : :     // 선택된 셀은 하이라이트 색
: : : : :     else if (State.Contains(gdSelected))
: : : : :     {
: : : : :         StringGrid1->Canvas->Brush->Color = clHighlight;
: : : : :         StringGrid1->Canvas->Font->Color = clHighlightText;
: : : : :         StringGrid1->Canvas->FillRect(Rect);
: : : : :     }
: : : : :     // 나머지 셀은 기본 색으로
: : : : :     else
: : : : :     {
: : : : :         StringGrid1->Canvas->Brush->Color = StringGrid1->Color;
: : : : :         StringGrid1->Canvas->Font->Color = StringGrid1->Font->Color;
: : : : :         StringGrid1->Canvas->FillRect(Rect);
: : : : :     }
: : : : :
: : : : : // 셀 내용(텍스트) 출력
: : : : :     StringGrid1->Canvas->TextRect(Rect, Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
: : : : : }
: : : : :
: : : : :
: : : : :
: : : : :
: : : : : 테두리 님이 쓰신 글 :
: : : : : : 제목 그대로의 내용입니다.
: : : : : :
: : : : : : 셀 선택시 점선으로 포커스 된 부분에 사각형이 그려지는데, 이게 안그려지게 하고 싶어요 ㅠㅠㅠ 이것때문에 자꾸 심적으로 앓고 있다가 결국 못찾아서 올립니다. 도와주세요 !!
: : : :
: : : :
: : : :
: : : :
: : : :
: : : : 제가 설명이 짧았던 모양입니다. 이미 DefaultDrawing은 False로 해둔 상태입니다. 그럼에도 셀을 선택하면 FocusRect가 점선처럼 그려지는 것 같은데, 이 사각영역을 없애고 싶어 드린 질문이었습니다.
: : : :
: : : :
: : : :



답변:


DefaultDrawing을 false 로 한 상태인데도 FocusRect 가 그려지는 것은

질문에 사용하는 툴의 버전이 명시되어 있지 않아서 확정할 수는 없지만...
엉성하게 만들어져 있는 구버전의 VCL 라이브러리를 사용하고 있어서 일겁니다.

사용자에게 커스텀하게 Cell을 그릴 수 있는 기회를 주려면 FocusRect도 사용자 임의로 그릴 건지를 선택할 수 있게
프레임웍을 만들어 놨어야 하는데...

폰트 컬러, 배경 브러시 등은 커스텀하게 그릴 수 있도록 하면서 FocusRect는 VCL 프레임웍에서 무조건 그리는 식으로
프레임웍이 만들어져 있기 때문인데요.


점선으로 그려지는 사각형 테두리 (FocusRect) 는...
DrawFocusRect() 라는 Windows API를 이용해서 Drawing 합니다.

그리고... 이 Windows API는 내부적으로 XOR 라스터라이징을 이용해서 테두리를 그리기 때문에
똑같은 Rect를 지정해서 한번 더 호출하면 그려져 있는 테두리를 지우는 효과를 갖게 됍니다.

VCL 프레임웍에 의해서 그려진 FocusRect와 같은 Rect 영역을 이용해서
DrawFocusRect()를 다시 호출해서 FocusRect를 지우는 효과를 얻을 수 있도록 코딩 하세요.

VCL 라이브러리 수정하지 않고 처리하려면 이 방법 밖에 없음.



+ -

관련 글 리스트
75411 스트링그리드의 셀을 선택했을 때, 그 Foucs rect를 없애고 싶습니다. 테두리 2454 2019/05/14
75412     Re:스트링그리드의 셀을 선택했을 때, 그 Foucs rect를 없애고 싶습니다. 정성훈.해미 2511 2019/05/15
75413         Re:Re:스트링그리드의 셀을 선택했을 때, 그 Foucs rect를 없애고 싶습니다. 2429 2019/05/15
75414             Re:Re:Re:스트링그리드의 셀을 선택했을 때, 그 Foucs rect를 없애고 싶습니다. 정성훈.해미 2392 2019/05/15
75415                 Re:Re:Re:Re:스트링그리드의 셀을 선택했을 때, 그 Foucs rect를 없애고 싶습니다. 테두리 2647 2019/05/15
75416                     Re:Re:Re:Re:Re:스트링그리드의 셀을 선택했을 때, 그 Foucs rect를 없애고 싶습니다. 송신영 2492 2019/05/15
75417                         Re:Re:Re:Re:Re:Re: 엉성하게 만들어져있는 VCL 라이브러리 문제 빌더(TWx) 2554 2019/05/15
75418                             감사합니다. 2439 2019/05/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.