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

#include <vcl.h>
#pragma hdrstop

#include "ide_popup.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tide_popup_Form *ide_popup_Form;
//---------------------------------------------------------------------------

#include "main.h"
#include "ide_main.h"
#include "ide_library.h"
#include "gui.h"

__fastcall Tide_popup_Form::Tide_popup_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[2007.03.04.일][생성!!!]

  //[VAR]
  //{
      int         width, height;
      AnsiString  bmp_path;
  //}

  //[환경변수]
  //{
      //[2007.10.02.화][추가!!!]
      IDE_Get_Option(&_ide_option);

  //}

  //[초기화]
  //{
      //--------------------------------------------------------------------------
      //크기는 표시되는 내용에 따라 자동으로 처리 되지만 일단 임의 값을 기록한다.
      this->Left     = -500;
      this->Top      = -500;
      this->Width    = 100;
      this->Height   = 100;
      this->Color    = clWhite;

      //실제 그림 영역을 생성한다.
      _bmp_ = new Graphics::TBitmap;

      //그림 영역 크기 설정.
      //아래의 _Set_Size() 함수에서 자동으로 결정된다.

      //24bit bitmap 으로 지정한다.
      _bmp_->PixelFormat = pf24bit;
      //--------------------------------------------------------------------------
  //}

  //[제목줄 글꼴 설정]
  //{
      FONTPACK_SetDefault(&_font_caption);

      _font_caption.margin_size = 0;

      //문자 margin 을 설정한다.
      _font_caption.offset_left   = 0;
      _font_caption.offset_right  = 0;
      _font_caption.offset_top    = 0;
      _font_caption.offset_bottom = 0;

      //[2010.01.26.화][추가!!!]{--------
      _font_caption.en_offset_left  = 0;
      _font_caption.en_offset_right = 0;
      //}--------------------------------
  //}

  //[메뉴 글꼴 설정]
  //{
      FONTPACK_SetDefault(&_font_menu);

      _font_menu.margin_size = 1;

      //문자 margin 을 설정한다.
      _font_menu.offset_left   = 0;
      _font_menu.offset_right  = 0;
      _font_menu.offset_top    = 3;
      _font_menu.offset_bottom = 3;

      //[2010.01.26.화][추가!!!]{-----
      _font_menu.en_offset_left  = 0;
      _font_menu.en_offset_right = 0;
      //}-----------------------------

  //}

  //[속성초기화]
  //{
      //기본적으로 선택되지 않은 상태.
      _caption_selected = false;
      _down             = false;
      _in               = false;

      //[동작함수] 초기화.
      _EVENT_ItemSelect = NULL;
  //}

  //[caption 설정]
  //{
      //caption 문자열.(크게 바뀔일이 없다.)
      STR_Assign(_caption, " 빠른목록 ");

      //높이 지정.
      _caption_height = 18;

      //caption 문자열의 width 를 구한다.
      FONT_Get_StringOutAreaInfo(&_font_caption, d_FONTSTYLE_default, _caption, &width, &height);

      //실제 사용할 caption 폭을 설정한다.
      //_font_caption.margin_size 는 처음 기본값인 0 을 사용한다.(한번만 그려주면 된다.)
      _caption_width = width + 2 * 2;
  //}

  //[초기화]
  //{
      _Init();
  //}

  //[참고]
  //{
      //일단 한번 보여줬다가 사라지게 만든다.
      this->Visible = true;
      this->Visible = false;
  //}

  return;

}

__fastcall Tide_popup_Form::~Tide_popup_Form(void)
{
  //[2012.04.29.일][수정!!!]

  if(_bmp_ != NULL) { delete _bmp_; _bmp_ = NULL; }

}

//[서브클래싱]------------------------------------------------------------------

