Q&A

  • TPanel 에 선그리기?
판넬을 몇게 올려놓고



그 판넬 바탕색을 두는 식으로 그룹을 져서 화면 인터페이스를 만들었습니다.



그런데 판넬에는 선을 그릴수가 없더라구요..



Type 에 pnlTemp = class(TPanel); 선언하구



FormPaint 메소드에서 사용하려 했지만 안되더라구요...





With pnlTemp(Panel1).Canvas do begin

brush.style:=bsclear;

pen.color:=clBlue;

moveto(0,100);

lineto(0, height);

end;



이런 식으로 했지만 이것도 역시 안됩니다.



선그리는 방법을 알려주세요...



3  COMMENTS
  • Profile
    최용일 2001.02.09 04:35
    안녕하세요. 최용일입니다.



    한가지가 빠졌군요... 캔버스에 윈도우DC를 연결해주어야 합니다...



    procedure TForm1.Button1Click(Sender: TObject);

    type

    pnlTemp = class(TPanel);

    var

    Canvas: TCanvas;

    begin

    Canvas := pnlTemp(Panel1).Canvas;

    try

    Canvas.Handle := GetDC(Panel1.Handle); // <<***********************

    Canvas.Brush.Style:= bsClear;

    Canvas.Pen.Color := clRed;

    Canvas.MoveTo(100,100);

    Canvas.LineTo(200, 200);

    finally

    ReleaseDC(Panel1.Handle, Canvas.Handle);

    end;

    end;



    ^^ 항상 즐코하세요...



    박제범 wrote:

    > 판넬을 몇게 올려놓고

    >

    > 그 판넬 바탕색을 두는 식으로 그룹을 져서 화면 인터페이스를 만들었습니다.

    >

    > 그런데 판넬에는 선을 그릴수가 없더라구요..

    >

    > Type 에 pnlTemp = class(TPanel); 선언하구

    >

    > FormPaint 메소드에서 사용하려 했지만 안되더라구요...

    >

    > 예

    > With pnlTemp(Panel1).Canvas do begin

    > brush.style:=bsclear;

    > pen.color:=clBlue;

    > moveto(0,100);

    > lineto(0, height);

    > end;

    >

    > 이런 식으로 했지만 이것도 역시 안됩니다.

    >

    > 선그리는 방법을 알려주세요...

    >

  • Profile
    박제범 2001.02.09 05:00
    최용일님 답변 잘 보았습니다.



    그런데 제가 원하는 것은 버튼 이벤트에 한번 그리고 없어지는 것이 아닌

    있는 그대로의 배경그림을 그리고 싶습니다.



    그래서 저는 form의 OnPaint 이벤트에서 사용하려 합니다.



    여기에서 사용하면 화면이 다시 그릴때 선을 다시 그려주기 때문입니다.



    어떻게 처리하는지 알려주시기 바랍니다.

  • Profile
    최용일 2001.02.09 05:30
    안녕하세요. 최용일입니다.



    흠~ 그런 경우는 Window Procedure를 바꿔주시면 됩니다.



    TForm1 = class(TForm)

    ...

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    private

    FOldWndProc: TWndMethod;

    procedure PanelWndProc(var AMessage: TMessage);

    procedure PanelDraw;

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    FOldWndProc := Panel1.WindowProc; // 예전의 Window procedure 를 저장하고

    Panel1.WindowProc := PanelWndProc; // 새로운 Window procedure로 바꾼다.

    end;



    procedure TForm1.FormDestroy(Sender: TObject);

    begin

    Panel1.WindowProc := PanelWndProc; // 원래의 window procedure로 복귀.

    end;



    procedure TForm1.PanelDraw;

    // 판넬에 그림그려주기...

    var

    DC: HDC;

    Canvas: TCanvas;

    begin

    Canvas := TCanvas.Create;

    try

    Canvas.Handle := GetDC(Panel1.Handle);

    Canvas.Brush.Style := bsClear;

    Canvas.Pen.Color := clRed;

    Canvas.MoveTo(100, 100);

    Canvas.LineTo(200, 200);

    finally

    Canvas.Free;

    end;

    end;



    procedure TForm1.PanelWndProc(var AMessage: TMessage);

    // 판넬의 새로운 window procedure, 여기에서 해당메세지를 처리...

    begin

    FOldWndProc(AMessage); // 예전의 window procedure를 호출해서 기본메세지를 처리하고

    case AMessage.Msg of // 새롭게 변화될 메세지에 대한 처리만...

    wm_Paint: PanelDraw;

    end;

    end;



    ^^ 항상 즐코하세요.



    박제범 wrote:

    > 최용일님 답변 잘 보았습니다.

    >

    > 그런데 제가 원하는 것은 버튼 이벤트에 한번 그리고 없어지는 것이 아닌

    > 있는 그대로의 배경그림을 그리고 싶습니다.

    >

    > 그래서 저는 form의 OnPaint 이벤트에서 사용하려 합니다.

    >

    > 여기에서 사용하면 화면이 다시 그릴때 선을 다시 그려주기 때문입니다.

    >

    > 어떻게 처리하는지 알려주시기 바랍니다.