|
폼에 한문에서의 밭전 자와 같은 모양으로 창문을 그리려고 다음과 같이 코딩했습니다.
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Canvas->Pen->Color = clRed;
Canvas->Pen->Width = 3;
Canvas->Brush->Style = bsClear;
TRect rect = ClientRect;
Canvas->Rectangle(rect);
Canvas->MoveTo(0,rect.Height()/2);
Canvas->LineTo(rect.Width(),rect.Height()/2);
Canvas->MoveTo(rect.Width()/2,0);
Canvas->LineTo(rect.Width()/2,rect.Height());
}
그런데 이렇게 코딩해서 실행해보면 폼을 리사이즈할 때나, 또는 폼이 부분적으로 다른 윈도우에 위해 가려졌다가 다시 나타나는 경우에 창문모양이 원하던 대로 안나오고 이상하게 변형됩니다.
아마도 무효화영역이 생기는 문제와 연관된 것 같습니다.
폼에 창문 그리는 또다른 방법은 위의 코드를 페인트박스의 OnPaint헨들러에 아래와 같이 코딩하고 나서, 그 페인트박스의 Align속성을 alClient로 바꾸는 방법입니다.
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
PaintBox1->Canvas->Pen->Color = clRed;
PaintBox1->Canvas->Pen->Width = 3;
TRect rect = PaintBox1->ClientRect;
PaintBox1->Canvas->Rectangle(rect);
PaintBox1->Canvas->MoveTo(0,rect.Height()/2);
PaintBox1->Canvas->LineTo(rect.Width(),rect.Height()/2);
PaintBox1->Canvas->MoveTo(rect.Width()/2,0);
PaintBox1->Canvas->LineTo(rect.Width()/2,rect.Height());
}
이 방법의 경우는 폼을 리사이즈하거나 폼이 가려졌다가 다시 나올 경우에도 아무 문제가 안생깁니다.
재 생각에는 이 차이가 무효화영역이 설정되는 것의 차이인 것 같습니다.
페인트박스에 그리는게 아니라, 폼에다 직접 그리는 경우 생기는 이러한 문제를 없애려면 어떻게 해야되죠?
폼에 무언 가를 그릴 경우는 폼에 직접 그리는 것보다는 Align속성이 alClient인 페인트박스를 이용하는 것이 정석인가요?
|