void __fastcall Tide_popup_Form::WndProc(Messages::TMessage  &Message)
{
  //[2007.03.04.일][생성!!!]{-----------------------------------------------------
  //TForm 의 경우는 바탕을 칠하고 OnPaint() 를 발생하게 되므로 실제 _Draw() 를
  //OnPaint() 에서 사용하는 경우는 크기가 변경되는 경우 바로 칠해지지 않아서
  //하얀색 바탕이 그대로 나오게 되어 보기 좋지 않게 된다.
  //따라서 TForm 자체의 바탕을 그리는 WM_ERASEBKGND 에서 바로 _Draw() 를 사용하여
  //그리고 OnPaint() 는 처리하지 않는다.
  //C++Builder 와 같이 완벽하게 처리되는 깜박임이 전혀 없는 화면을 만들수 있다.
  //}-----------------------------------------------------------------------------

  switch(Message.Msg)
  {
    case WM_ERASEBKGND :
    {
      _Draw();

      //바로 죵료하지 않으면 WM_ERASEBKGND 메세지가 다음 TForm::WndProc(Message); 에서
      //다시 처리 되어 TForm->Color 로 칠해지게 되어 _Draw() 로 그린 것이 다 지워지므로
      //바로 종료한다.
      return;
    } break;

    case CM_MOUSEENTER :
    {
      //마우스가 안에 있음을 알린다.
      _in = true;

    } break;

    case CM_MOUSELEAVE :
    {
      //[2009.05.08.금][추가!!!]{---------------------------------------
      //반드시 이렇게 처리해야 선택이 되어 사라지는 경우 이곳으로 와서
      //<select_index : -1> 로 다시 초기화 되는 것을 막을수 있다.
      if(this->Visible == false) break;
      //}---------------------------------------------------------------

      //마우스가 안에 없음을 알린다.
      _in = false;

      //[선택 해제]{-----------------------------------------------------------
      //마우스가 submenu 영역을 벗어 나는 경우 선택된 것을 해제해 주어야 한다.
      //선택된 항목을 기록한다.
      _subitem.select_index = -1;
       //새로운 [항목] 이 선택되었다면 선택으로 표시한다.
       _Menu();
       _Draw();
      //}----------------------------------------------------------------------

    } break;

    case WM_KILLFOCUS :
    {
      //이 [팝업메뉴] 를 감춘다.
      this->Hide();

    } break;

  }

  //[기본처리]
  //{
      //기본 메세지는 반드시 처리 되어야 한다.
      TForm::WndProc(Message);
  //}

  return;

}

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

void __fastcall Tide_popup_Form::_Init(void)
{
  //[2007.03.05.월][생성!!!]{----------------------------------------
  //[팝업메뉴] 를 초기화 하기 위하여 반드시 한번 호출해 주어야 한다.
  //단, _subitem 이 이미 완성되 있어야 한다.
  //}----------------------------------------------------------------
  
  //[컨트롤 크기 설정]
  //{
      _Set_Size();
  //}

  return;

}

void __fastcall Tide_popup_Form::_Set_Size(void)
{
  //[2007.03.05.월][생성!!!]{--------------------------------------------------------
  //표시할 내용에 따라 _bmp_ 의 크기를 구한다.
  //단, [폭] 의 경우는 [제목줄] 의 길이보다 작은 경우는 최소한 제목줄의 2배가 되도록
  //크기를 조정하여 보기 좋게 만든다.
  //이 함수는 항목이 이미 _subitem 구조체에 전부 기록된 상태에서 사용해야 하고,
  //처음 한번만 사용하여 _bmp_ 의 크기를 표시할 내용에 맞게 수정하면 된다.
  //또한, [팝업메뉴] 자체의 크기도 확정한다.
  //}--------------------------------------------------------------------------------

  //[VAR]
  //{
      int  w;
      int  i;
      int  width, height;
      int  max_width = 0;
  //}

  //[정보 얻기]
  //{
      //[글꼴] 의 크기를 알기 위한 CRLF 문자 출력.
      FONT_Out_Moonja(_bmp_, &_font_menu, 0, 0, IDE_COLOR_1, IDE_COLOR_2, false, 0x0d0a, &w, &_line_height);
  //}

  //[문자열 최대폭 구하기]
  //{
      //_subitem 안의 표시 문자열의 최대폭을 구한다.
      for(i = 0; i < _subitem.count; i++)
      {
        FONT_Get_StringOutAreaInfo(&_font_menu, d_FONTSTYLE_default, _subitem.str[i].c_str(), &width, &height);

        //이전보다 더 큰 값인 경우만 기록한다.
        if(max_width < width)
        {
          //지금 값이 다시 최대값이 된다.
          max_width = width;

        }

      }
  //}

  //[크기 구하기]
  //{
      width  = 2 + max_width;
      height = _caption_height + 2 + (_line_height * _subitem.count);

      //[폭] 의 경우는 보기좋게 하기 위하여 [제목줄] 의 2배가 최소 크기가 되도록 한다.
      if(width < _caption_width)
      {
        width = _caption_width * 2;

      }
  //}

  //[크기 지정]
  //{
      _bmp_->Width  = width;
      _bmp_->Height = height;

      this->Width   = width;
      this->Height  = height;
  //}

  //[폼 오려내기]
  //{
      //한번만 오려내면 되므로 크기가 확정된 이곳에서 처리한다.
      _FormCut();
  //}

  return;

}

