Q&A

  • 스킨기능을 구현하려고 하는데 소스대로 하는데 잘안되네요
http://www.delphi.co.kr/zboard/view.php?id=tips&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=스킨&select_arrange=headnum&desc=asc&no=1297

소스
http://www.delphi.co.kr/zboard/view.php?id=component&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=문상철&select_arrange=headnum&desc=asc&no=1176

이소스를 따라서 하느데요
저소스만 실행시키면 잘되는데 제가 만든건 안되네요
아무래도 Form설정에서 다른게 있는거 같은데 폼위에 그림이 나와야 되는데..

소스에 자세한 주석이나 폼설정값같은것좀 알려주세요.

복많이 받으세요^^
2  COMMENTS
  • Profile
    고한주 2004.08.07 02:43


    제가 만들어보니 잘 되더군요...어디서 에러가 난건지 실행은 되는데 구현이 안되는건지 모르겠지만 소스에 주석이라도 달아드리겠습니다.

    아 그리고 이 소스 조금 불안정하다고 해야하나? 아무튼 몇가지 문제가 있습니다. 먼저 창의 헤더부분을 어디든지 클릭하면 종료가 되버리고, 종료버튼을 눌러도 창을 움직여버리면 종료가 안됩니다.
    그건 간단히 수정하실수 있을겁니다.


    procedure TForm1.SkinForm;
    var
        FormHeight : Integer;
    begin
       //화면을 Image4의 이미지로 가득 채웁니다.
       StretchBlt( Form1.Canvas.Handle, 0,0, Form1.Width,
          Form1.Height ,Form1.Image4.Canvas.Handle,0,0,128 ,1 ,SRCCOPY) ;

         FormHeight := Form1.FormHeight;

         //폼의 헤더부분을 Image1의 이미지로 그린다.
         StretchBlt( Form1.Canvas.Handle,0,0, Form1.Width ,
                      FormHeight,  Form1.Image1.Canvas.Handle,0,0,
                      Form1.Image1.Width-50, FormHeight, SRCCOPY);

         //종료버튼달기
         BitBlt( Form1.Canvas.Handle, xBtnLeft,xBtnTop,xBtnWidth,xBtnHeight, Form1.Image3.Canvas.Handle,
                             5, 32, SRCCOPY);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var
       Rgn : HRGN ;
    begin
      image2.width := Form1.Width;
        
        //폼의 사각을 둥글게 만든다.
        Rgn :=  CreateRoundRectRgn(0, 0, Form1.Width , Form1.Height, 30, 30);
        Rgn := SetWindowRgn( Form1.Handle , Rgn, True);

        bMouseDown := False;
        Form1.FormHeight := Image1.Height div 3;

        //종료버튼의 위치잡기
        xBtnLeft := Form1.Width - 20;
        xBtnTop := 3;
        xBtnWidth := 10;
        xBtnHeight := 12;
    end;

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      bMouseDown := True;

       //폼에 마우스버튼이 눌렸을때 종료버튼의 위치라면 종료버튼의 이미지를 눌렀을때의 이미지로 바꿉니다.
       if (X >= xBtnLeft) and (X <= (xBtnLeft + xBtnWidth)) then  begin

           if (Y >= xBtnTop) and  (Y <= (xBtnTop + xBtnHeight)) then  begin
                     BitBlt( Form1.Canvas.Handle, xBtnLeft,xBtnTop,xBtnWidth,xBtnHeight, Form1.Image3.Canvas.Handle,
                             5, 42, SRCCOPY);
             sleep(200);
           end;
       end;
    end;

    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
       MovingX : Integer;
       MovingY : Integer;
    begin
      //마우스버튼이 눌린상태이고 마우스포인트의 Y좌표가 헤더부분이면 창을 움직입니다.
      if bMouseDown then  begin

           if Y <= FormHeight then begin

                ReleaseCapture;
                DefWindowProc(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
            end;
       end;
    end;

    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       //마우스포인트의 위치가 종료버튼위라면 종료합니다
       bMouseDown := False;
         if (Y >= xBtnTop) and  (Y <= (xBtnTop + xBtnHeight)) then  begin
            close;
         end;
    end;

    procedure TForm1.FormPaint(Sender: TObject);
    begin
      SkinForm;
    end;

    end.
  • Profile
    남궁주익 2004.08.07 21:34