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
[56845] Re:Re:Re:Re:StringGrid Cell 이 아닌 line 의 색갈 변경 방법? 정성스런 답변 정말 감사드립니다~
궁금이 [] 1656 읽음    2009-05-14 09:46
정성들여 답변해 주시는 분들때문에
질문 올린 보람이 있어 정말 좋네요~
감사합니다~

skjoon 님이 쓰신 글 :
: ^^;; 정확히 질문의 의도를 파악한건지 모르겠지만...
:
: StringListDrawCell 이벤트 함수내에서 각 셀별로 다른 색을 칠한 후에
: 이것을 모두 흰색으로 초기화 하시려는 것으로 생각하고 말씀드리겠습니다.
:
: 전체 소스코드를 보지 못해 확실하진 않지만 질문자께서도 StringListDrawCell 이벤트 핸들러 안에서 각 셀별로 색칠하는 부분을 구현하신 것으로 보여집니다.
: 그 각각의 셀의 색을 정하는 기준이 있을 텐데요.
:
: 예를 들면
:
: 1. 홀수 Row는 Blue, 짝수 Row는 White...,
:
: 아니면
:
: 2. Cell의 텍스트가 "파랑" 이면 Blue, "하양" 이면 White..
:
: 뭐 이런 식이겠죠.
:
: 첫 번째 같은 경우 Row 의 홀/짝수 정보를 바꿀 수는 없으니까 어떤 플래그를 두어 그 플래그에 따라 StringListDrawCell의 코드를 실행할지 안할지를 결정하도록 하구요.
: 두 번째 같은 경우 모든 Cell 의 텍스트를 "하양" 으로 바꾸면 StringListDrawCell 이벤트 핸들러에서 모든 Cell 을 흰색으로 칠하게 될 것 입니다.
: 그런데 보통 Cell 의 텍스트 내용은 바꾸지 않고 색만 바꾸는 경우가 많을 것 같습니다.
: 이럴 경우에 저는 TStringList::Objects 프로퍼티를 이용합니다.
: Cell 과 마찬가지로 이중배열로 되어있어 Cell 1대1로 대응하는 정보를 저장하는 용도로 이용하고 있습니다.
: 이 Objects 에 Cell 의 정보를 넣을 때 구조체를 정의해서 사용할 수도 있겠지만
: 여기서는 간단하게 값을 넣어서 사용하는 방법을 보여드리겠습니다.
:
:
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
:     StringGrid2->RowCount = 380;
:     StringGrid2->ColCount = 280;
: 
:     for(int Row = 0; Row < StringGrid2->RowCount; Row++) {
:         for(int Col = 0; Col < StringGrid2->ColCount; Col++) {
:             /* Row를 기준으로 홀수는 흰색, 짝수는 파란색으로 초기화합니다. */
:             StringGrid2->Objects[Col][Row] = (TObject*)(Row%2?clWhite:clBlue);
:         }
:     }
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
:       int ARow, TRect &Rect, TGridDrawState State)
: {
:     TCanvas* Canvas = ((TStringGrid*)Sender)->Canvas;
: 
:     if(State.Contains(gdFixed)) {
:         /* Fixed Row 또는 Fixed Column 일 경우에는 그리지 않는다. */
:     } else {
:         /* Objects 프로퍼티의 값을 이용해서 브러시의 색을 설정한다. */
:         Canvas->Brush->Color = (TColor)((TStringGrid*)Sender)->Objects[ACol][ARow];
:         Canvas->FillRect(Rect);
:     }
: }
: //---------------------------------------------------------------------------
: 
: void __fastcall TForm1::CheckBox1Click(TObject *Sender)
: {
:     for(int Row = 0; Row < StringGrid2->RowCount; Row++) {
:         for(int Col = 0; Col < StringGrid2->ColCount; Col++) {
:             if(((TCheckBox*)Sender)->Checked) // 체크박스를 선택하면 흰색/파란색 초기설정으로...
:                 StringGrid2->Objects[Col][Row] = (TObject*)(Row%2?clWhite:clBlue);
:             else  // 체크박스 선택을 해제하면 모든 셀을 흰색으로 설정...
:                 StringGrid2->Objects[Col][Row] = (TObject*)clWhite;
:         }
:     }
: 
:     StringGrid2->Refresh(); // 스트링그리드를 새로 그려준다.
: }
: //---------------------------------------------------------------------------
: 