void __fastcall Tide_popup_Form::_FormCut(void)
{
  //[2007.03.04.일][생성!!!]{----------------------------------------------------
  //폼의 caption 의 모양을 보기 좋게 하기 위하여 caption 의 영역을 제외한 나머지
  //영역의 폼을 제거해 준다.(구멍을 뚫어준다.)
  //여러개의 [사각형] 모양으로 구멍을 뚫어준다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      HRGN    rgn_main,                              //대상 폼.
              rgn_cut_rect,                          //caption 오른쪽 영역 전부.
              rgn_cut_left_line, rgn_cut_left_dot,   //수평line, dot.
              rgn_cut_right_line, rgn_cut_right_dot; //수평line, dot.
  //}

  //[Form 초기화]
  //{
      //포인터 초기화.
      rgn_main = 0;

      //Form 의 영역 정보를 얻는다.
      GetWindowRgn(this->Handle, rgn_main);

      //일단 현재 Form 영역을 지운다.
      DeleteObject(rgn_main);
  //}

  //[영역 생성]
  //{
      //새로운 영역을 생성한다.
      rgn_main = CreateRectRgn(0, 0, this->Width, this->Height);

      //[구멍 뚫을 영역 지정]
      //{
          //caption 오른쪽 영역.
          rgn_cut_rect       = CreateRectRgn(_caption_width, 0, this->Width, 14);

          //좌측 라인.
          rgn_cut_left_line  = CreateRectRgn(0, 0, 2, 1);

          //좌측 점.
          rgn_cut_left_dot   = CreateRectRgn(0, 1, 1, 2);

          //우측 라인.
          rgn_cut_right_line = CreateRectRgn(_caption_width - 2, 0, _caption_width, 1);

          //우측 점.
          rgn_cut_right_dot  = CreateRectRgn(_caption_width - 1, 1, _caption_width, 2);

      //}

      CombineRgn(rgn_main, rgn_main, rgn_cut_rect, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_left_line, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_left_dot, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_right_line, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_right_dot, RGN_DIFF);

      SetWindowRgn(this->Handle, rgn_main, TRUE);
  //}

  //[구멍 뚫기]
  //{
      //--------------------------------
      //지정 영역에 구멍을 뚫는다.
      DeleteObject(rgn_cut_rect);
      DeleteObject(rgn_cut_left_line);
      DeleteObject(rgn_cut_left_dot);
      DeleteObject(rgn_cut_right_line);
      DeleteObject(rgn_cut_right_dot);
      //--------------------------------
  //}

  return;

}

void __fastcall Tide_popup_Form::_Border(void)
{
  //[2007.03.05.월][생성!!!]{-------------------------------------------------
  //테두리는 직접 보이는 것이고 내용에 영향을 주지 않아야 하므로 직접 그린다.
  //}-------------------------------------------------------------------------

  //[VAR]
  //{
      TRect  rect = this->ClientRect;
  //}

  //[테두리 만들기]
  //{
      _bmp_->Canvas->Pen->Color   = _ide_option->color_0;

      _bmp_->Canvas->Pen->Width   = d_popup_border_width;

      _bmp_->Canvas->Brush->Style = bsClear;

      //[제목줄] 의 높이 다음부터 처이한다.
      rect.Top = _caption_height;
      _bmp_->Canvas->Rectangle(rect);
  //}

  return;

}

