|
왕골 님이 쓰신 글 :
: 안녕하세요. 초보입니다.
: 항상 도움을 주어서 감사드립니다.
:
: 질문드리고자 하는 것은 paintbox를 하나 그려놓고 onpaint event에 어떤 line 을 그린후에(이때는 프로그램이 run되면 바로 main화면에 그래프가 나타나죠) mousedown, mousemove event를 이용하면 그 line을 움직일 수 있는 코드를 짰습니다.
:
: 그런데 이번에는 Button을 하나 만들어 그 버튼을 누르면 그리고자 하는 그래프의 좌표(즉 점1(x1, y1), 점2(x2, y2), 점3( , ) ....)를 계산한 다음 TPoint에 저장한 후 위의 OnPaint Event내에 구현한 동일한 코드즉, Paintbox1->Canvas->MoveTo(점1), Paintbox1->Canvas->LineTo(점2), ...을 써놓았더니 Mouse down, Mousemove event가 먹지 않군요. 아마 OnPaint Event가 먹지 않아서 그런 모양인데 어떻게 하면 되는지요.
:
:
: **** 버튼에 구현한 코드는 다음과 같습니다********]
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
: int PStep, MinP, MaxP;
:
: PStep=atoi(Edit1->Text.c_str()) ;
: MinP = atoi(Edit2->Text.c_str()) ;
: MaxP = atoi(Edit3->Text.c_str()) ;
:
: DelP=200./PStep;
: DelStep=450./PStep;
: //SumP=DelP;
:
: for(int i=0;i<PStep; i++)
: {
: Pt[i].x=i*DelStep, Pt[i].y=i*DelP;
: // SumP=SumP+DelP;
: // ShowMessage(Pt[i].x);
: }
:
: PaintBox1->Canvas->Pen->Color=clTeal;
: PaintBox1->Canvas->Rectangle(0,0,400,0+200);
: PaintBox1->Canvas->Pen->Color=clBlack;
: //Canvas->Polyline((TPoint*)Pt,6);
: //below code draws star
: PaintBox1->Canvas->MoveTo( Pt[0].x,Pt[0].y);
:
: for (int i=1;i<PStep; i++)
: {
: PaintBox1->Canvas->LineTo(Pt[i].x, Pt[i].y );
:
: }
: }
:
임펠리테리입니다.
정확히 이해했는지 자신이 없습니다만.. 일단 생각나는대로만 설명하겠습니다.
페인트박스의 OnPaint 이벤트는 페인트박스가 그려져야 할 필요가 있을 경우, 즉 다른 윈도우가 가렸다가 나타났다든지 혹은 윈도우가 최소화되었다가 다시 나타났다든지 하는 경우에만 발생합니다.
보통, 페인트박스의 OnPaint 이벤트 핸들러가 이미 존재한다면, 다른 코드(말씀하신 경우 버튼 클릭 핸들러)로 인해 그림을 그리는 코드가 있다면 곤란합니다. 절대로 안되는 것은 아닙니다만, 고려해야 할 경우의 수가 많아집니다.
그림은 항상 OnPaint에서만 그린다고 생각하시는 것이 좋겠고, 버튼을 클릭하는 경우에는 OnPaint에서 그려질 데이터만 추가한 후, PaintBox의 Invalidate() 함수를 호출하여 OnPaint가 발생하도록 하는 것이 좋습니다. 만약, 버튼 클릭에 의해 그려질 형태를 OnPaint에서 예측하기 힘들 정도로 복잡하다면 다른 방법을 강구해야 하겠지요.
그럼 참고하시길...
|