정성들여 답변해 주시는 분들때문에
질문 올린 보람이 있어 정말 좋네요~
감사합니다~
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);
: : : }
: : : }
: : : }
: : : //---------------------------------------------------------------------------
: : :