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
[160] [TIP] StringGrid 내 마음대로
박남영 [puco21] 11393 읽음    2001-08-02 21:46
여러곳을 뒤졌는데 델파이 쪽까지 다 뒤져봤지만 없더군요,
어쩔수 없이 만들었습니다,

이곳 질문란에 올렸던 스트링 그리드 셀 합치기 혹은 붙이기 랍니다
전체 소스는 회사차원에서의 작업이라서,,,T.T
뛰어난 소스는 아니니깐 아쉬워는 마세요 ^^


간단하게 팁을 공개 할께요

색깔 바꾸기나 3D효과 내기 팁들은 공개되서 많이들 알고 있으리라 믿구요
우선은 그 팁들을 이해한다고 가정하고 시작하겠습니다

그리드라하면 그리드는 TCanvas다라는 말로 풀어나가겠습니다

사실 내부적으로 Canvas위에 일일이 선들을 그리고 있답니다

그리드 제어는 이 TCanvas제어가 핵심입니다

그러므로 각각의 셀에 대한 핸들을 얻을수도 있지 않을까 하는 제

처음 생각이 틀렸음을 말해 주더 군요

핸들을 얻어낼수 없다면 차라리 TCanvas에 일일이 그려 볼까도 생각했지만

그 무수한 좌표제어 생각에 포기했구요

답은 역시 기존의 스트링 그리드를 사용하는것이라는데 도달 했답니다

DrawCell이벤트 함수에 각각의 셀들에 대한 그리기 정보가 넘어 온답니다
그리고 이 DrawCell이벤트는 셀들의 이동 좌우 상하 스크롤바 클릭시 좌표의 변동등과
같이 paint메시지를 호출해야 될 상황에선 무조건 호출 됩니다

인자들을 살펴 보시면 대충 흐름을 이해 하실 겁니다 여기서 중요한게
각각의 셀의 위치로 넘어오는 Rect에 있습니다
사실 Rect가 이 팁에 핵심입니다 

//이곳은 그냥 3D 효과를 내기 위한 색깔에 관계된 것이구요
unsigned char step = 30;
unsigned char r = 0x80,g = 0x80,b = 0xC0;
TColor clr_highlight = static_cast( PALETTERGB(r+step,g+step,b+step) );
TColor clr_shadow = static_cast( PALETTERGB(r-step,g-step,b-step) );

//
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender,
                        int ACol, int ARow, TRect &Rect, TGridDrawState State)
{

    TRect CellRect,TextRect;
    TStringGrid* StringGrid = static_cast(Sender);
    TCanvas* ACanvas = StringGrid->Canvas;
    ACanvas->Brush->Color = (TColor)RGB(128,128,192);
    // 이 위까지는 그리드에 사용되는 객체를 받는 곳입니다

    if( (ACol >= 2 && ACol <=4) && ARow == 1 )
    {
       AnsiString CellText = "WOW  안녕 하세요";
       //이곳은 셀(2,1) 에서 셀(4,1)까지 합칩니다
       //합치는게 아니라 덮어 쓴다는 표헌이 맞게군요
       CellRect   = StringGrid1->CellRect(2,1);
       Rect.Left  = CellRect.Left;
       CellRect   = StringGrid1->CellRect(4,1);
       Rect.Right = CellRect.Right;

       //이곳은 덱스트작업 영역
       TextRect = Rect;
       TextRect.Left = TextRect.Left + 40;
       //이곳에서 바뀐 크기의 좌표를 가지고 그리기 작업을 하는곳입니다
       ACanvas->FillRect( Rect );
       Frame3D( ACanvas,Rect,clr_shadow,clr_highlight,2 );
       DrawText( ACanvas->Handle,CellText.c_str(),CellText.Length(),&TextRect,
                              DT_LEFT | DT_VCENTER | DT_SINGLELINE );
     }
}


가장 간단하고 단순하게 설명 했답니다


여기에 좌우,상하 스크롤이 붙게 되고 각 셀의 좌표가 수시로 바뀌게 되면
각 셀 좌표 제어 하는 문제,그리고 사실 여러가지 자잘한 문제까지 끼어들긴 하지만
가장 기본적인 이 팁의 요점은 이곳에 있답니다
응용하시면 꼭 셀 병합만이 아니라 다른 셀 중간점 혹은 판이한 크기와 위치의
셀도 작성하실수 있을 겁니다

다시 정리하면 핵심은 TCanvas와 인자로 넘어오는 TRect에 있답니다

차후에 컴포넌트로,, 

도움이 되셨길 바라면서 이만 물러 갈께요

즐프..~~

+ -

관련 글 리스트
160 [TIP] StringGrid 내 마음대로 박남영 11393 2001/08/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.