void __fastcall Tide_popup_Form::_Menu(void)
{
  //[2007.03.05.월][생성!!!]{--------------------------------------------
  //[제목줄] 을 제외한 아래 영역을 대상으로 순수하게 [항목] 을 그려준다.
  //이 함수는 [마우스] 이동시 선택된 행을 표시하기 위하여 계속 호출된다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      TRect  rect;

      int    x, y, w, h;
      int    i;

      //가장 큰 문자열 폭을 기록한다.
      int    max_string_width = 0;

      int    color;
      int    color_select;
  //}

  //[바탕색]
  //{
      //테두리색의 밝은 색을 테마색으로 바탕에 칠한다.

      //칠할 색을 수정한다.
      BMP_Get_Bright_Color(_ide_option->color_0, IDE_BRIGHT_popupmenu, &color);

      _bmp_->Canvas->Brush->Color = color;

      rect = _bmp_->Canvas->ClipRect;
      rect.Top = _caption_height;
      _bmp_->Canvas->FillRect(rect);
  //}

  //[선택색 얻기]
  //{
      //칠할 색을 수정한다.
      BMP_Get_Bright_Color(_ide_option->color_0, IDE_BRIGHT_popupmenu_select, &color_select);
  //}

  //[메뉴 문자열]
  //{
      x = 0; y = _caption_height + 1;

      for(i = 0; i < _subitem.count; i++)
      {
        //[선택 유/무 구분 표시]
        //{
            if(i == _subitem.select_index)
            {
              //선택된 항목은 바탕색을 [테두리 색] 으로 바꾸고 문자색은 [음각색] 으로 지정한다.

              //[바탕색]
              //{
                  rect        = _bmp_->Canvas->ClipRect;
                  rect.Top    =  y;
                  rect.Bottom = y + _line_height;

                  _bmp_->Canvas->Brush->Color = color_select;
                  _bmp_->Canvas->FillRect(rect);
              //}

              //문자열 출력.
              FONT_Out_StyleString2(_bmp_, &_font_menu, x, y,
                                    IDE_COLOR_3, IDE_COLOR_2, true,
                                    d_FONTSTYLE_default,
                                    _subitem.str[i].c_str(),
                                    d_FONT_underline_no, false, 0, _ide_option->color_0,
                                    &w, &h);

            }
            else
            {
              FONT_Out_StyleString2(_bmp_, &_font_menu, x, y,
                                    IDE_COLOR_1, IDE_COLOR_2, true,
                                    d_FONTSTYLE_default,
                                    _subitem.str[i].c_str(),
                                    d_FONT_underline_no, false, 0, _ide_option->color_0,
                                    &w, &h);

            }
        //}

        y += _line_height;

        //[최대폭 계산]{-----------------------------------
        //가장 큰 폭을 저장한다.
        if(max_string_width < w) { max_string_width = w; }
        //}------------------------------------------------

      }
  //}

  //[테두리 만들기]
  //{
      //-----------------
      //테두리를 그린다.
      _Border();
      //-----------------
  //}

  return ;

}

void __fastcall Tide_popup_Form::_Popup(int  pX,
                                        int  pY)
{
  //[2007.03.04.일][생성!!!]{--
  //컨트롤의 모양을 만든다.
  //}--------------------------

  //[VAR]
  //{
      TRect  rect;
      TRect  rect_caption;

      int    w, h;

      int    color;
  //}

  //[모양 그리기]
  //{
      //[제목줄 처리]
      //{
          //[제목줄] 영역 구하기.
          rect_caption = this->ClientRect;
          rect_caption.Bottom = _caption_height;

          //[제목줄] 바탕 지우기.
          _bmp_->Canvas->Brush->Color = _ide_option->color_0;
          _bmp_->Canvas->FillRect(rect_caption);

          //[제목줄] 문자열 출력.
          _font_caption.margin_size = 0;
          FONT_Out_StyleString2(_bmp_, &_font_caption, 2, 3, IDE_COLOR_3, _ide_option->color_0, true,
                                d_FONTSTYLE_default,
                                _caption,
                                d_FONT_underline_no, true, 0, IDE_COLOR_1,
                                &w, &h);
      //}
  //}

  //[내부 항목 그리기]
  //{
      _Menu();
  //}

  //[view]{-------------
  //그린 것을 보여준다.
  _Draw();
  //}-------------------

  //[폼 위치 조정]
  //{
      this->Left = pX;
      this->Top  = pY;

      //폼을 보여준다.
      this->Show();

  //}

  return;

}

void __fastcall Tide_popup_Form::_Draw(void)
{
  //[2007.03.04.일][생성!!!]

  BitBlt(this->Canvas->Handle, 0, 0,
         this->Width, this->Height,
         _bmp_->Canvas->Handle, 0, 0, SRCCOPY);

  return;

}