:
: 도움이 되시길 빕니다... :->
:
: 궁금이 님이 쓰신 글 :
: : 님 답변 감사합니다
: : 라인 부분이 님이 가르쳐주신대로 해보겠습니다
: :
: : 질문이 또하나 있는데 혹시 하시는지요?? ^^;;
: :
: :    for(int y=0; y<StringGrid->RowCount; y++)
: :   {
: :    for (int x = 0; x<StringGrid->ColCount; x++)
: :        {
: :     if ((StringGrid->Canvas->Brush->Color == clRed)||(StringGrid->Canvas->Brush->Color == clBlue)){
: :             StringGrid->Canvas->Brush->Color = clWhite;
: :             StringGrid->Canvas->FillRect(StringGrid->CellRect(x,y));
: :             }
: :        }
: :    }
: : 위 처럼 색칠한 셀에 빨간색이나 파란색으로 칠한 부분을 칠하기전 하얗게 초기화 시키고 싶은데
: : 셀이 많다보니 (380 * 280) for 문을 돌리니까 엄청 느립니다..
: : 초기화 하는 다른 방법이 있는지요?
: : canvas clear 이런 기능 없나요?
: :
: : skjoon 님이 쓰신 글 :
: : : 궁금이 님이 쓰신 글 :
: : : : Cell 의 색을 변경하는게 아니라
: : : : line 의 색을 어떤라인은 투명으로 어떤 라인은 까만색으로 지정할수있나요?
: : :
: : : 스트링그리드 속성은 기본 속성 그대로 두고 DrawCell 이벤트 함수만 구현했습니다.
: : : 투명한 라인을 그리시려면 DefaultDrawing 속성을 False로 하시고 라인을 그리지 않던지
: : : 아니면 DefaultDrawing 속성이 True인 상태에서 스트링그리드의 Color와 같은 색으로 라인을 그리시면 될 것 같습니다.
: : : 그리고 Cell의 상태에 따라 각각 다른 라인을 그리시려면... 각 상황에 따라.. Rectangle이 아닌 LineTo를 사용해서 일일이 그려주셔야 할 것 같습니다. :->
: : :
: : :
: : : void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
: : :       int ARow, TRect &Rect, TGridDrawState State)
: : : {
: : :     TCanvas* Canvas = ((TStringGrid*)Sender)->Canvas;
: : : 
: : :     if(State.Contains(gdFixed)) {
: : :         /* Fixed Row 또는 Fixed Column 일 경우에는 그리지 않는다. */
: : :     } else {
: : :         Canvas->Pen->Color = clBlue;
: : : 
: : :         /* Fixed Row 또는 Fixed Column에 접한 라인은 그리지 않는다. */
: : : 
: : :         if(ARow == ((TStringGrid*)Sender)->FixedRows) {
: : :             if(ACol == ((TStringGrid*)Sender)->FixedCols) {
: : :                 Canvas->MoveTo(Rect.Left, Rect.Bottom);
: : :             } else {
: : :                 Canvas->MoveTo(Rect.Left-1, Rect.Top);
: : :                 Canvas->LineTo(Rect.Left-1, Rect.Bottom);
: : :             }
: : :             Canvas->LineTo(Rect.Right, Rect.Bottom);
: : :             Canvas->LineTo(Rect.Right, Rect.Top-1);
: : :         } else if(ACol == ((TStringGrid*)Sender)->FixedCols) {
: : :             Canvas->MoveTo(Rect.Left, Rect.Top-1);
: : :             Canvas->LineTo(Rect.Right, Rect.Top-1);
: : :             Canvas->LineTo(Rect.Right, Rect.Bottom);
: : :             Canvas->LineTo(Rect.Left-1, Rect.Bottom);
: : :         } else {
: : :             Canvas->Rectangle(Rect.Left-1, Rect.Top-1, Rect.Right+1, Rect.Bottom+1);
: : :         }
: : :     }
: : : }
: : : //---------------------------------------------------------------------------
: : : 

+ -

관련 글 리스트
56828 StringGrid Cell 이 아닌 line 의 색갈 변경 방법? 궁금이 1103 2009/05/13
56830     Re:StringGrid Cell 이 아닌 line 의 색갈 변경 방법? skjoon 1442 2009/05/13
56832         Re:Re:StringGrid Cell 이 아닌 line 의 색갈 변경 방법? -> 답변 정말정말 감사합니다 (냉무) 궁금이 1186 2009/05/13
56834             Re:Re:Re:StringGrid Cell 이 아닌 line 의 색갈 변경 방법? (추가 질문이요~) canvas 초기화 skjoon 2682 2009/05/13
56845                 Re:Re:Re:Re:StringGrid Cell 이 아닌 line 의 색갈 변경 방법? 정성스런 답변 정말 감사드립니다~ 궁금이 1656 2009/05/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.