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
[1063] Dialog Form Sizing
박영목.월천 [gsbsoft] 8321 읽음    2011-04-29 08:04
이것도 옛날에 한적이 있을 것인데... 할려고 하니 안보이고...

간단한 것인데도... 이것 뭐 다듬고 하니 시간 3시간 가까이 가버리네요...

여하튼 어떤 프로그램이라도 시간을 많이 잡아 먹는 군요...

작은 것이라도 했을 때 소스가 좀 쪽팔리더라도 올리는 것이 다음에 나를 위해

다른 분들을 위해 좋을 것 같습니다.

그런데 막상 올리려고 하니 또 소스를 한번 더 보게 되는 군요... 체면... 참... 어쩔

수가 없는 모양입니다.  또 보아도... 약간 쪽팔리는 군요... ㅋㅋㅋ

알아서 예쁘게 수정해서 사용하세요.....  하실 분만...


폼의 오른쪽 아래 마우스 클릭해서 끌고 가다가 놓으면 폼 사이즈 변경됩니다.

알송 폼을 변경할 때 하는 것처럼...  요것 보면서... 최적화했습니다. 최적화라고 해봐야...

다른 윈도우 활상화 될 때....  그리고 있던 것 삭제하는 것이지만...

아~~   잠온다...  조금 자야겠습니다.  여러분들은 일하셔야지요... ㅋㅋㅋ 

회사가 그립당~~~   혼자 하는 것 별로 재미없군....

                                                                                        부산에서 월천 올렸습니다.    

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

HHOOK hMouseHook    = NULL;

bool bSizingForm = false;
POINT mouse2;
SIZE off;

void __fastcall DrawDotBox( HDC dc, int xs, int ys, int xe, int ye, COLORREF crColor )
{
  int i = ys;
  while( i<ye )
  {
    ::SetPixel( dc, xs, i, crColor );
    ::SetPixel( dc, xe, i, crColor );
    i+=2;
  }

  i = xs;
  while( i<xe )
  {
    ::SetPixel( dc, i, ys, crColor );
    ::SetPixel( dc, i, ye, crColor );
    i+=2;
  }
}

LRESULT CALLBACK MouseHook(int nCode, WPARAM wParam, LPARAM lParam )
{
  int   w, h;
  POINT mouse;
  HDC   m_hdc;

  int nMode;

  if( nCode >= HC_ACTION )
  {
    ::GetCursorPos(&mouse);

    m_hdc = ::GetDC( NULL );

    switch( wParam )
    {
      case WM_LBUTTONDOWN:
                           w = Form1->Left + Form1->Width;
                           h = Form1->Top  + Form1->Height;

                           off.cx = abs(w-mouse.x);
                           off.cy = abs(h-mouse.y);

                           Form1->Edit2->Text = IntToStr( off.cx ) + ", " + IntToStr( off.cy );

                           if( ((w-10)<mouse.x && mouse.x<w) && ((h-10)<mouse.y && mouse.y<h) )
                           {
                             mouse2 = mouse;

                             nMode = ::SetROP2( m_hdc, R2_XORPEN );

                             //그리고
                             DrawDotBox( m_hdc, Form1->Left, Form1->Top, mouse.x+off.cx, mouse.y+off.cy, 0xFFFFFF );

                             ::SetROP2(m_hdc,nMode);

                             bSizingForm = true;
                           }

                           break;

      case WM_MOUSEMOVE:
                           Form1->Edit1->Text = IntToStr( mouse.x ) + ", " + IntToStr( mouse.y );

                           if( bSizingForm==true && (mouse2.x!=mouse.x || mouse2.y!=mouse.y))
                           {
                             nMode = ::SetROP2( m_hdc, R2_XORPEN );

                             //지우고
                             DrawDotBox( m_hdc, Form1->Left, Form1->Top, mouse2.x+off.cx, mouse2.y+off.cy, 0xFFFFFF );

                             //그리고
                             DrawDotBox( m_hdc, Form1->Left, Form1->Top, mouse.x+off.cx, mouse.y+off.cy, 0xFFFFFF );

                             ::SetROP2(m_hdc,nMode);

                             mouse2 = mouse;
                           }

                           break;

      case WM_LBUTTONUP:
                           if( bSizingForm==true )
                           {
                             nMode = ::SetROP2( m_hdc, R2_XORPEN );

                             //지우고
                             DrawDotBox( m_hdc, Form1->Left, Form1->Top, mouse2.x+off.cx, mouse2.y+off.cy, 0xFFFFFF );

                             ::SetROP2(m_hdc,nMode);

                             ::PostMessage( Form1->Handle, 9999, (mouse2.x+off.cx) - Form1->Left, (mouse2.y+off.cy) - Form1->Top );

                             bSizingForm = false;
                           }

                           break;
    }

    ::ReleaseDC( NULL, m_hdc );
  }

  return( CallNextHookEx(hMouseHook, nCode, wParam, lParam) );
}