//[EVENT]-----------------------------------------------------------------------

void __fastcall Tide_popup_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2007.03.04.일][생성!!!]{-------
  //현재 [폼 이동] 처리에 사용한다.
  //}-------------------------------

  //[VAR]
  //{
      //[2018.03.17.토][추가!!!]
      TPoint  mousePos;

  //}

  if(Button == mbLeft)
  {
    //[캡션바] 영역에서만 처리되어야 한다.
    if(((0 <= X) && (X < _caption_width)) &&
       ((0 <= Y) && (Y < _caption_height)))
    {
      //[위치 기록]
      //{
          //[2018.03.17.토][수정!!!]{-----------------------------------------------------
          //[전체화면] 을 대상으로한 위치 사용.
          //이는 <GVmos> 등 다른 Form 안에 생성되는 경우에도 동일하게 동작 시키기 위한것.
          //}-----------------------------------------------------------------------------

          //[전체화면] 을 대상으로 마우스 위치 얻기.
          GetCursorPos(&mousePos);

          //현재 <this> 위치와 [마우스] 위치 간의 거리 얻기.
          //항상 같은 거리를 유지하는 방법으로 [제목줄 이동] 을 구현하기 위한것.
          deltaLeft = mousePos.x - this->Left;
          deltaTop  = mousePos.y - this->Top;

      //}

      //caption 이 선택된 것을 알린다.
      _caption_selected = true;

      //[wine 지원]
      //{
          //[2018.03.04.일][추가!!!]{---------
          //[제목줄] 이동을 위한 타이머 켜기.
          //}---------------------------------

          if(_ide_option->wine == true)
          {
            captionMoveTimer->Enabled = true;

          }

      //}

    }
    else
    {
      _down = true;

    }

  }

  return;

}

void __fastcall Tide_popup_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[2007.03.04.일][생성!!!]{-------------------
  //마우스로 제목줄을 집어끄는 경우를 처리한다.
  //}-------------------------------------------

  //[VAR]
  //{
      int     index;

      //[2018.03.17.토][추가!!!]
      TPoint  mousePos;
      
  //}

  //[캡션바 이동]
  //{
      //[캡션바] 영역에서만 처리되어야 한다.
      if(((0 <= X) && (X < _caption_width)) &&
         ((0 <= Y) && (Y < _caption_height)) ||
         //마우스로 집어  끄는 경우 영역을 벗어난 경우도 처리 되어야 한다.
         //이는 집어 끌다가 놓치는 경우를 막기 위한 것이다.
         (Shift.Contains(ssLeft)))
      {
        if((Shift.Contains(ssLeft)) && (_caption_selected == true))
        {
          //caption 을 마우스로 집어끄는 경우 Form 을 이동 시켜야 한다.

          //[wine 지원]
          //{
              //[2018.03.04.일][추가!!!]{-------------------------------
              //<Linux:wine> 에서 구동 중이라면 여기서 처리하지 않는다.
              //<captionMoveTimerTimer()> 안에서 처리된다.
              //}-------------------------------------------------------

              if(_ide_option->wine == true)
              {
                //[Linux:wine]
                //이 경우 아래에서 사용하는 <Left>, <Top> 값은 <captionMoveTimer> 안에서
                //수정되고 있는 정확한 값으로 처리.

              }
              else
              {
                //[윈도우]

                //[위치 이동]
                //{
                    //[2018.03.17.토][수정!!!]{-----------------------------------------------------
                    //[전체화면] 을 대상으로한 위치 사용.
                    //이는 <GVmos> 등 다른 Form 안에 생성되는 경우에도 동일하게 동작 시키기 위한것.
                    //}-----------------------------------------------------------------------------

                    //[전체화면] 을 대상으로 마우스 위치 얻기.
                    GetCursorPos(&mousePos);

                    //현재 <this> 위치와 [마우스] 위치 간의 거리를
                    //항상 같은 거리로 유지하는 방법으로 [제목줄 이동] 을 구현.
                    this->Left = mousePos.x - deltaLeft;
                    this->Top  = mousePos.y - deltaTop;

                //}

              }

          //}

        }

      }
  //}

  //[항목 선태 처리]
  //{
      if((_caption_height < Y) && (Y < this->Height))
      {
        index = (Y - _caption_height) / _line_height;

        if(index != _subitem.select_index)
        {
          //선택된 항목을 기록한다.
          _subitem.select_index = index;

          //새로운 [항목] 이 선택되었다면 선택으로 표시한다.
          _Menu();
          _Draw();

        }

      }
      else
      {
        if(-1 != _subitem.select_index)
        {
          //선택된 항목을 기록한다.
          _subitem.select_index = -1;

          //새로운 [항목] 이 선택되었다면 선택으로 표시한다.
          _Menu();
          _Draw();

        }

      }

  //}

  return;

}

