테두리 님이 쓰신 글 :
: 현재 DrawFocusRect()를 호출하여 어떻게 하는지는 알았는데, 사각형이 다 지워져야 하는데, 단순하게 값 조절로는 자꾸 엇나가는 부분이 있어서 정확한 FocusRect의 Rect값을 구하고 싶습니다.
:
: TRect rectCommit = Rect;
: rectCommit.Top +=1;
: rectCommit.Left -=0;
: rectCommit.Right += 2;
: rectCommit.Bottom -=1;
: pGrid->Canvas->DrawFocusRect(rectCommit);
:
: 현재 이런식으로 하면 (pGrid는 포인터입니다) 사각형이 있다고 가정했을 때 오른쪽 변에 해당하는 사각형 변만 안지워지고 나머지 위아래 왼쪽은 지워지게 됩니다 이 이후에도 숫자를 엄청 바꿔봤는데 완전히 사각형이 다 지워지는 경우가 없더라구요. 그래서, 시스템에서 그려주는 FocusRect의 Rect가 알고싶은데, 어디서 참조해야 될지 모르겠습니다 ㅜㅜ
답변:
엉터리로 만들어져 있는 구버전의 VCL 라이브러리를 사용하면서...
프레임웍에 의해 강제로 점선으로 그려진 테두리인 Focused Rect 를 지우기 위해 OnDrawCell() 까지 사용할 필요는 없고
불필요하게 프로그램 로직과 UI 파트를 이벤트 핸들러로 엮어서 프로그래밍 하는 것은
속된 말로... 코드를 걸레로 만들어 버리는 겁니다.
평상시 사용하던 대로... DefaultDrawing 프로퍼티 값을 true 그대로 해 놓은 상태에서
간단하게 Paint() 라는 virtual 함수를 오버라이드 하면 됍니다.
override 된 스트링그리드 Paint() 함수
call original Paint()
TRect R = CellRect(Col, Row);
R.Inflate(-1, -1); // Rect 영역 보정 값은 VCL 버전에 따라서 다를 수 있음. inflate/deflate 가 필요 없을 수도.
DrawFocusRect(Canvas->Handle, &R);
Focused Rect는 VCL 프레임웍의 Paint() 함수에서 그려지므로
위와 같이 Paint() 함수를 오버라이드 해서 간단하게 처리할 수 있고.
Rect의 Left 값을 1 증가하면...
Cell 외곽 그리드 라인의 Rect 영역과 비교해서 상대적으로 영역을 deflate (줄이는) 하는 셈이므로
Right 값은 1 감소해줘야 맞는 것임.
|