void __fastcall InstallMouseHook()
{
  if( hMouseHook==NULL )
  {
    hMouseHook=SetWindowsHookEx( WH_MOUSE, (HOOKPROC)MouseHook,0, ::GetCurrentThreadId() );
  }
}

void __fastcall UnInstallMouseHook()
{
  if( hMouseHook )
  {
    UnhookWindowsHookEx( hMouseHook );
    hMouseHook=NULL;
  }
}
//------------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WMActivateApp(TMessage msg)
{
   if( msg.WParam==0 )
   {

                           if( bSizingForm==true )
                           {
                             HDC m_hdc = ::GetDC( NULL );

                             int nMode = ::SetROP2( m_hdc, R2_XORPEN );

                             //지우고
                             DrawDotBox( m_hdc, Form1->Left, Form1->Top, mouse2.x+off.cx, mouse2.y+off.cy, 0xFFFFFF );

                             ::SetROP2(m_hdc,nMode);

                             //::PostMessage( Form1->Handle, 9999, (mouse2.x+off.cx) - Form1->Left, (mouse2.y+off.cy) - Form1->Top );

                             bSizingForm = false;

                             ::ReleaseDC( NULL, m_hdc );   //Form1->Handle 이게 뭐니... ㅋㅋㅋ 이것 수정한다고 3번이나 고쳤음...
                           }

   }
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  InstallMouseHook();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  UnInstallMouseHook();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
  POINT xy;
  xy.x = this->Left + this->Width;
  xy.y = this->Top  + this->Height;

  ::ScreenToClient( this->Handle, &xy );

  this->Canvas->Rectangle( xy.x-10, xy.y-10, xy.x, xy.y );

}
//---------------------------------------------------------------------------

void __fastcall TForm1::WMPaint( TMessage msg )
{
  Form1->Width  = msg.WParam;
  Form1->Height = msg.LParam;

  Invalidate();
}
망치 [mangchy]   2011-05-03 10:12 X
그렇죠...같이 이야기하면서 해야 일할맛이 나는거 같아요...
재택 근무도 해보고, 프리랜서도 해보고, 작은 인원에서도 해보았는데 그래도 제일 좋은건 사람이 많은게 좋네요.
물론 마음 맞는 사람 수가 더 중요하겠지만...ㅎㅎ
박영목.월천 [gsbsoft]   2011-05-06 19:09 X
망치님 감사요....  동감합니다.  너무 게을지는 것 같음.... ㅋㅋㅋ  나는 볼랜드의 '망치'님 예명을 보면 떠오르는 것은 장군의 아들1편에 극장에 들어가려고 하면서 나는 전라도에서 올라온 망치... 그때 그 망치역이 연상됩니다... 이상해 계속 그래요... ㅋㅋㅋ  말안하고 있다가 하니... 속은 편합니다. ㅋㅋㅋ 오해 마시고... 그냥 떠올라 적었습니다. 혹 망치님의 명예에 해가 된다면 즉시 바로 삭제하겠습니다 ^^

+ -

관련 글 리스트
1063 Dialog Form Sizing 박영목.월천 8321 2011/04/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.