void __fastcall Tide_popup_Form::FormMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2007.03.04.일][생성!!!]{-------------------------------------------------
  //[팝업메뉴] 의 항목을 선택한 경우 처리를 위하여 관련 동작 함수를 호출한다.
  //}-------------------------------------------------------------------------

  //[wine 지원]
  //{
      //[2018.03.04.일][추가!!!]{---------
      //[제목줄] 이동을 위한 타이머 끄기.
      //}---------------------------------

      if(_ide_option->wine == true)
      {
        //<FormMouseUp> 에서는 무조건 타이머 정지.
        captionMoveTimer->Enabled = false;

      }

  //}

  if((_caption_height < Y) && (Y < this->Height) && (Button == mbLeft))
  {
    //[설명!!!]{---------------------------------------------------------
    //Form 의 OnClick-Event 는 동작 속도가 늦고 제대로 동작되지 않으므로
    //아예 직접 만든다. OnDown, OnUp 은 다른 것과 같이 빠르게 동작된다.
    //((_down == true) && (_in == true)) 인 경우만 발생한다.
    //}------------------------------------------------------------------

    if((_down == true) && (_in == true))
    {
      //OnClick 의 경우만 처리한다.

      //[감추기]
      //{
          //먼저 항목이 선택되었으므로 [팝업메뉴] 를 감춘다.
          //이미 선택된 itemindex 는 selectindex 에 들어 있다.
          this->Visible = false;

          //관련 [동작함수] 처리하기 전에 먼저 보이지 않게 하기 위한 것.
          Application->ProcessMessages();

      //}

      //[동작함수 호출]
      //{
          //해당 처리 함수사용.
          if(_EVENT_ItemSelect != NULL) { _EVENT_ItemSelect(); }

      //}

    }

  }

  //[해제]
  //{
      //버튼이 올라온 상태로 표시한다.
      _down             = false;

      //[제목줄] 선택을 해제한다.
      _caption_selected = false;

  //}

  return;

}

void __fastcall Tide_popup_Form::captionMoveTimerTimer(TObject *Sender)
{
  //[2018.03.04.일][생성!!!]{---------------------------
  //[Linux:wine] 에서 [제목줄:이동] 을 지원하기 위한것.
  //}---------------------------------------------------

  //[VAR]
  //{
      TPoint  mousePos;

  //}

  //[위치 수정]
  //{
      //[!]{-----------------------------------------------------------------------------
      //이전 방식은 <Linux:wine> 에서는 빠르게 이동하는 경우 [떨림] 현상이 생기고
      //이동이 끊어지는 문제가 발생.
      //이는 <Linux:wine> 에서 [제목줄] 밖으로 [화면지정자] 가 나가는 경우를 제대로
      //처리하지 못하는 문제인듯.
      //따라서, 기존처럼 [상대좌표] 를 사용하지 않고 [절대좌표] 를 사용하는 것으로 수정.
      //}--------------------------------------------------------------------------------

      //[마우스 절대 위치 얻기]
      //{
          //화면상의 [마우스] 절대 위치를 얻는다.
          GetCursorPos(&mousePos);

      //}

      //[이동]
      //{
          //[2018.03.17.토][수정!!!]{---------------------------------
          //현재 <this> 위치와 [마우스] 위치 간의 거리를
          //항상 같은 거리로 유지하는 방법으로 [제목줄 이동] 을 구현.
          //자세한 내용은 [제목줄 이동] 관련 부분 설명 연관 참고.
          //}---------------------------------------------------------
          
          this->Left = mousePos.x - deltaLeft;
          this->Top  = mousePos.y - deltaTop;

      //}

  //}

}






