C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[101] TIP 내 맘대로 폼
박남영 [puco21] 9269 읽음    2001-07-20 16:44
안녕하세요 ~~

이곳에 팁이란걸 쓰게 되네요,조금 쑥쓰럽기도 하지만

그동안 이곳 사이트에서 도움을 많이 받았기에 보답하는 뜻으로 올려 봅니다

이곳 사이트에 캡션바 제어 사이징 등등을 종합해서 만들어 봤답니다

심심해서요? 물론 아니구요  이번에 기존의 사각형 폼과 같이 틀에 짜여진

폼 형태가 마음에 않들어서 WINDOW MEDIA PLAYER안에 있는 스킨 같은 폼을

회사 차원에서 만들게 됬답니다

그러다 보니 간단하게 여기 올리는 폼을 만들어 봤답니다


우선 헤더 파일이구요

//화면 크기 조정할때 최대 최소를 설정하기 위한곳
#define MIN_SIZE_X        450
#define MIN_SIZE_Y        250

#define MAX_SIZE_X        750
#define MAX_SIZE_Y        500

//---------------------------------------------------------------------------
class TSDIForm : public TForm
{
__published:	// IDE-managed Components
         //짜가 캡션바랍니다
        TPanel *CaptionBar;
         //왼쪽에 로고  
        TImage *Image1;
        void __fastcall CaptionBarMouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y);
        void __fastcall FormDeactivate(TObject *Sender);
        void __fastcall FormActivate(TObject *Sender);
        void __fastcall Image1DblClick(TObject *Sender);
private:	// User declarations
        void __fastcall CreateParams(TCreateParams&);
        void __fastcall CaptionProc(TMessage&);
        void __fastcall minmaxMsg(TWMGetMinMaxInfo&);
public:		// User declarations
        __fastcall TSDIForm(TComponent* Owner);
        __fastcall ~TSDIForm();

//이 메시지가 최대 최소 사이징을 관리하는 메시지랍니다 
BEGIN_MESSAGE_MAP
   MESSAGE_HANDLER( WM_GETMINMAXINFO,TWMGetMinMaxInfo,minmaxMsg)
END_MESSAGE_MAP(TForm);
};


메인 에서 불러다 쓰는 SDIFORM이랍니다
메시지 제어를 API로 할까하다 중간 중간 몇개의 문제 때문에
빌더 형식으로 다 통일 했네요
가짜 캡션바를 진짜처럼 쓸려니까 활성화 되지도 않았는데 자꾸 그위로
지나가기만 해도 자동으로 활성화 되서 그거 처리하는게 조금 괴롭히더군요
결론은 마우스 이동 메시지 보다 활성화 메시지가 먼저 처리된다는데 답을 찾았구요

//--------------------------------------------------------------------------
//     AT SDI Form
//--------------------------------------------------------------------------
#include 
#pragma hdrstop

#include "ATSDIForm.h"
//--------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


//이 변수는 위에서 말한 자동 활성화 방지 때문에 필요하답니다 
bool MoveForm = true;
//이건 이벤트 함수 포인터 저장해두기 
TWndMethod OrignalCaption;

TSDIForm *SDIForm;

//--------------------------------------------------------------------------
__fastcall TSDIForm::TSDIForm(TComponent* Owner)
        : TForm(Owner)
{
      //캡션바 WindowProc를 저장해 둡니다 왜냐면 나중에 돌려 줘야하니까요 
     OrignalCaption = CaptionBar->WindowProc;
     CaptionBar->WindowProc = CaptionProc;
}
__fastcall TSDIForm::~TSDIForm()
{
      //되돌려 준다 
     CaptionBar->WindowProc = OrignalCaption;
}
//--------------------------------------------------------------------------


//이곳은 api함수 호출 부분 입니다
//캡션바의 색깔을 바꾸려구 그런거랍니다
//아참 GradientFill함수를 쓰기 위해선 2000에서 쓰시구요
//msimg32.lib파일에 필요하답니다 프로젝트에 첨가하세요
//98이시라면 이곳은 지워도 무방하겠네요
//위에 있는 windowProc저장하는 작업도 필요 없구요

HDC CaptionDc;
RECT CaptionCrt;
PAINTSTRUCT CaptionPs;
TRIVERTEX vert1[4];
GRADIENT_RECT CaptionGrtRect;

void __fastcall TSDIForm::CaptionProc(TMessage& Msg)
{
     switch(Msg.Msg)
     {
         //이곳은 가짜 캡션바를 진짜처럼 사용하기 위해서 
         //가짜 캡션바에 오는 메시지중 그리기 메시지를 덮어쓰는 곳이랍니다 
        case WM_PAINT:
           CaptionCrt = (RECT)CaptionBar->ClientRect;
           CaptionDc = BeginPaint(CaptionBar->Handle,&CaptionPs);
           vert1[0].x = CaptionCrt.left;
           vert1[0].y = CaptionCrt.top;
           vert1[0].Red   = 0x8000;
           vert1[0].Green = 0x8000;
           vert1[0].Blue  = 0xc000;
           vert1[1].x = CaptionCrt.right;
           vert1[1].y = CaptionCrt.bottom;
           vert1[1].Red   = 0xc800;
           vert1[1].Green = 0xc800;
           vert1[1].Blue  = 0xe400;
           CaptionGrtRect.UpperLeft = 0;
           CaptionGrtRect.LowerRight = 1;
           GradientFill(CaptionDc,vert1,2,&CaptionGrtRect,1,GRADIENT_FILL_RECT_H);
           EndPaint(CaptionBar->Handle,&CaptionPs);      
            Image1->Repaint();

        default:
           OrignalCaption( Msg );
     }
}

//---------------------------------------------------------------------------

void __fastcall TSDIForm::CreateParams(TCreateParams& Params)
{
      //폼 생성시 어떤 폼이냐를 이곳에서 제어 할수 있답니다 
     TForm::CreateParams(Params);
     Params.Style = WS_POPUP | WS_SIZEBOX;
}
//---------------------------------------------------------------------------

void __fastcall TSDIForm::minmaxMsg(TWMGetMinMaxInfo& Msg)
{
      //이곳은 사이즈 증가와 감소를 제어하는곳이랍니다  
     Msg.MinMaxInfo->ptMaxTrackSize.x = MAX_SIZE_X;
     Msg.MinMaxInfo->ptMaxTrackSize.y = MAX_SIZE_Y;

     Msg.MinMaxInfo->ptMinTrackSize.x = MIN_SIZE_X;
     Msg.MinMaxInfo->ptMinTrackSize.y = MIN_SIZE_Y;
}
//---------------------------------------------------------------------------

void __fastcall TSDIForm::CaptionBarMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
     //이곳은 가짜 캡션바를 진짜처럼 이동 시켜줍니다 폼을 말이죠 
      if( MoveForm == false )return;
     ReleaseCapture();
     SendMessage(this->Handle,WM_SYSCOMMAND,0xf012,0);
}
//---------------------------------------------------------------------------

//밑에 부분은 자잘한 제어랍니다 
void __fastcall TSDIForm::FormDeactivate(TObject *Sender)
{
     MoveForm = false;
}
//---------------------------------------------------------------------------

void __fastcall TSDIForm::FormActivate(TObject *Sender)
{
     MoveForm = true;
     this->Repaint();
}
//---------------------------------------------------------------------------


void __fastcall TSDIForm::Image1DblClick(TObject *Sender)
{
     Application->Terminate();
}
//---------------------------------------------------------------------------



도움 되셨길 바라구요 윈도우 미디어 플레이어 안에 있는 스킨 화면은 만들기 무척 쉽더군요

그것도 도전 해 보시길 바라구요

아참 참고로 2000에서 캡션바 색깔이 오른쪽으로 갈수록 옅어지잖아요

그거는 2000이하 버전에서는 장담 못하겠네요

그 기능 구현 할려고 GradintFill함수 썼는데 2000이하는 깔끔하게 지원 않될것 같네요

아직 98에서 돌려 보진 못해서^^

그리고 7044번에 주경민이 쓰신 글에 보면 msimg32.lib를 얻을수 있는 방법이 나왔있답니다

나머지는 여러분의 노력이겠네요

화이칭 ~~   물러 갈께요

+ -

관련 글 리스트
101 TIP 내 맘대로 폼 박남영 9269 2001/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.