스트링그리드에서 기본적으로 그리는 텍스트를 안그리도록 하려면 DefaultDrawing을 false로 설정하면 됩니다만, 그렇게 하면 원하시는 헤더 배경 부분도 아예 그리지 않게 되지요. 그래서 DefaultDrawing 설정으로는 해결되지 않고요.
원하시는 대로 테마 배경을 그리는 루틴을 직접 호출해주시면 되겠네요. 스트링그리드의 소스를 보면 헤더에 테마 배경을 그리는 루틴은 DrawThemeBackground()입니다. 다음과 같이 해보니 잘 되더군요.
DrawThemeBackground((void *)(ThemeServices()->Theme[teHeader]), StringGrid1->Canvas->Handle,
1, 1, &Rect, &Rect);
이전의 FillRect()를 지우시고 이 코드를 대신 넣으시면 되겠습니다.
(어차피 DrawThemeBackground() 함수도 기존의 배경에 덮어써버리니 FillRect()가 필요하지 않겠지요)
그런데 이렇게 해서 그려보시면 원하시는 것과 비슷하긴 하겠지만, 잘 보시면 글자가 그려진 사각 영역이 불투명해져서 글자가 있는 부분만 테마 배경이 지워지고 희게 나타나게 될 겁니다. 그래서 스트링그리드에 실제로 텍스트를 그려넣기 전에 아래와 같이 브러시의 스타일을 투명하게 지정해주셔야 하겠습니다.
StringGrid1->Canvas->Brush->Style = bsClear;
아래와 같이 잘 나오는군요.
송신영 님이 쓰신 글 :
: 안녕하세요. 오래간만에 질문 하나 드립니다.
: 2010에서 String Gride를 gdsGradient 이나, gdsThemed 로 사용중에
: Fixed Cell의 문자를 정렬하려면 그림과같이 Title1, Title3 같이 글자가 겹쳐서 그려집니다.
: 그래서 배경을 지우고 그리면 원래의 Gradient나 Theme가 사라집니다. (Title2 같이..)
: 그냥 내용 Cell의 경우 배경을 지우는 것은 문제될게 없는데
: Fixed Cell은 참 보기가 그렇군요...
: 원래의 배경을 그대로 두고 글자만 다시 정렬하는 방법이 없을 까요?
: 감사합니다.
:
:
:
:
:
: //---------------------------------------------------------------------------
: void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
: TGridDrawState State)
: {
: // unsigned OldAlign = SetTextAlign(StringGrid1->Canvas->Handle, TA_CENTER);
: // StringGrid1->Canvas->TextRect(Rect, (Rect.Right+Rect.left)/2, Rect.Top+2, StringGrid1->Cells[ACol][ARow]);
: // SetTextAlign(StringGrid1->Canvas->Handle, OldAlign);
:
: if(ACol == 1) {
: StringGrid1->Canvas->Brush->Color = clWhite;
: StringGrid1->Canvas->FillRect(Rect);
: }
:
: DrawText(StringGrid1->Canvas->Handle,
: AnsiString(StringGrid1->Cells[ACol][ARow]).c_str() ,-1,&Rect,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::FormShow(TObject *Sender)
: {
: StringGrid1->Cells[0][0] = "Title1";
: StringGrid1->Cells[1][0] = "Title2";
: StringGrid1->Cells[2][0] = "Title3";
:
: StringGrid1->Cells[1][2] = "내용1";
: StringGrid1->Cells[2][2] = "내용2";
: }
: //---------------------------------------------------------------------------
:
: