
//[2012.06.06.수][중요수정!!!]{--------------------------------
//<_bmp_> 를 [화면폭] 크기로 유지하던 것에서 [그림부품] 폭으로
//수시 조정하는 것으로 변경.
//메모리 낭비를 막고 효율적으로 처리하기 위한것.
//}------------------------------------------------------------


#include <vcl.h>
#pragma hdrstop


#include "ide_menu.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tide_menu_Form *ide_menu_Form;
//---------------------------------------------------------------------------

//[BuildTool 정의]
//{
    //[2022.09.14.수][추가]{------------------------------------------------------------------
    //[맷돌-IDE] 제작도구가 <TC++2006> 인지 <ECB/CE> 인지 구분하는 값을 정의한다.
    //
    //이 <BuildToolDefine.h> 는 아래와 같이 내용이 다르므로 <TC++2006> 으로 빋드하는 묶음과
    //<ECB/CE> 로 빌드하는 묶음에서 각각 고유하게 가지고 있어야 한다.
    //
    //#define  d_BuildTool_TC2006    true   <=== <TC++2006> 으로 빌드되는 묶음안의 정의 내용.
    //#define  d_BuildTool_TC2006    false  <=== <ECB/CE> 로 빌드되는 묶음안의 정의 내용.
    //
    //[참고]----------------------------------------------------------------------------------
    //<TC++2006> : Turbo C++ 2006 Explorer
    //<ECB/CE>   : Embarcadero C++Builder/Community Edition
    //}---------------------------------------------------------------------------------------

    #include "BuildToolDefine.h"

//}

//[다른 폼]
//{
    #include  "main.h"
    #include  "file.h"
    #include  "ide_main.h"
    #include  "ide_caption.h"
    #include  "ide_submenu.h"
    #include  "ide_msgbox.h"
    #include  "editor_edit.h"
    #include  "editor_info.h"
    #include  "optionIde_DialogBox.h"

    //[2009.05.07.목][추가!!!]
    #include  "find_DialogBox.h"

    //[2009.05.10.일][추가!!!]
    #include  "editor_top.h"

    //[2009.05.26.화][추가!!!]
    #include  "c_define.h"

    //[2009.08.05.수][추가!!!]
    #include  "ide_library.h"

    //[2009.08.14.금][추가!!!]
    #include  "matdol.h"

    //[2010.02.22.월][추가!!!]
    #include  "ide_editor.h"

    //[2010.12.08.수][추가!!!]
    #include  "vmos_InstallBox.h"

    //[2010.12.14.화][추가!!!]
    #include  "osx_InstallBox.h"

    //[2011.11.15.화][추가!!!]
    #include  "gui.h"

    //[2012.02.29.수][추가!!!]
    #include  "bookMark_DialogBox.h"

    //[2022.05.24.화][추가]{--------------------
    //검증시 자주 사용되므로 고정으로 추가한다.
    #include  "msg_msg.h"
    //}-----------------------------------------

//}


__fastcall Tide_menu_Form::Tide_menu_Form(TComponent* Owner)
		: TForm(Owner)
{
  //[VAR]
  //{
      AnsiString  bmp_path;

      //[2011.11.15.화][추가!!!]
      int         color;

  //}

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

  //}

  //[초기화]
  //{
      this->Left     = d_border_width - 1;
      this->Top      = ide_caption_Form->_caption_height;
      this->Width    = main_Form->Width - (d_border_width * 2) + 1;
      this->Height   = 18;
      this->Color    = clWhite;

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

      //그림 영역 크기 설정.
      //[2012.06.06.수][수정!!!]
      //[화면폭] 사용에서 [그림부품] 크기로 변경.
      _bmp_->Width       = this->Width;//Screen->Width;
      _bmp_->Height      = this->Height;

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

  //}

  //[글꼴 설정]
  //{
      //[기본 끌꼴 등록]{------------------------------------------------
      //모든 프로그램에서 기본적으로 사용하는 [system 글꼴] 을 등록한다.
      FONTPACK_SetDefault(&_font);
      //}----------------------------------------------------------------

      //[editor debug margin]
      //{
          _font.margin_size = 0;
      //}

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

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

  //}

  //[메뉴정보 초기화]
  //{
      _MenuItem_Init();
  //}

  //[추가변수초기화]
  //{
      //[2007.03.27.화][추가!!!]
      _mouse_in = false;

  //}

  //[속성 초기화]
  //{
      //[2009.04.10.금][추가!!!]
      _enable = true;

  //}

  //[컨트롤 생성]
  //{
      //[2006.11.26.일][추가!!!]
      //[닫기 버튼]
      //{
          _close_bmpbtns          = new Tgui_bmpbutton_Form(this);
          _close_bmpbtns->Parent  = this;
          _close_bmpbtns->Visible = true;

          //[초기화]
          //{
              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\control\\close.bmp";

              _close_bmpbtns->_Top(3);
              _close_bmpbtns->_Width(12);
              _close_bmpbtns->_Left(this->Width - _close_bmpbtns->Width - 3);
              _close_bmpbtns->_Height(12);
              _close_bmpbtns->_Border(true);
              _close_bmpbtns->_Bitmap(bmp_path);
              _close_bmpbtns->_Image_Width(12);
              _close_bmpbtns->_Image_Height(12);

              //동작함수 등록.
              _close_bmpbtns->_EVENT_Click      = _EVENT_CloseButton_Click;

              //[2007.04.10.화][추가!!!]
              _close_bmpbtns->_EVENT_MouseEnter = _EVENT_CloseButton_MouseEnter;
              _close_bmpbtns->_EVENT_MouseLeave = _EVENT_CloseButton_MouseLeave;

              //[2018.05.08.화][추가!!!]
              _close_bmpbtns->_EVENT_Down       =  _EVENT_CloseButton_Down;
              _close_bmpbtns->_EVENT_Up         =  _EVENT_CloseButton_Up;

          //}
      //}

      //[최대 버튼]
      //{
          _max_bmpbtns          = new Tgui_bmpbutton_Form(this);
          _max_bmpbtns->Parent  = this;
          _max_bmpbtns->Visible = true;

          //[초기화]
          //{
              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\control\\max.bmp";

              _max_bmpbtns->_Top(3);
              _max_bmpbtns->_Width(12);
              _max_bmpbtns->_Left(_close_bmpbtns->Left - _max_bmpbtns->Width - 2);
              _max_bmpbtns->_Height(12);
              _max_bmpbtns->_Border(true);
              _max_bmpbtns->_Bitmap(bmp_path);
              _max_bmpbtns->_Image_Width(12);
              _max_bmpbtns->_Image_Height(12);

              //동작함수 등록.
              _max_bmpbtns->_EVENT_Click = _EVENT_MaxButton_Click;
          //}
      //}

      //[최소 버튼]
      //{
          _min_bmpbtns          = new Tgui_bmpbutton_Form(this);
          _min_bmpbtns->Parent  = this;
          _min_bmpbtns->Visible = true;

          //[초기화]
          //{
              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\control\\min.bmp";

              _min_bmpbtns->_Top(3);
              _min_bmpbtns->_Width(12);
              _min_bmpbtns->_Left(_max_bmpbtns->Left - _min_bmpbtns->Width - 2);
              _min_bmpbtns->_Height(12);
              _min_bmpbtns->_Border(true);
              _min_bmpbtns->_Bitmap(bmp_path);
              _min_bmpbtns->_Image_Width(12);
              _min_bmpbtns->_Image_Height(12);

              //동작함수 등록.
              _min_bmpbtns->_EVENT_Click = _EVENT_MinButton_Click;
          //}

      //}

      //[통신상태]
      //{
          //[2009.08.09.일][추가!!!]{--------------------------------------
          //[통신상태] 를 알수 있는 LED 를 <gui_radio_button> 으로 만든다.
          //[송신/수신] 두개의 LED 를 생성한다.
          //}--------------------------------------------------------------

          //[통신포트열림/닫힘]
          //{
              _comPort_RadioBtn          = new Tgui_radio_button_Form(this);
              _comPort_RadioBtn->Parent  = this;
              _comPort_RadioBtn->Visible = true;
              //사용자가 눌러도 전환되지 않도록 무효화 한다.
              //그래도, 내부적으로는 다 접근 가능하다.
              _comPort_RadioBtn->Enabled = false;

              //[초기화]
              //{
                  _comPort_RadioBtn->_Left(this->Width - (_comPort_RadioBtn->Width + 185));
                  _comPort_RadioBtn->_Top(3);

              //}

              //[라벨 설정]
              //{
                  _comPort_Label          = new Tgui_Label_Form(this);
                  _comPort_Label->Parent  = this;
                  _comPort_Label->Visible = true;

                  _comPort_Label->_Width(12*4 + 2);
                  _comPort_Label->_Height(12);
                  _comPort_Label->_Left(_comPort_RadioBtn->Left + _comPort_RadioBtn->Width);
                  _comPort_Label->_Top(_comPort_RadioBtn->Top - 1);
                  _comPort_Label->_FontXY(0,0);
                  _comPort_Label->_FontColor(_ide_option->color_0);
                  _comPort_Label->_Caption("통신포트");

              //}

          //}

          //[송신]
          //{
              _comTxd_RadioBtn          = new Tgui_radio_button_Form(this);
              _comTxd_RadioBtn->Parent  = this;
              _comTxd_RadioBtn->Visible = true;
              //사용자가 눌러도 전환되지 않도록 무효화 한다.
              //그래도, 내부적으로는 다 접근 가능하다.
              _comTxd_RadioBtn->Enabled = false;

              //[초기화]
              //{
                  _comTxd_RadioBtn->_Left(_comPort_Label->Left + _comPort_Label->Width + 4);
                  _comTxd_RadioBtn->_Top(3);

              //}

              //[라벨 설정]
              //{
                  _comTxd_Label          = new Tgui_Label_Form(this);
                  _comTxd_Label->Parent  = this;
                  _comTxd_Label->Visible = true;

                  _comTxd_Label->_Width(12*2 + 2);
                  _comTxd_Label->_Height(12);
                  _comTxd_Label->_Left(_comTxd_RadioBtn->Left + _comTxd_RadioBtn->Width);
                  _comTxd_Label->_Top(_comTxd_RadioBtn->Top - 1);
                  _comTxd_Label->_FontXY(0,0);
                  _comTxd_Label->_FontColor(_ide_option->color_0);
                  _comTxd_Label->_Caption("송신");

              //}

          //}

          //[수신]
          //{
              _comRxd_RadioBtn          = new Tgui_radio_button_Form(this);
              _comRxd_RadioBtn->Parent  = this;
              _comRxd_RadioBtn->Visible = true;
              //사용자가 눌러도 전환되지 않도록 무효화 한다.
              //그래도, 내부적으로는 다 접근 가능하다.
              _comRxd_RadioBtn->Enabled = false;

              //[초기화]
              //{
                  _comRxd_RadioBtn->_Left(_comTxd_Label->Left + _comTxd_Label->Width + 4);
                  _comRxd_RadioBtn->_Top(3);

              //}

              //[라벨 설정]
              //{
                  _comRxd_Label          = new Tgui_Label_Form(this);
                  _comRxd_Label->Parent  = this;
                  _comRxd_Label->Visible = true;

                  _comRxd_Label->_Width(12*2 + 2);
                  _comRxd_Label->_Height(12);
                  _comRxd_Label->_Left(_comRxd_RadioBtn->Left + _comRxd_RadioBtn->Width);
                  _comRxd_Label->_Top(_comRxd_RadioBtn->Top - 1);
                  _comRxd_Label->_FontXY(0,0);
                  _comRxd_Label->_FontColor(_ide_option->color_0);
                  _comRxd_Label->_Caption("수신");

              //}

          //}

      //}

      //[특수 하위항목]
      //{
          //[2011.11.15.화][추가!!!]{-----------------------------------------------
          //<GVMS(PC)> 와 <GVMX(맷돌)> 의 경우는 목록의 수가 [하위항목 제한크기] 를
          //넘을수있으므로 항목수에 무관한 <GList> 를 [하위항목] 으로 보여준다.
          //}-----------------------------------------------------------------------

          _listSubMenu         = new TGList_Form(this);

          //[모체] 는 전체 화면을 대상으로 한다.
          //[빠른목록] 이나 [풍선도움말], [귀뜸말] 등은 전체화면을 대상으로 하는것이 좋다.
          //이렇게 해야 어떤 상황에서도 정확하게 위치를 지정할수 있다.
          _listSubMenu->Parent = NULL;

          //<GList> 를 [빠른목록] 으로 사용하므로 처음에 보이지 않게 만들어야 한다.
          _listSubMenu->Visible = false;

          //[글꼴 설정 수정]
          //{
              //[!]{--------------------------------------------------------
              //<ide_submenu> 와 같은 설정으로 바꿔 같은 행높이로 바꿔준다.
              //}-----------------------------------------------------------

              _listSubMenu->_font.offset_top    = 3;
              _listSubMenu->_font.offset_bottom = 3;

              //[글꼴 최대 높이 얻기]
              //{
                  //[주의!!!]{-----------------------------------------------------------------------
                  //<GList> 에서 위처럼 [글꼴] 이 설정됀 후 딱 한번만 <_fontMaxHeight> 값을 구하므로
                  //[글꼴] 설정을 바꾼 뒤에는 반드시 다시 <_fontMaxHeight> 값을 구해줘야 한다.
                  //}--------------------------------------------------------------------------------

                  //출력여백을 반영하여 구한다-------------------v
                  FONTPACK_Get_MaxHeight(&(_listSubMenu->_font), true, &(_listSubMenu->_fontMaxHeight));

              //}

          //}

          //[2011.11.17.목][중요수정!!!]{----------------------------------
          //[메뉴] 로 사용하지 않는다.
          //이는 내부적으로 [자동처리] 되는 것이 많아 현재 상황에서 제대로
          //제어 되지 않고 있기 때문이다.
          _listSubMenu->_MenuMode(false);
          //메뉴처럼 사용되므로 항상 맨 위에 나오도록설정.
          _listSubMenu->FormStyle = fsStayOnTop;
          //}--------------------------------------------------------------

          //<ide_submenu> 와 같은 설정으로 보이게.
          _listSubMenu->_MarginX(7);

          //[폭] 은 기본 자동 크기로 설정.
          _listSubMenu->_AutoWidth(true);

          //[주의!!!]{------------------------------------------------------------------------
          //일정 항목수 까지는 자동폭으로 이를 넘으면 고정폭으로 하고 [줄이동자] 를 보인다.
          //서로 반대로 설정해야 하고, 기본적으로는 [줄이동자] 를 보이지 않는 것으로 설정.
          //항목수와 표시위치에 따라 <_SubMenu_Show()> 안에서 <_ListSubMenu_ViewSet()> 함수로
          //자동 설정된다.
          _listSubMenu->_AutoHeight(true);
          _listSubMenu->_ScrollVisible(false);
          //}---------------------------------------------------------------------------------

          _listSubMenu->_BorderColor(_ide_option->color_0);

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

          _listSubMenu->_FontMouseSelBackColor(_ide_option->color_0);
          _listSubMenu->_FontMouseSelColor(IDE_COLOR_3);

          //[항목 설정]
          //{
              //각 항목은 간단하게 [행단위] 로 구분된다.
              //처음에는 항목이 없다.
              _listSubMenu->_ItemStr("");

          //}

          //[동작함수 등록]
          //{
              _listSubMenu->_EVENT_ItemSelect = _EVENT_ItemSelect_listSubMenu;
              _listSubMenu->_EVENT_FocusSet   = _EVENT_FocusSet_listSubMenu;
              _listSubMenu->_EVENT_FocusKill  = _EVENT_FocusKill_listSubMenu;



          //}

      //}

      //[GVMS:썸네일 관련]
      //{
          //[2023.01.02.월][추가]

          _gvms_GImageBox = NULL;

          //[동작함수 등록]
          //{
              _listSubMenu->_EVENT_ItemMouseSelect = _EVENT_ItemMouseSelect_listSubMenu;

              _listSubMenu->_EVENT_MouseLeave      = _EVENT_MouseLeave_listSubMenu;

              //[2023.01.26.목][추가]
              _listSubMenu->_EVENT_MouseEnter      = _EVENT_MouseEnter_listSubMenu;

          //}

      //}

  //}

  //[특수 하위항목 얻기]
  //{
      //[2011.11.16.수][추가!!!]{-------------------------------
      //<GVMS> 와 <GVMX> 의 지정 위치에서 각각의 목록을 만든다.
      //}-------------------------------------------------------

      //[<GVMS(PC)> 항목 얻기]
      //{
          //[2011.11.16.수][추가!!!]
          _listSubMenu_GVMS_ItemList = NULL;

          //<[Ide_System_GVMS_Path]\> 경로안의 모든 [폴더이름] 을 얻는다.
          //[폴더이름] 이 곧 해당 <GVMS> 의 개별적인 항목이 된다.
          Ide_ListSubMenu_GVMS_Get_ItemList(&_listSubMenu_GVMS_ItemList);

      //}

      //[<GVMX(맷돌)> 항목 얻기]
      //{
          //[2011.11.15.화][추가!!!]
          _listSubMenu_GVMX_ItemList = NULL;

          //<[Ide_System_GVMX_Path]\> 경로안의 모든 [폴더이름] 을 얻는다.
          //[폴더이름] 이 곧 해당 <GVMX> 의 개별적인 항목이 된다.
          Ide_ListSubMenu_GVMX_Get_ItemList(&_listSubMenu_GVMX_ItemList);

      //}

  //}

  //[맷돌 핀배치도 관련]
  //{
      //[2021.03.24.수][추가]
      _gmtdlxPin_GForm     = NULL;

      _gmtdlxPin_GImageBox = NULL;

  //}

  //[컨트롤 그리기]
  //{
      //컨트롤을 그려서 모양을 만든다.
	  _Shape();

  //}

  return;

}

__fastcall Tide_menu_Form::~Tide_menu_Form(void)
{
  //[2012.04.29.일][수정!!!]{---------------
  //안전을 위하여 선언된 역순으로 삭제한다.
  //}---------------------------------------

  //[GVMS 썸네일 관련]
  //{
      //[2023.01.02.월][추가]
      if(_gvms_GImageBox != NULL) { delete _gvms_GImageBox; _gvms_GImageBox = NULL; }

  //}

  //[맷돌 핀배치도 관련]
  //{
      //[2021.03.24.수][추가]
      if(_gmtdlxPin_GForm != NULL) { delete _gmtdlxPin_GForm; _gmtdlxPin_GForm = NULL; }

  //}

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

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

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

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

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

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

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

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

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

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

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

}

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

void __fastcall Tide_menu_Form::WndProc(Messages::TMessage  &Message)
{
  //[2006.12.12.화][생성!!!]{-----------------------------------------------------
  //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_MOUSELEAVE :
    {
      //[2007.03.27.화][추가!!!]
      //[마우스] 가 이 폼을 벗어 났음을 알린다.
      //FormMouseMove() [동작함수] 에서 처리하지만 마우스가 밖으로 나가는 경우는
      //정확하게 처리하지 못하므로 여기서 확실하게 처리한다.
      if     (ide_submenu_Form->Visible == true)
      {
        //[하위항목] 이 보여져 있는 상태에서는 자동적으로 [하위항목] 에
        //[촛점] 을 만들어 주어야 한다. 이는 [하위항목] 안의 [WM_KILLFOCUS]
        //처리를 위한 것이다.
        ide_submenu_Form->SetFocus();

      }
      else if(_listSubMenu->Visible == true)
      {
        //[2011.11.15.수][추가!!!]
        _listSubMenu->SetFocus();

      }

      _mouse_in = false;

    } break;

  }

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

  return;

}

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

void __fastcall Tide_menu_Form::_Shape(void)
{
  //[2006.10.17.화][생성!!!]{--
  //컨트롤의 모양을 만든다.
  //}--------------------------

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

  //[모양 그리기]
  //{
      rect = _bmp_->Canvas->ClipRect;

      //[바탕 지우기]
      //{
          _bmp_->Canvas->Brush->Color = IDE_COLOR_2;
          _bmp_->Canvas->FillRect(rect);

      //}

      //[메뉴 항목 출력]
      //{
          _Menu();

      //}

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

  return;

}

void __fastcall Tide_menu_Form::_Width(int  pWidth)
{
  //[2012.06.06.수][생성!!!]{-----------------------------
  //폭 수정시 <_bmp_> 크기도 같이 수정하고 다시 그려준다.
  //}-----------------------------------------------------

  //[크기 조정]
  //{
      this->Width  = pWidth;
      _bmp_->Width = this->Width;

  //}

  //[다시 그리기]
  //{
      _Shape();

  //}

}

void __fastcall Tide_menu_Form::_Enable(bool  pEnable)
{
  //[2009.04.10.금][생성!!!]{-------
  //컨트롤의 [유/무효] 를 설정한다.
  //}-------------------------------

  _enable = pEnable;

  _Shape(); 

  //[내부 컨트롤]
  //{
      _min_bmpbtns->_Enable(pEnable);
      _max_bmpbtns->_Enable(pEnable);
      _close_bmpbtns->_Enable(pEnable);

  //}

  this->Enabled = _enable;

  return;

}

void __fastcall Tide_menu_Form::_ItemEnable(//항목 번호.
                                            int   pItemIndex,
                                            //유(true)/무효(false).
                                            bool  pEnable)
{
  //[2010.07.05.월][생성!!!]{-------------
  //지정 [항목] 의 [유/무효] 를 설정한다.
  //}-------------------------------------

  _menuitems[pItemIndex].enabled = pEnable;

  //다시 그려서 반영한다.
  _Shape();

  return;

}

void __fastcall Tide_menu_Form::_MenuItem_Init(void)
{
  //[2006.10.20.금][생성!!!]{-------
  //[메뉴항목] 을 전부 초기화 한다.
  //}-------------------------------

  //[VAR]
  //{
      int    i = 0;

      int    x = 0, y = 0;

      int    w = 0, h = 0;
      
      int    line_height;
  //}

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

  //[Menu 문자열]
  //{
      //--------------------------------------------------------------------------------------------------------------------
      x = 0; y = 0;

        _menuitems[d_menu_project_ix].str = " 설계묶음 ";

        //[2010.07.04.일][추가!!!]{-------------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_project_ix].enabled = true;
        //}-------------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_project_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_project_ix].rect.Left   = x;
            _menuitems[d_menu_project_ix].rect.Top    = y;
            _menuitems[d_menu_project_ix].rect.Right  = w;
            _menuitems[d_menu_project_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_project_ix].subitems.str[i++] = " 새설계묶음(예제) ";
            _menuitems[d_menu_project_ix].subitems.str[i++] = " 열기 ";

            //[2010.03.18.목][추가!!!]{----------------------------------------------
            //[열기] 시 [저장] 이 눌려서 [설계묶음] 이 덮어쓰기 되는 것을 막기위하여
            //[분리줄] 을 설정한다.
            _menuitems[d_menu_project_ix].subitems.str[i++] = " ------------ ";
            //}----------------------------------------------------------------------

            _menuitems[d_menu_project_ix].subitems.str[i++] = " 저장 ";
            _menuitems[d_menu_project_ix].subitems.str[i++] = " 다른이름으로저장 ";
            _menuitems[d_menu_project_ix].subitems.str[i++] = " 닫기 ";

            //[문서 추가 항목]
            //{
                //[2009.01.28.수][추가!!!]{------------------------------------------------------------
                //[설계문서], [함수묶음], [참고문서] 의 각 항목을 추가/삭제 할수 있는 기능을 추가한다.
                //[하위항목] 이라는 것을 알리기 위하여 [한칸] 더 들여 쓰기를 한다.
                //}------------------------------------------------------------------------------------

                //[설계문서]
                //{
                    _menuitems[d_menu_project_ix].subitems.str[i++] = " .설계문서추가 ";
                    _menuitems[d_menu_project_ix].subitems.str[i++] = " .설계문서삭제 ";

                //}

                //[함수묶음]
                //{
                    _menuitems[d_menu_project_ix].subitems.str[i++] = " .함수묶음추가 ";
                    _menuitems[d_menu_project_ix].subitems.str[i++] = " .함수묶음삭제 ";

                //}

                //[설계문서]
                //{
                    _menuitems[d_menu_project_ix].subitems.str[i++] = " .참고문서추가 ";
                    _menuitems[d_menu_project_ix].subitems.str[i++] = " .참고문서삭제 ";

                //}

            //}

            _menuitems[d_menu_project_ix].subitems.str[i++] = " 개발환경종료 ";

            _menuitems[d_menu_project_ix].subitems.count        = i;
            _menuitems[d_menu_project_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      x = w;

        _menuitems[d_menu_file_ix].str = " 문서 ";

        //[2010.07.04.일][추가!!!]{----------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_file_ix].enabled = true;
        //}----------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_file_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_file_ix].rect.Left   = x;
            _menuitems[d_menu_file_ix].rect.Top    = y;
            _menuitems[d_menu_file_ix].rect.Right  = w;
            _menuitems[d_menu_file_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_file_ix].subitems.str[i++] = " 새문서 ";
            _menuitems[d_menu_file_ix].subitems.str[i++] = " 열기 ";
            _menuitems[d_menu_file_ix].subitems.str[i++] = " 저장(Ctrl+S) ";
            _menuitems[d_menu_file_ix].subitems.str[i++] = " 다른이름으로저장 ";
            _menuitems[d_menu_file_ix].subitems.str[i++] = " 모두저장 ";

            _menuitems[d_menu_file_ix].subitems.count        = i;
            _menuitems[d_menu_file_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      x = w;

        _menuitems[d_menu_edit_ix].str = " 편집 ";

        //[2010.07.04.일][추가!!!]{----------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_edit_ix].enabled = true;
        //}----------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_edit_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_edit_ix].rect.Left   = x;
            _menuitems[d_menu_edit_ix].rect.Top    = y;
            _menuitems[d_menu_edit_ix].rect.Right  = w;
            _menuitems[d_menu_edit_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 되돌리기(Ctrl+Z) ";
            //[2018.02.17.토][수정!!!]{------------------------------------------------------
            //[Linux:wine] 에서 구동시 <Ctrl+Shift> 의 경우 자동 반복이 안된다.
            //따라서, <Ctrl+R> 을 추가했다.
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 되살리기(Ctrl+R, Ctrl+Shift) ";
            //}------------------------------------------------------------------------------
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " .복사(Ctrl+C, Shift+Ins) ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " .잘라내기(Ctrl+X, Shift+Del) ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " .붙이기(Ctrl+V) ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " .삭제(Del) ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " .모두선택(Ctrl+A) ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 찾기/교환(Ctrl+F) ";

            //[2012.03.04.일][추가!!!]
            //[책갈피] 기능을 확실하게 구분해 준다.
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " -------------------------- ";

            //[2012.02.29.수][추가!!!]
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 찾기목록/책갈피(Ctrl+B) ";

            //[2012.02.07.화][추가!!!]{----------------------------------------------------
            //수평이동 관련 기능 추가.
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " -------------------------- ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 수평이동:오른쪽(Ctrl+[->]) ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 수평이동:왼쪽(Ctrl+[<-]) ";
            //}----------------------------------------------------------------------------

            //[2018.05.06.일][추가!!!]{----------------------------------------------------
            //[탭=>공백:변환] 기능 추가.
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " -------------------------- ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 탭(Tab) => 공백(Space) 변환 ";
            //}----------------------------------------------------------------------------

            //[2021.07.24.토][추가]{-------------------------------------------------------
            //[공백:정리] 기능 추가.
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " -------------------------- ";
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 설계문서 전체 공백(Space) 정리 ";
            //[2021.07.27.화][추가]
            _menuitems[d_menu_edit_ix].subitems.str[i++] = " 현재문서 공백(Space) 정리 ";
            //}----------------------------------------------------------------------------

            _menuitems[d_menu_edit_ix].subitems.count        = i;
            _menuitems[d_menu_edit_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      //[2007.12.13.목][추가!!!]
      x = w;

        _menuitems[d_menu_option_ix].str = " 설정 ";

        //[2010.07.04.일][추가!!!]{------------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_option_ix].enabled = true;
        //}------------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_option_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_option_ix].rect.Left   = x;
            _menuitems[d_menu_option_ix].rect.Top    = y;
            _menuitems[d_menu_option_ix].rect.Right  = w;
            _menuitems[d_menu_option_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            //[VMOS통합판수정중][2010.12.06.월]{----------------------------------------------
            //새로운 VMOS 통합에 맞게 [VMOS 설치] 는 별도의 [마법사] 창으로 지원한다.
            //이는 VMOS 를 이전 보다 체계적으로 관리하기 때문에 가능한 것이다.
            //[수학 API] 는 VMOS 안에 완전히 통합되고 여러 종류로 세분화되어 API 를 지원한다.
            //}-------------------------------------------------------------------------------

            i = 0;

            _menuitems[d_menu_option_ix].subitems.str[i++] = " 통합 개발환경 설정(통신포트 관련 포함) ";

            _menuitems[d_menu_option_ix].subitems.str[i++] = " -------------------------------------- ";

            _menuitems[d_menu_option_ix].subitems.str[i++] = " 맷돌 [운영체제] 설치 ";
            _menuitems[d_menu_option_ix].subitems.str[i++] = " .맷돌 [운영체제] 정보 확인 ";
            _menuitems[d_menu_option_ix].subitems.str[i++] = " ..회로도[VMOS:AT45DB041X] ";

            _menuitems[d_menu_option_ix].subitems.str[i++] = " -------------------------------------- ";

            //[2009.11.20.금][추가!!!]
            _menuitems[d_menu_option_ix].subitems.str[i++] = " => RC 서보모터 영점 조정기(맷돌 내장 제어기용) ";

            //[2009.11.24.화][추가!!!]
            _menuitems[d_menu_option_ix].subitems.str[i++] = " => G.M.RC.BASiC 설정기 ";

            //[2009.12.05.토][추가!!!]
            _menuitems[d_menu_option_ix].subitems.str[i++] = " => G.M.RC.BASiC 자동 제작기 ";

            _menuitems[d_menu_option_ix].subitems.count        = i;
            _menuitems[d_menu_option_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      //[2010.05.08.토][추가!!!]
      x = w;

        _menuitems[d_menu_osx_ix].str = " 맷돌변환 ";

        //[2010.07.04.일][추가!!!]{---------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_osx_ix].enabled = true;
        //}---------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_osx_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_osx_ix].rect.Left   = x;
            _menuitems[d_menu_osx_ix].rect.Top    = y;
            _menuitems[d_menu_osx_ix].rect.Right  = w;
            _menuitems[d_menu_osx_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_osx_ix].subitems.str[i++] = " 맷돌 변환 [운영체제:OSX] 설치 ";
            _menuitems[d_menu_osx_ix].subitems.str[i++] = " .참고자료(맷돌28호:G.MTDL.A.RC28) ";

            _menuitems[d_menu_osx_ix].subitems.count        = i;
            _menuitems[d_menu_osx_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      //[2010.07.04.일][추가!!!]
      x = w;

        _menuitems[d_menu_gvm_ix].str = " 가상기계 ";

        //[2010.07.04.일][추가!!!]{---------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_gvm_ix].enabled = true;
        //}---------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_gvm_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_gvm_ix].rect.Left   = x;
            _menuitems[d_menu_gvm_ix].rect.Top    = y;
            _menuitems[d_menu_gvm_ix].rect.Right  = w;
            _menuitems[d_menu_gvm_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " PC 구동 [가상기계(*.gvms)] 설치 ";
            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " 맷돌(G.MTDL.X) 계열 구동 [가상기계(*.gvmx)] 설치 ";

            //[2010.12.28.화][추가!!!]
            //{개발환경으로 돌아가기} 는 중요항목이므로 위의 항목과 섞여 있지 않도록 분리줄로 구분한다.
            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " ----------------------------------------------------- ";

            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " 개발환경으로 돌아가기 ";

            //[2010.07.08.목][추가!!!]
            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " ----------------------------------------------------- ";
            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " 기계닉스 제공 PC 구동 [가상기계(*.gvms)] 모음 ";
            _menuitems[d_menu_gvm_ix].subitems.str[i++] = " 기계닉스 제공 맷돌(G.MTDL.X) 계열 구동 [가상기계(*.gvmx)] 모음 ";

            _menuitems[d_menu_gvm_ix].subitems.count        = i;
            _menuitems[d_menu_gvm_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      //[2011.11.14.월][추가!!!]
      x = w;

        _menuitems[d_menu_gvms_ix].str = " GVMS(PC) ";

        //처음에는 항상 유효하다.
        _menuitems[d_menu_gvms_ix].enabled = true;

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_gvms_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_gvms_ix].rect.Left   = x;
            _menuitems[d_menu_gvms_ix].rect.Top    = y;
            _menuitems[d_menu_gvms_ix].rect.Right  = w;
            _menuitems[d_menu_gvms_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

        //}

      //--------------------------------------------------------------------------------------------------------------------
      //[2011.11.14.월][추가!!!]
      x = w;

        _menuitems[d_menu_gvmx_ix].str = " GVMX(맷돌) ";

        //처음에는 항상 유효하다.
        _menuitems[d_menu_gvmx_ix].enabled = true;

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_gvmx_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_gvmx_ix].rect.Left   = x;
            _menuitems[d_menu_gvmx_ix].rect.Top    = y;
            _menuitems[d_menu_gvmx_ix].rect.Right  = w;
            _menuitems[d_menu_gvmx_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

        //}

      //--------------------------------------------------------------------------------------------------------------------
      //[2010.12.17.금][수정!!!]{-----------------------------
      //[전광판] 은 너무 자원소모가 많으므로 지원하지 않는다.
      //}-----------------------------------------------------
      /*
      x = w;

        _menuitems[d_menu_dotmatrix_ix].str = " 전광판 ";

        //[2010.07.04.일][추가!!!]{---------------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_dotmatrix_ix].enabled = true;
        //}---------------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_dotmatrix_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_dotmatrix_ix].rect.Left   = x;
            _menuitems[d_menu_dotmatrix_ix].rect.Top    = y;
            _menuitems[d_menu_dotmatrix_ix].rect.Right  = w;
            _menuitems[d_menu_dotmatrix_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_dotmatrix_ix].subitems.str[i++] = " 보이기/감추기 ";
            _menuitems[d_menu_dotmatrix_ix].subitems.str[i++] = " 문자열 회전 켜기/끄기 ";
            _menuitems[d_menu_dotmatrix_ix].subitems.str[i++] = " 문자열 설정 ";
            _menuitems[d_menu_dotmatrix_ix].subitems.str[i++] = " 문자색 설정 ";

            _menuitems[d_menu_dotmatrix_ix].subitems.count        = i;
            _menuitems[d_menu_dotmatrix_ix].subitems.select_index = -1;

        //}
      */
      //--------------------------------------------------------------------------------------------------------------------
      x = w;

        _menuitems[d_menu_help_ix].str = " 도움말 ";

        //[2010.07.04.일][추가!!!]{----------------
        //처음에는 항상 유효하다.
        _menuitems[d_menu_help_ix].enabled = true;
        //}----------------------------------------

      FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_help_ix].str.c_str(), &w, &h);

        //[rect]
        //{
            _menuitems[d_menu_help_ix].rect.Left   = x;
            _menuitems[d_menu_help_ix].rect.Top    = y;
            _menuitems[d_menu_help_ix].rect.Right  = w;
            _menuitems[d_menu_help_ix].rect.Bottom = line_height - 1;

        //}

        //[하위항목]
        //{
            i = 0;

            _menuitems[d_menu_help_ix].subitems.str[i++] = " 도움말(개발환경) ";

            //[2012.09.27.목][추가!!!]{-----------------------------------------------------
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 도움말(맷돌C/한국형C/한글C) ";
            //}-----------------------------------------------------------------------------

            _menuitems[d_menu_help_ix].subitems.str[i++] = " .판올림 확인(BSD:허가 설계 공개) ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌A(G.MTDL.A) ";

            //[2011.05.13.금][추가!!!]
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌A1(G.MTDL.A1) ";

            //[2010.11.10.수][추가!!!]
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌B(G.MTDL.B) ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌A/B 연습 기판(G.MTDL.T.A) ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 표준 통신 케이블(G.CO.RS232.XV) ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌A/B 예제문서 ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌28호(G.MTDL.A.RC28) ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " ---------------------------- ";

            //[맷돌 핀 배치도][2021.03.29.월][추가]{****************************************
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌A(G.MTDL.A) 핀 배치도 ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌A1(G.MTDL.A1) 핀 배치도 ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 맷돌B(G.MTDL.B) 핀 배치도 ";
            //}*****************************************************************************

            _menuitems[d_menu_help_ix].subitems.str[i++] = " ---------------------------- ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " 수정내용 ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 읽어보기 ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 권리내용(Licence) ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " ---------------------------- ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " Linux Wine 으로 구동 방법 ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " ---------------------------- ";

            _menuitems[d_menu_help_ix].subitems.str[i++] = " 기계닉스 첨단 대장간 ";
            _menuitems[d_menu_help_ix].subitems.str[i++] = " 제작정보 ";
            //_menuitems[d_menu_help_ix].subitems.str[i++] = " .나의다짐 ";

            _menuitems[d_menu_help_ix].subitems.count        = i;
            _menuitems[d_menu_help_ix].subitems.select_index = -1;

        //}
      //--------------------------------------------------------------------------------------------------------------------
      #if  d_Menu_GIGYENICS
      //{
          //[개발자] 전용판의 경우만 활성화 한다.

          x = w;

          _menuitems[d_menu_gigyenics_ix].str = " 기계닉스 ";

          //[2010.07.04.일][추가!!!]{---------------------
          //처음에는 항상 유효하다.
          _menuitems[d_menu_gigyenics_ix].enabled = true;
          //}---------------------------------------------

          FONT_Out_String(_bmp_, &_font, x, y, IDE_COLOR_1, IDE_COLOR_2, false, _menuitems[d_menu_gigyenics_ix].str.c_str(), &w, &h);

          //[rect]
          //{
              _menuitems[d_menu_gigyenics_ix].rect.Left   = x;
              _menuitems[d_menu_gigyenics_ix].rect.Top    = y;
              _menuitems[d_menu_gigyenics_ix].rect.Right  = w;
              _menuitems[d_menu_gigyenics_ix].rect.Bottom = line_height - 1;

          //}

          //[하위항목]
          //{
              i = 0;

              _menuitems[d_menu_gigyenics_ix].subitems.str[i++] = " 함수0 ";
              _menuitems[d_menu_gigyenics_ix].subitems.str[i++] = " 함수1 ";

              _menuitems[d_menu_gigyenics_ix].subitems.count        = i;
              _menuitems[d_menu_gigyenics_ix].subitems.select_index = -1;

          //}

      //}
      #endif
      //--------------------------------------------------------------------------------------------------------------------

  //}

  //[메뉴 크기 기록]
  //{
      #if   d_Menu_GIGYENICS
      //{
          _menu_width  = _menuitems[d_menu_gigyenics_ix].rect.Right + 1;
          _menu_height = line_height;

      //}

      #elif !d_Menu_GIGYENICS
      //{
          _menu_width  = _menuitems[d_menu_help_ix].rect.Right + 1;
          _menu_height = line_height;

      //}
      #endif

  //}

  //[기타정보 초기화]
  //{
      //처음에는 선택도
      _menuitem_select_index = -1;

  //}

  return;

}

void __fastcall Tide_menu_Form::_Menu(void)
{
  //[2006.10.18.수][생성!!!]{---------------------------
  //[메뉴] 항목을 표시한다.
  //선택된 항목은 [선택] 표시로 출력한다.
  //
  //[2009.04.10.금][수정!!!]----------------------------
  //<_enable> 속성에 따라 다른 처리를 해 주어야 한다.
  //
  //[2010.07.05.월][수정!!!]----------------------------
  //[항목] 의 [유/무효] 를 구분하여 문자 색을 처리한다.
  //}---------------------------------------------------

  //[VAR]
  //{
      int   i, w, h;

      int   color;

  //}

  //[문자색 구하기]
  //{
      //[2009.04.10.금][추가!!!]{-----------------------
      //<_enable> 속성에 따라 문자색을 다르게 적용한다.
      //}-----------------------------------------------

      if(_enable == true) { color = IDE_COLOR_1; }
      else                { color = IDE_COLOR_5; }

  //}

  //[Menu 만들기]
  //{
      //초기화된 정보대로 다시 출력하면된다.
      for(i = 0; i < d_menu_count; i++)
      {
        //[20101.07.05.월][수정!!!]{-----------------------
        //[항목] 의 [유/무효] 인 경우를 구분하여 처리한다.
        //}------------------------------------------------

        if(_menuitems[i].enabled == true)
        {
          //항목이 [유효] 인경우.
          if(i == _menuitem_select_index)
          {
            //[선택된 항목]
            FONT_Out_StyleString2(_bmp_, &_font, _menuitems[i].rect.Left, _menuitems[i].rect.Top,
                                  IDE_COLOR_3, _ide_option->color_0, false,
                                  d_FONTSTYLE_default,
                                  _menuitems[i].str.c_str(),
                                  d_FONT_underline_no, false, -1, IDE_COLOR_1,
                                  &w, &h);

          }
          else
          {
            //[선택되지 않은 항목]
            FONT_Out_StyleString2(_bmp_, &_font, _menuitems[i].rect.Left, _menuitems[i].rect.Top,
                                  //[2009.04.10.금][수정!!!]
                                  color, IDE_COLOR_2, false,
                                  d_FONTSTYLE_default,
                                  _menuitems[i].str.c_str(),
                                  d_FONT_underline_no, false, -2, IDE_COLOR_1,
                                  &w, &h);

          }

        }
        else
        {
          //항목이 [무효] 인경우는 문자색을 [비활성색] 으로 처리한다.
          FONT_Out_StyleString2(_bmp_, &_font, _menuitems[i].rect.Left, _menuitems[i].rect.Top,
                                IDE_COLOR_5, IDE_COLOR_2, false,
                                d_FONTSTYLE_default,
                                _menuitems[i].str.c_str(),
                                d_FONT_underline_no, false, -2, IDE_COLOR_1,
                                &w, &h);

        }

      }

  //}

  return;

}

void __fastcall Tide_menu_Form::_Menu2(void)
{
  //[2006.10.20.금][생성!!!]{------------------------------
  //순수하게 [메뉴] 만 다시 그리고 [보이기] 까지 수행한다.
  //}------------------------------------------------------

  _Menu();

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

  return;

}

void __fastcall Tide_menu_Form::_Resize(void)
{
  //[2006.10.17.화][생성!!!]{--
  //컨트롤의 모양을 만든다.
  //
  //[2012.06.06.수][수정!!!]---
  //}--------------------------

  //[크기조정]
  //{
      //[!]{----------------------------------------------------------------
      //IDE Form 에 맞게 크기를 조정한다.
      //this->Width = main_Form->Width - (d_border_width * 2) + 1;
      //
      //[2012.06.06.수][수정!!!]--------------------------------------------
      //<_bmp_> 가 [화면폭] 으로 고정이 아니라 [그림부품] 크기로 변경되도록
      //수정하였으므로 새로 만든 크기 조정 함수를 사용.
      //내부적으로 <_bmp_> 크기도 자동 조정된다.
      //}-------------------------------------------------------------------

      _Width(main_Form->Width - (d_border_width * 2) + 1);

  //}

  //[내부 컨트롤 크기 조정]
  //{
      if(_close_bmpbtns != NULL)
      {
        _close_bmpbtns->_Left(this->Width - _close_bmpbtns->Width - 3);

      }

      if(_max_bmpbtns != NULL)
      {
        _max_bmpbtns->_Left(_close_bmpbtns->Left - _max_bmpbtns->Width - 2);

      }

      if(_min_bmpbtns != NULL)
      {
        _min_bmpbtns->_Left(_max_bmpbtns->Left - _min_bmpbtns->Width - 2);

      }

      //[2009.08.09.일][추가!!1]
      if(_comPort_RadioBtn != NULL)
      {
        _comPort_RadioBtn->_Left(this->Width - (_comPort_RadioBtn->Width + 185));
        _comPort_RadioBtn->_Top(3);

        _comPort_Label->_Left(_comPort_RadioBtn->Left + _comPort_RadioBtn->Width);
        _comPort_Label->_Top(_comPort_RadioBtn->Top - 1);

      }

      if(_comTxd_RadioBtn != NULL)
      {
        _comTxd_RadioBtn->_Left(_comPort_Label->Left + _comPort_Label->Width + 4);
        _comTxd_RadioBtn->_Top(3);

        _comTxd_Label->_Left(_comTxd_RadioBtn->Left + _comTxd_RadioBtn->Width);
        _comTxd_Label->_Top(_comTxd_RadioBtn->Top - 1);

      }

      if(_comRxd_RadioBtn != NULL)
      {
        _comRxd_RadioBtn->_Left(_comTxd_Label->Left + _comTxd_Label->Width + 4);
        _comRxd_RadioBtn->_Top(3);

        _comRxd_Label->_Left(_comRxd_RadioBtn->Left + _comRxd_RadioBtn->Width);
        _comRxd_Label->_Top(_comRxd_RadioBtn->Top - 1);

      }

  //}

  return;

}

void __fastcall Tide_menu_Form::_SelectNo(void)
{
  //[2006.10.22.일][생성]{---------------------
  //모든 항목이 선택되지 않은 것으로 표시한다.
  //}------------------------------------------

  //선택된 [항목] 이 없으므로 -1.
  _menuitem_select_index = -1;

  //[하위메뉴] 를 감춘다.
  _SubMenu_HideAll();

  //모든 [항목] 을 다시 출력한다.
  _Menu();

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

  return;

}

bool __fastcall Tide_menu_Form::_SubMenu_Show(int  pITEMindex)
{
  //[2006.10.18.수][생성!!!]{-------------------------------------------
  //지정 [항목] 바로 아래에 [하위항목] 을 붙여서 보여준다.
  //
  //[2010.07.04.일][수정!!!]--------------------------------------------
  //해당 [항목] 이 [무효] 인 경우는 [하위항목] 을 보여주지 않는다.
  //[가상기계<*.gvms>] 만 불러서 실행하는 기능을 추가하면서 다른 항목은
  //동작되지 않게 만들기 위하여 이 기능을  추가한다.
  //
  //[2011.11.14.월][수정!!!]--------------------------------------------
  //하위 항목이 하나도 없는 경우는 보이지 않는다.
  //}-------------------------------------------------------------------

  //[항목 유/무효 검사]
  //{
      //[2010.07.04.일][추가!!!]{------------------------
      //현재 [항목] 이 [무효] 인 경우는 처리하지 않는다.
      //}------------------------------------------------

      if(_menuitems[pITEMindex].enabled != true) return(false);

  //}

  //[일반/특수 구분처리]
  //{
      switch(pITEMindex)
      {
        case d_menu_project_ix :
        case d_menu_file_ix :
        case d_menu_edit_ix :
        case d_menu_option_ix :
        case d_menu_osx_ix :
        case d_menu_gvm_ix :
        //[전광판]{------------------
        //case d_menu_dotmatrix_ix :
        //}--------------------------
        case d_menu_help_ix :
        #if  d_Menu_GIGYENICS
        case d_menu_gigyenics_ix :
        #endif
        {

          //[<_listSubMenu> 감추기]
          //{
              //[2011.11.17.목][추가!!!]{--------------------------------------
              //서로 다른 [하위항목] 이므로 <_listSubMenu> 이 보인다면 감춘다.
              //}--------------------------------------------------------------

              if(_listSubMenu->Visible == true) { _listSubMenu->Visible = false; }

          //}

          //[하위항목 출력]
          //{
              ide_submenu_Form->_subitem = _menuitems[pITEMindex].subitems;

              //다시 그려준다.
              ide_submenu_Form->_Shape();

          //}

          //[항목이 존재하나?]
          //{
              //[2011.11.14.월][추가!!!]{----------------------------
              //하위 항목이 하나도 없는 경우는 보여주지 않아야 한다.
              //}----------------------------------------------------

              if(ide_submenu_Form->_subitem.count == 0)
              {
                //[하위항목해제]
                //{
                    //[주의!!!]{----------------------------------------
                    //[하위항목] 이 촛점을 잃었을 때의 처리를 해 주어야
                    //이전에 선택된 다른 항목이 해제된다.
                    //}-------------------------------------------------

                    _SubMenu_HideAll();
                    _Menu2();

                //}

                //반드시 <false> 로 처리하여 해당 동작이 없도록 한다.
                return(false);

              }

          //}

          //[하위항목 표시위치 지정]
          //{
              ide_submenu_Form->Left = main_Form->Left + this->Left + _menuitems[pITEMindex].rect.Left;
              ide_submenu_Form->Top  = main_Form->Top  + this->Top  + _menu_height;

              ide_submenu_Form->Visible = true;

          //}

          return(true);

        } break;

        case d_menu_gvms_ix : //"ide\gigyenics\gvm\gvms" 안의 <*.gvms> 의 즉시 실행 가능한 목록.
        {
          //[2011.11.15.수][추가!!!]

          //[감추기]
          //{
              //[2011.11.17.목][추가!!!]{---------------------------------------
              //보이는 상태에서 내용이 바뀌는 과정이 보이지 않도록 먼저 감춘다.
              //}---------------------------------------------------------------

              _listSubMenu->Visible = false;

          //}

          //[선택항목 지우기]
          //{
              //[2011.11.17.목][추가!!!]{-------------------------------
              //<GList> 를 [하위항목] 으로 사용므로, 기존에 선택된 것이
              //표시되지 않도록 지워준다.
              //이는 <ide_submenu> 와 차이나 보이지 않게 하기 위한 것.
              //}-------------------------------------------------------

              _listSubMenu->_ItemSelect(-1);

              //[2011.11.18.금][추가!!!]
              //줄이동자가 보이는 경우는 반드시 위치를 가장 처음으로 돌려 놓는다.
              if(_listSubMenu->_scrollV->Visible == true)
              {
                _listSubMenu->_scrollV->_Position(0);

              }

          //}

          //[<ide_submenu_Form> 감추기]
          //{
              //다른 종류의 [하위항목] 이 보인다면 감춘다.
              if(ide_submenu_Form->Visible == true) { ide_submenu_Form->Visible = false; }

          //}

          //[항목 설정]
          //{
              //각 항목은 간단하게 [행단위] 로 구분된다.
              if(_listSubMenu_GVMS_ItemList == NULL)
              {
                //이 경우는 [항목] 이 하나도 없는 경우.
                _listSubMenu->_ItemStr("");

              }
              else
              {
                _listSubMenu->_ItemStr(_listSubMenu_GVMS_ItemList);

              }

          //}

          //[항목이 존재하나?]
          //{
              //[2011.11.16.수][추가!!!]{-----------------------
              //하위 항목이 하나도 없는 경우는 보여주지 않는다.
              //}-----------------------------------------------

              if(_listSubMenu->_ItemCount() == 0)
              {
                //[하위항목해제]
                //{
                    //[주의!!!]{----------------------------------------
                    //[하위항목] 이 촛점을 잃었을 때의 처리를 해 주어야
                    //이전에 선택된 다른 항목이 해제된다.
                    //}-------------------------------------------------

                    _SubMenu_HideAll();
                    _Menu2();

                //}

                //반드시 <false> 로 처리하여 해당 동작이 없도록 한다.
                return(false);

              }

          //}

          //[선택 항목 기록]
          //{
              //[!]{----------------------------------------------------------------------------------
              //지금 선택된 [주항목 번호] 를 [하위 항목] 에 기록해 준다.
              //이는 [하위 항목] 에서 [선택이벤트] 가 발생할때는 이미 [하위항목] 이 사라지고
              //[주항목] 의 선택이 해제된 뒤이기 때문에 먼저 선택된 것을 보관해 놓아야 하기 때문이다.
              //}-------------------------------------------------------------------------------------

              _listSubMenu->_menuItemIndex = pITEMindex;

          //}

          //[크기조정]
          //{
              //[2011.11.16.수][추가!!!]{----------------------------------------------
              //화면에서 보이지 않는 항목이 없도록 [크기/줄이동자 설정] 을 재조정한다.
              //}----------------------------------------------------------------------

              _ListSubMenu_ViewSet(main_Form->Top  + this->Top  + _menu_height);

          //}

          //[하위항목 표시위치 지정]
          //{
              _listSubMenu->Left = main_Form->Left + this->Left + _menuitems[pITEMindex].rect.Left;
              _listSubMenu->Top  = main_Form->Top  + this->Top  + _menu_height;

              _listSubMenu->Visible = true;

          //}

          return(true);

        } break;

        case d_menu_gvmx_ix : //"ide\gigyenics\gvm\gvms" 안의 <*.gvms> 의 즉시 설치 가능한 목록.
        {
          //[2011.11.15.수][추가!!!]

          //[감추기]
          //{
              //[2011.11.17.목][추가!!!]{---------------------------------------
              //보이는 상태에서 내용이 바뀌는 과정이 보이지 않도록 먼저 감춘다.
              //}---------------------------------------------------------------

              _listSubMenu->Visible = false;

          //}

          //[선택항목 지우기]
          //{
              //[2011.11.17.목][추가!!!]{-------------------------------
              //<GList> 를 [하위항목] 으로 사용므로, 기존에 선택된 것이
              //표시되지 않도록 지워준다.
              //이는 <ide_submenu> 와 차이나 보이지 않게 하기 위한 것.
              //}-------------------------------------------------------

              _listSubMenu->_ItemSelect(-1);

              //[2011.11.18.금][추가!!!]
              //줄이동자가 보이는 경우는 반드시 위치를 가장 처음으로 돌려 놓는다.
              if(_listSubMenu->_scrollV->Visible == true)
              {
                _listSubMenu->_scrollV->_Position(0);

              }

          //}

          //[<ide_submenu_Form> 감추기]
          //{
              //다른 종류의 [하위항목] 이 보인다면 감춘다.
              if(ide_submenu_Form->Visible == true) { ide_submenu_Form->Visible = false; }

          //}

          //[항목 설정]
          //{
              //각 항목은 간단하게 [행단위] 로 구분된다.
              if(_listSubMenu_GVMX_ItemList == NULL)
              {
                //이 경우는 [항목] 이 하나도 없는 경우.
                _listSubMenu->_ItemStr("");

              }
              else
              {
                _listSubMenu->_ItemStr(_listSubMenu_GVMX_ItemList);

              }

          //}

          //[항목이 존재하나?]
          //{
              //[2011.11.16.수][추가!!!]{-----------------------
              //하위 항목이 하나도 없는 경우는 보여주지 않는다.
              //}-----------------------------------------------

              if(_listSubMenu->_ItemCount() == 0)
              {
                //[하위항목해제]
                //{
                    //[주의!!!]{----------------------------------------
                    //[하위항목] 이 촛점을 잃었을 때의 처리를 해 주어야
                    //이전에 선택된 다른 항목이 해제된다.
                    //}-------------------------------------------------

                    _SubMenu_HideAll();
                    _Menu2();

                //}

                //반드시 <false> 로 처리하여 해당 동작이 없도록 한다.
                return(false);

              }

          //}

          //[선택 항목 기록]
          //{
              //[!]{----------------------------------------------------------------------------------
              //지금 선택된 [주항목 번호] 를 [하위 항목] 에 기록해 준다.
              //이는 [하위 항목] 에서 [선택이벤트] 가 발생할때는 이미 [하위항목] 아 사라지고
              //[주항목] 의 선택이 해제된 뒤이기 때문에 먼저 선택된 것을 보관해 놓아야 하기 때문이다.
              //}-------------------------------------------------------------------------------------

              _listSubMenu->_menuItemIndex = pITEMindex;

          //}

          //[크기조정]
          //{
              //[2011.11.16.수][추가!!!]{----------------------------------------------
              //화면에서 보이지 않는 항목이 없도록 [크기/줄이동자 설정] 을 재조정한다.
              //}----------------------------------------------------------------------

              _ListSubMenu_ViewSet(main_Form->Top  + this->Top  + _menu_height);

          //}

          //[하위항목 표시위치 지정]
          //{
              _listSubMenu->Visible = false;

              _listSubMenu->Left = main_Form->Left + this->Left + _menuitems[pITEMindex].rect.Left;
              _listSubMenu->Top  = main_Form->Top  + this->Top  + _menu_height;

              _listSubMenu->Visible = true;

          //}

          return(true);

        } break;

      }

  //}

  return(true);

}

void __fastcall Tide_menu_Form::_SubMenu_Hide(void)
{
  //[2006.10.18.수][생성!!!]{--
  //[하위항목] 을 감춘다.
  //}--------------------------

  //선택된 [항목] 을 해제시킨다..
  _menuitem_select_index = -1;

  ide_submenu_Form->Visible = false;
  
}

void __fastcall Tide_menu_Form::_SubMenu_HideAll(void)
{
  //[2011.11.15.화][생성!!!]{--------------------------
  //[일반 하위항목] 과 [특수 하위항목] 을 모두 감춘다.
  //}--------------------------------------------------

  //선택된 [항목] 을 해제시킨다..
  _menuitem_select_index = -1;

  //[2011.11.17.목][중요수정!!!]{-----------------------------------------------
  //<_listSubMenu->_menuItemIndex> 은 항상 선택된 항목을 저장하고 있어야 하므로
  //절대 여기서 초기화 하면 안된다.
  //여기서 <-1> 로 초기화 하는 경우는 <_EVENT_ItemSelect_listSubMenu()> 에서
  //어떤 것이 선택됐는지 확인할수 없게 된다.
  //_listSubMenu->_menuItemIndex = -1;
  //}---------------------------------------------------------------------------

  //일반 하위항목 감추기.
  ide_submenu_Form->Visible = false;

  //특수 하위항목 감추기.
  _listSubMenu->Visible = false;

}

void __fastcall Tide_menu_Form::_Draw(void)
{
  //[2006.10.31.화][생성!!!]

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

}

//------------------------------------------------------------------------------
//[LED 함수]--------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tide_menu_Form::_Led_Comport(bool  pTonFoff)
{
  //[2009.08.09.일][생성!!!]{------
  //[통신포트] LED 를 켜거나 끈다.
  //}------------------------------

  _comPort_RadioBtn->_Checked(pTonFoff);

}

void __fastcall Tide_menu_Form::_Led_Txd(bool  pTonFoff)
{
  //[2009.08.09.일][생성!!!]{---
  //[송신] LED 를 켜거나 끈다.
  //}---------------------------

  _comTxd_RadioBtn->_Checked(pTonFoff);

  if(pTonFoff == true)
  {
    //이 경우는 해당 [타이머] 도 같이 켜준다.
    comTxd_Timer->Enabled = true;

  }

}

void __fastcall Tide_menu_Form::_Led_Rxd(bool  pTonFoff)
{
  //[2009.08.09.일][생성!!!]{---
  //[수신] LED 를 켜거나 끈다.
  //}---------------------------

  _comRxd_RadioBtn->_Checked(pTonFoff);

  if(pTonFoff == true)
  {
    //이 경우는 해당 [타이머] 도 같이 켜준다.
    comRxd_Timer->Enabled = true;

  }

}

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

void __fastcall Tide_menu_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2006.10.18.수][생성!!!]{--------------------------------------------------
  //해당 [메뉴 항목] 을 반전 시킨다.
  //Y 값은 항상 [메뉴] 안에 있는 것이므로 X 로 어떤 [항목] 인지 알아내야 한다.
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      int    i;
      int    x = 0, y = 0;
      int    w, h;
  //}

  if(((0 <= X) && (X < _menu_width)) && ((0 <= Y) && (Y < _menu_height)) && (Shift.Contains(ssLeft)))
  {
    for(i = 0; i < d_menu_count; i++)
    {
      if((_menuitems[i].rect.Left <= X) && (X <= _menuitems[i].rect.Right))
      {
        if(i == _menuitem_select_index)
        {
          //[선택 해제]

          //[하위메뉴] 를 감춘다.
          _SubMenu_HideAll();//_SubMenu_Hide();

          //선택된 [항목] 이 없으므로 -1.
          //[2011.11.17.목][수정!!!]
          //위의 <_SubMenu_HideAll()> 에서 자동 처리되므로 주석으로 처리.
          //_menuitem_select_index = -1;

          //모든 [항목] 을 다시 출력한다.
          _Menu();

        }
        else
        {
          //[선택]

          //일단 보이지 않게 만든다.
          //_SubMenu_Hide();

          //[2010.07.04.일][수정!!!]{-----------------------------
          //_SubMenu_Show() 가 처리된 경우만 처리되도록 수정한다.
          //이는 [항목:무효] 인 경우를 처리하기 위한 것이다.
          //}-----------------------------------------------------

          if(_SubMenu_Show(i) == true)
          {
            //선택된 [항목] 을 기록한다.
            _menuitem_select_index = i;

            //[2011.11.17.목][추가!!!]{-----------------------------------
            //<_SubMenu_Show()> 안에서 처리하므로 여기서 처리하지 않는다.
            //_listSubMenu->_menuItemIndex = i;
            //}-----------------------------------------------------------

            //모든 [항목] 을 다시 출력한다.
            _Menu();

          }

        }

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

      }

    }

  }

}

void __fastcall Tide_menu_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[2007.03.27.화][생성!!!]{---------------------------------------------------
  //순수하게 문자열이 있는 위치에 [마우스] 가 위치한 경우는 이 상태를 알려준다.
  //이는 직접 [주항목] 을 눌러서 [하위항목] 을 보여주는 경우, [하위항목] 자체의
  //[촛점] 을 잃은 경우 [하위항목] 해제 와 동작이 겹져서 해제되지 않는 경우를
  //막기 위한 것이다.
  //}---------------------------------------------------------------------------

  if((0 <= X) && (X <= _menu_width))
  {
    //[항목] 문자열이 있는 영역에 [마우스] 가 있다는 것을 알린다.
    _mouse_in = true;

  }
  else
  {
    if(ide_submenu_Form->Visible == true)
    {
      //[하위항목] 이 보여져 있는 상태에서는 자동적으로 [하위항목] 에
      //[촛점] 을 만들어 주어야 한다. 이는 [하위항목] 안의 [WM_KILLFOCUS]
      //처리를 위한 것이다.
      ide_submenu_Form->SetFocus();

    }
    else if(_listSubMenu->Visible == true)
    {
      //[2011.11.15.수][추가!!!]
      _listSubMenu->SetFocus();

    }

    _mouse_in = false;

  }

}

//[FUNCTION]--------------------------------------------------------------------

void __fastcall Tide_menu_Form::_EVENT_MinButton_Click(void)
{
  //[2006.11.26.일][생성!!!]{--
  //폼을 최소화 한다.
  //}--------------------------

  //[주의!!!]{------------------------------------------------------------
  //main_Form->WindowState = wsMinimized; 로 처리하는 경우는
  //작업 표시줄로 가지않고 그냥 최소 크기로 모니터 한쪽에 남겨지게 되므로
  //반드시 아래와 같이 처리해야 작업 표시줄로 가게 된다.
  //}---------------------------------------------------------------------

  Application->Minimize();

  return;

}

void __fastcall Tide_menu_Form::_EVENT_MaxButton_Click(void)
{
  //[2006.11.26.일][생성!!!]{-------------
  //폼을 최대화/기본크기로 전환한다.
  //
  //[2018.02.26.월][수정!!!]--------------
  //[최대/기본:전환] 을 전용 함수로 대체.
  //}-------------------------------------

  switch(main_Form->WindowState)
  {
    case wsMaximized :
    {
      IDE_Size_Normal();

    } break;

    case wsNormal :
    {
      IDE_Size_Max();

    } break;

  }

  return;

}

void __fastcall Tide_menu_Form::_EVENT_CloseButton_Click(void)
{
  //[2006.11.26.일][생성!!!]{--
  //폼을 종료한다.
  //}--------------------------

  IDE_Close();

  return;

}

void __fastcall Tide_menu_Form::_EVENT_CloseButton_Down(void)
{
  //[2018.05.08.화][생성!!!]

  //[풍선도움말:감추기]
  //{
      //[2018.05.09.수][추가!!!]{----------------------------------------------------
      //[문서변경후 미저장] 을 알려주는 [풍선도움말] 을 먼저 감춘다.
      //이는 <IDE_Close()> 에서 [대화상자] 가 나오는 경우 [풍선도움말] 이 깜박이는
      //문제가 발생하여 보기 좋지 않기 때문에 [대화상자] 가 나오기 전에 감춰주는 것.
      //}----------------------------------------------------------------------------
      
      editor_top_Form->_EVENT_CloseButton_MouseLeave();

  //}
  
}

void __fastcall Tide_menu_Form::_EVENT_CloseButton_Up(void)
{
  //[2018.05.08.화][생성!!!]

  // ...

}

void __fastcall  Tide_menu_Form::_EVENT_CloseButton_MouseEnter(void)
{
  //[2007.04.10.화][생성!!!]{-----------------------------------------------------
  //이 버튼에 [표시지정자] 가 들어온 경우는 닫을 의사가 있는 것으로 일단 간주하고
  //현재문서가 수정된 경우는 사용자에게 "저장" 을 환기 시키기 위하여
  //[편집기] 아래의 정보란의 [저장/수정] 부분을 점멸해 준다.
  //
  //[2018.05.08.화][수정!!!]------------------------------------------------------
  //}-----------------------------------------------------------------------------

  //[수정확인]
  //{
      //지금 [문서목록] 모든 문서가 [저장] 인 경우는 처리하지 않는다(수정 상태인 문서가 있는 경우만 처리).
      if(editor_edit_Form->_TEXTINFO_IsChangedOne() == false) return;
  //}

  //[점멸]
  //{
      //editor_info_Form->_Blink_Timer(true);

      //[2018.05.08.화][수정!!!]{------------------------------
      //이전에 빠뜨린 모든 기능이 구현된 함수를 호출하여 사용.
      //}------------------------------------------------------
      
      editor_top_Form->_EVENT_CloseButton_MouseEnter();

  //}

  return;

}

void __fastcall  Tide_menu_Form::_EVENT_CloseButton_MouseLeave(void)
{
  //[2007.04.10.화][생성!!!]{-----------------------------------------------------
  //이 버튼에 [표시지정자] 가 나가는 경우는 닫을 의사가 없는 것으로 일단 간주하고
  //[편집기] 아래의 정보란의 [저장/수정] 부분의 점멸을 해제시킨다.
  //
  //[2018.05.08.화][수정!!!]------------------------------------------------------
  //}-----------------------------------------------------------------------------

  //[수정확인]
  //{
      //지금 [문서목록] 에서 아직 저장되지 않은 문서가 한개라도 있는 경우는 처리하지 않아야 한다.
      if(editor_edit_Form->_TEXTINFO_IsChangedOne() == false) return;

  //}

  //[점멸]
  //{
      //editor_info_Form->_Blink_Timer(false);

      //[2018.05.08.화][수정!!!]{------------------------------
      //이전에 빠뜨린 모든 기능이 구현된 함수를 호출하여 사용.
      //}------------------------------------------------------

      editor_top_Form->_EVENT_CloseButton_MouseLeave();

  //}

  return;

}

void __fastcall Tide_menu_Form::_EVENT_Select_SubMenuItem(int  pMENUindex,
                                                          int  pSUBMENUindex)
{
  //[2006.12.09.토][생성!!!]{-----------
  //선택된 항목에 따른 처리를 수행한다.
  //
  //[2018.03.16.금][추가!!!]------------
  //[2018.05.06.일][추가!!!]------------
  //}-----------------------------------

  //[VAR]
  //{
      AnsiString   filePath;

      //[2009.08.05.수][추가!!!]
      //[제조일자] 를 읽어 들인다.
      unsigned long long  buildDate;

      char                tempStr[OPT_lineStrSize] = {""};
      char                hexStr[OPT_wordStrSize] = {""};

      //[2009.12.22.화][추가!!!]{---------------------
      //[운영체제 설치 정보] 를 확인하기 위한 것이다.
      DTU8  sysOsX;
      bool  mathApiInstall;
      //}---------------------------------------------

      //[2012.02.28.화][추가!!!]
      class BookMark_DialogBox  *_bookMark_DialogBox;

  //}

  switch(pMENUindex)
  {
    case d_menu_project_ix :
    {
      //하위 항목에 따른 처리를 수행한다.
      switch(pSUBMENUindex)
      {
        case 0 : //새프로젝트.
        {
          IDE_Project_New(true, true);

        } break;

        case 1 : //열기.
        {
          //[2009.01.27.화][추가!!!]
          IDE_Project_Open("");

        } break;

        case 2 : //분리줄.
        {
          //[2010.03.18.목][추가!!!]{--------------------------------------------------
          //[열기] 시에 잘못 되어 자꾸 [저장] 을 누르게 되므로 아예 분리줄을 넣어준다.
          //}--------------------------------------------------------------------------

        } break;

        case 3 : //저장.
        {
          IDE_Project_Save(false);

        } break;

        case 4 : //다른이름으로저장.
        {
          IDE_Project_SaveAs();

        } break;

        case 5 : //프로젝트 닫기.
        {
          IDE_Project_Close();

        } break;

        case 6 : //설계문서추가.
        {
          IDE_Project_Add_C(NULL);

        } break;

        case 7 : //설계문서삭제.
        {
          IDE_Project_Delete_C();

        } break;

        case 8 : //함수묶음추가.
        {
          IDE_Project_Add_Glib(NULL);

        } break;

        case 9 : //함수묶음삭제.
        {
          IDE_Project_Delete_Glib();

        } break;

        case 10 : //참고문서추가.
        {
          IDE_Project_Add_Etc(NULL);

        } break;

        case 11 : //참고문서삭제.
        {
          IDE_Project_Delete_Etc();

        } break;

        case 12 : //통합개발환경 종료.
        {
          IDE_Close();

        } break;

      }

    } break;

    case d_menu_file_ix :
    {
      //하위 항목에 따른 처리를 수행한다.
      switch(pSUBMENUindex)
      {
        case 0 : //새문서.
        {
          IDE_File_New();

        } break;

        case 1 : //열기.
        {
          IDE_File_Open();

        } break;

        case 2 : //저장.
        {
          IDE_File_Save();

        } break;

        case 3 : //다른이름으로저장.
        {
          IDE_File_SaveAs();

        } break;

        case 4 : //모두저장.
        {
          IDE_File_SaveAll();

        } break;

      }

    } break;

    case d_menu_edit_ix :
    {
      //[2007.04.10.화][추가!!!]

      //[현재 열려있는 문서가 있나?]
      //{
          //[2012.02.08.수][중요추가!!!]{--------------------------------------
          //현재 열려있는 문서가 하나도 없는 경우는 처리하지 않아야 한다.
          //
          //이렇게 하지 않으면 열린문서가 없는 경우 [편집처리] 등이 수행되어
          //[입력지정자] 가 나와 보기 좋지 않고 [입력지정자] 자국이 남게 된다.
          //}------------------------------------------------------------------

          if(pSUBMENUindex == 16)
          {
            //[2021.07.27.화][추가]{----------------------------------------------------------
            //<16> 번은 [Tree:설계문서] 전체를 대상으로 하므로 열려있는 문서와 무관하게 처리.
            //[Tree:설계문서] 안의 문서 유/무는 해당 함수에서 처리.
            //}-------------------------------------------------------------------------------

          }
          else if(editor_edit_Form->_textinfo_count <= 0)
          {
            //다른 하위 항목은 편집중인 문서가 없으면 의미가 없으므로 여기서 종료.
            break;

          }

      //}

      switch(pSUBMENUindex)
      {
        case 0 : //되돌리기.
        {
          //[2009.05.04.월][추가!!!]

          //[읽기전용인가?]{---------------------------------
          //[읽기전용] 인 경우는 수정하지 않는다.
          if(editor_edit_Form->_readOnly == true) break;
          if(editor_edit_Form->_readOnlyAll == true) return;
          //}------------------------------------------------

          //[문서수정]{---------------------------------
          //문서가 수정됬음을 기록한다.
          editor_edit_Form->_EDIT_Changed(false, true);
          //}-------------------------------------------

          //[2009.06.03.수][수정!!!]{----------------------------------
          //[묶음주석] 처리를 위하여 _EDIT_Changed() 와 순서를 바꾼다.
          //}----------------------------------------------------------

          //[<되살림> 하기]
          //{
              //[2009.05.04.월]
              //현 위치에서 [되살림] 을 한개 수행한다.
              editor_edit_Form->History_UnDo();

          //}

        } break;

        case 1 : //되살리기.
        {
          //[2009.05.04.월][추가!!!]

          //[읽기전용인가?]{---------------------------------
          //[읽기전용] 인 경우는 수정하지 않는다.
          if(editor_edit_Form->_readOnly == true) break;
          if(editor_edit_Form->_readOnlyAll == true) return;
          //}------------------------------------------------

          //[문서수정]{---------------------------------
          //문서가 수정됬음을 기록한다.
          editor_edit_Form->_EDIT_Changed(false, true);
          //}-------------------------------------------

          //[2009.06.03.수][수정!!!]{----------------------------------
          //[묶음주석] 처리를 위하여 _EDIT_Changed() 와 순서를 바꾼다.
          //}----------------------------------------------------------

          //[<되살림> 하기]
          //{
              //[2009.05.04.월]
              //현 위치에서 [되살림] 을 한개 수행한다.
              editor_edit_Form->History_ReDo();

          //}

        } break;

        case 2 : //복사.
        {
          editor_edit_Form->SetFocus();

          editor_edit_Form->_CLIPBOARD_Copy();

        } break;

        case 3 : //잘라내기.
        {
          //[읽기전용인가?][2009.03.31.화][추가!!!]{---------
          //[읽기전용] 인 경우는 수정하지 않는다.
          if(editor_edit_Form->_readOnly == true) break;
          if(editor_edit_Form->_readOnlyAll == true) return;
          //}------------------------------------------------

          editor_edit_Form->SetFocus();

          //문서가 수정됬음을 기록한다.
          editor_edit_Form->_EDIT_Changed(false, true);

          //[2009.06.03.수][수정!!!]{----------------------------------
          //[묶음주석] 처리를 위하여 _EDIT_Changed() 와 순서를 바꾼다.
          //}----------------------------------------------------------

          editor_edit_Form->_CLIPBOARD_Cut();

        } break;

        case 4 : //붙이기.
        {
          //[읽기전용인가?][2009.03.31.화][추가!!!]{---------
          //[읽기전용] 인 경우는 수정하지 않는다.
          if(editor_edit_Form->_readOnly == true) break;
          if(editor_edit_Form->_readOnlyAll == true) return;
          //}------------------------------------------------

          editor_edit_Form->SetFocus();

          //문서가 수정됬음을 기록한다.
          editor_edit_Form->_EDIT_Changed(false, true);

          //[2009.06.03.수][수정!!!]{----------------------------------
          //[묶음주석] 처리를 위하여 _EDIT_Changed() 와 순서를 바꾼다.
          //}----------------------------------------------------------

          editor_edit_Form->_CLIPBOARD_Paste();

        } break;

        case 5 : //삭제.
        {
          //[읽기전용인가?][2009.03.31.화][추가!!!]{---------
          //[읽기전용] 인 경우는 수정하지 않는다.
          if(editor_edit_Form->_readOnly == true) break;
          if(editor_edit_Form->_readOnlyAll == true) return;
          //}------------------------------------------------

          editor_edit_Form->SetFocus();

          //문서가 수정됬음을 기록한다.
          editor_edit_Form->_EDIT_Changed(false, true);

          //[2009.06.03.수][수정!!!]{----------------------------------
          //[묶음주석] 처리를 위하여 _EDIT_Changed() 와 순서를 바꾼다.
          //}----------------------------------------------------------

          editor_edit_Form->_EDIT_SelectDelete();

        } break;

        case 6 : //모두선택.
        {
          editor_edit_Form->SetFocus();

          editor_edit_Form->_EDIT_SelectAll();

        } break;

        case 7 : //찾기/교환 대화상자.
        {
          //[2009.05.08.금][추가!!!]
          find_DialogBox_Form->_Show();

        } break;

        //[2012.03.04.일][추가!!!]
        case 8 : //분리줄.
        {
        } break;

        case 9 : //찾기목록/책갈피.
        {
          //[2012.02.29.수][추가!!!]{---
          //[찾기목록/책갈피] 동작.
          //}---------------------------

          //[책갈피:대화상자] 위치 얻기.
          BookMark_DialogBox_GetPtr(&_bookMark_DialogBox);

          //[책갈피] 에 등록.
          if(_bookMark_DialogBox->_enable == true)
          {
            _bookMark_DialogBox->_BookMark();

          }

        }

        case 10 : //분리줄.
        {
        } break;

        case 11 : //수평이동:오른쪽(Ctrl+[->]).
        {
          //[2012.02.07.화][추가!!!]
          Ide_Menu_MoveRL_Right();

        } break;

        case 12 : //수평이동:왼쪽(Ctrl+[<-])
        {
          //[2012.02.07.화][추가!!!]
          Ide_Menu_MoveRL_Left();

        } break;

        //[2018.05.06.일][추가!!!]
        case 13 : //분리줄.
        {
        } break;

        //[2018.05.06.일][추가!!!]
        case 14 :
        {
          Ide_Menu_TabToSpaceX();

        } break;

        case 15 : //분리줄.
        {
          //[2021.07.27.화][추가]

        } break;

        case 16 :
        {
          //[2021.07.27.화][추가]
          Ide_Menu_SpaceArrangeAll();

        } break;

        case 17 :
        {
          //[2021.07.24.토][추가]
          Ide_Menu_SpaceArrange();

        } break;

      }

    } break;

    case d_menu_option_ix :
    {
      //[VMOS통합판수정중][2010.12.06.월]{---------------------------------
      //VMOS 가 완전히 [수학 API] 를 통합하고 다양한 VMOS 를 지원하게 되어
      //VMOS 설치를 위한 전용 대화상자를 지원하므로 전부다 수정한다.
      //}------------------------------------------------------------------

      //하위 항목에 따른 처리를 수행한다.
      switch(pSUBMENUindex)
      {
        case 0 : //설정.
        {
          //[2007.12.14.금][추가!!!]{----------------
          //통합개발환경 설정용 대화상자를 보여준다.
          //}----------------------------------------

          //[wine 지원]
          //{
              //[2018.02.21.수][수정!!!]{-----------------------------------------------                      
              //[Linux:wine] 에서는 <ShowModal()> 이 X11 자체의 문제로 지원되지 않는다.
              //즉, <Modal> 속성이 아예 없다. 따라서, 비슷하게 대체한다.
              //결과적으로 [윈도우:Modal] 과 동일하게 동작한다.
              //}-----------------------------------------------------------------------

              if(_ide_option->wine == true)
              {
                //[!]{------------------------------------------------------------------
                //[Linux:wine] 인 경우.
                //<ShowModal()> 기능을 다른 방법으로 구현.
                //
                //[2018.03.06.화][수정!!!]----------------------------------------------
                //(1)-(3) 까지 [유사모달] 관련 기능을 정지.
                //[Linux:wine] 에서는 [설정대화상자] 가 [모달] 일 필요는 없다.
                //[Linux:wine] 에서 [유사모달] 은 <_MsgBox...()> 만 갖도록 하기 위한것.
                //<IDE_Wine_Modal()> 함수 동작을 간단하기 위함이다.
                //}---------------------------------------------------------------------

                //현재 모든 [IDE:그림부품] 은 <main_Form> 을 [모체] 로 하므로
                //<main_Form> 을 정지 시키는 것으로 <Modal> 속성을 흉내낼수 있다.
                //(1)main_Form->Enabled = false;
                //{
                    //[Linux:wine] 에서는 기본적으로 <Show()> 만으로도 해당 [폼] 이
                    //뒤로 사라져 가려지는 현상은 없어지지만 <BringToFront()> 추가.
                    optionIde_DialogBox_Form->Show();
                    optionIde_DialogBox_Form->BringToFront();

                    //전체 진행을 여기서 막고 <ShowModal()> 을 흉내낸 [대화상자] 가 닫힐 때까지 대기.
                    //단, 외부 메세지는 계속 처리할수 있도록 해야 [대화상자] 가 동작한다.
                    //(2)while(optionIde_DialogBox_Form->Visible) { Application->ProcessMessages(); }

                //}
                //(3)main_Form->Enabled = true;

              }
              else
              {
                //[윈도우] 인 경우.
                optionIde_DialogBox_Form->ShowModal();

              }

          //}

        } break;

        case 1 :
        {
          //분리줄.

        } break;

        case 2 : //맷돌 [운영체제] 설치.
        {
          //[VMOS통합판수정중][2010.12.06.월]{---------------------------------------------------------
          //[수학 API] 가 VMOS 에 모두 통합되므로 이제 설치는 [VMOS 설치 대화상자] 에서 처리하게 된다.
          //여기서는 단지 [VMOS 설치 대화상자] 를 열어서 보여주는 것만 처리하면 된다.
          //}------------------------------------------------------------------------------------------

          //[2010.12.08.수][추가!!!]{--------------
          //[운영체제] 설치용 대화상자를 보여준다.
          //}--------------------------------------

          vmos_InstallBox_Form->_Show();
          
        } break;

        case 3 : //맷돌 [운영체제] 정보 확인.
        {
          //[2009.08.05.수][추가!!!]{-------------------------------------------
          //실제 [맷돌모듈] 을 대상으로 [제조날짜] 를 읽어 들여 표시해준다.
          //더불어 BaseVM/VMOS 중 어떤 것이 구동중인지도 알려준다.
          //
          //[2010.12.13.월][수정!!!]--------------------------------------------
          //VMOS 에 [수학 API] 등이 포함되면서 보다 VMOS 계열이 다양해 졌으므로
          //완전히 다른 방법으로 [운영체제] 를 구분할수 있도록 전부 수정한다.
          //}-------------------------------------------------------------------

          if(Ide_Ctrl_OS_Check() != true) break;

        } break;

        case 4 : //.회로도[VMOS:AT45DB041X].
        {
          //[확장자 연결로 열기]
          //{
              //[2009.12.24.목][추가!!!]{--------------------------------------------
              //어떤 문서이든 해당 확장자에 연결된 프로그램으로 자동적으로 열어준다.
              //이것은 직접 해당 문서를 마우스로 더블클릭하여 열어 주는 것과 같다.
              //}--------------------------------------------------------------------

			  ShellExecute(0, "open", ((AnsiString)Ide_System_OS_AT45DB041B_Circuit_Path).c_str(), "", "", SW_NORMAL);

          //}

        } break;

        case 5 :
        {
          //분리줄.

        } break; //<---[2011.01.11.화][추가!!!] { 빼먹었던것 수정한다. }

        //-------------------------------------
        //[맷돌-통합개발환경] 자체 특수기능등.
        //-------------------------------------

        case 6 :
        {
          //[2009.11.20.금][추가!!!]{------------
          //[영점조정] 설정관련 처리를 수행한다.
          //}------------------------------------

          Ide_System_Mtdl_RcServoZero();

        } break;

        case 7 :
        {
          //[2009.11.24.화][추가!!!]{--------------
          //G.M.RC.BASiC 설정관련 처리를 수행한다.
          //}--------------------------------------

          Ide_System_Mtdl_GmRcBasic();

        } break;

        case 8 :
        {
          //[2009.12.05.토][추가!!!]{---------
          //G.M.RC.BASiC 을 자동 제작해 준다.
          //}---------------------------------

          Ide_System_Mtdl_GmRcBasic_Make();

        } break;

      }

    } break;

    case d_menu_osx_ix :
    {
      //하위 항목에 따른 처리를 수행한다.
      switch(pSUBMENUindex)
      {

        case 0 : //맷돌 변환 [운영체제:OSX] 설치.
        {
          //[2010.12.14.화][추가!!!]{--------------
          //[운영체제] 설치용 대화상자를 보여준다.
          //}--------------------------------------

          osx_InstallBox_Form->_Show();

        } break;

        case 1 : //G.MTDL.A.RC28 참고자료.
        {
          //[해당 제품란을 열기]
          //{
              //[20101.07.10.토][수정!!!]{------------------------------------------
              //<*.pdf> 를 열지 않고 언제나 최신 정보가 있는 제품페이지를 열어준다.
              //}-------------------------------------------------------------------

              //문서를 사용하지 않고 직접 주소로 이동한다.
              filePath = "http://www.gigyenics.co.kr/mtdl/osx/g.mtdl.a.rc28/item.html";

              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

      }

    } break;

    case d_menu_gvm_ix :
    {
      //[2010.07.04.일][추가!!!]{-------------------------------------
      //상당히 포괄적인 처리를 수행하므로 전용함수를 만들어 처리한다.
      //}-------------------------------------------------------------

      switch(pSUBMENUindex)
      {
        case 0 : //PC 구동 가상기계(*.gvms) 설치.
        {
          //[2011.11.10.목][수정!!!]
          //설치만 하고 [실행] 하지 않는다.
          //--------------------------v
          Ide_Menu_GVMS_Install(NULL, false);

        } break;

        case 1 : //맷돌(G.MTDL.A) 구동 가상기계(*.gvmx) 설치.
        {
          Ide_Menu_GVMX_Install();

        } break;

        case 2 : //분리줄.
        {
          //[2010.12.28.화][추가!!!]
          //아무처리도 하지 않는다.

        } break;

        case 3 : //개발환경으로 돌아가기.
        {
          Ide_Menu_GVM_Ide();

        } break;

        case 4 : //분리줄.
        {
          //[2010.07.08.목][추가!!!]
          //아무처리도 하지 않는다.

        } break;

        case 5 : //기계닉스 제공 PC 구동 [가상기계(*.gvms)] 모음.
        {
          //[2010.07.08.목][추가!!!]
          Ide_Menu_Gigyenics_GVMS();

        } break;

        case 6 : //기계닉스 제공 맷돌(G.MTDL.A) 구동 [가상기계(*.gvmx)] 모음.
        {
          //[2010.07.08.목][추가!!!]
          Ide_Menu_Gigyenics_GVMX();

        } break;

      }

    } break;

    //[2010.12.17.금][수정!!!]{-----------------------------
    //[전광판] 은 너무 자원소모가 많으므로 지원하지 않는다.
    //}-----------------------------------------------------

    /*
    case d_menu_dotmatrix_ix :
    {
      //[2010.02.22.월][추가!!!]{------
      //[전광판] 관련 설정을 수행한다.
      //}------------------------------

      //하위 항목에 따른 처리를 수행한다.
      switch(pSUBMENUindex)
      {
        case 0 : //전광판 보이기/감추기.
        {
          ide_editor_Form->_GDotMatrix_Use();

        } break;

        case 1 : //전광판 문자열 회전 켜기/끄기.
        {
          ide_editor_Form->_GDotMatrix_Rotate();

        } break;

        case 2 : //전광판 문자열 설정.
        {
          ide_editor_Form->_GDotMatrix_Str();

        } break;

        case 3 : //전광판 문자색 설정.
        {
          ide_editor_Form->_GDotMatrix_Color();

        } break;

      }

    } break;
    */

    case d_menu_help_ix :
    {
      //하위 항목에 따른 처리를 수행한다.
      switch(pSUBMENUindex)
      {
        case 0 : //도움말.
        {
          //해당 *.html 문서를 보여준다.

          //filePath = ExtractFilePath(Application->ExeName) + "help\\help.html";


          //[2009.05.11.월][수정!!!]{--------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/korea-c/item.html";
          //}--------------------------------------------------------


          //[2009.01.28.수][수정!!!]
          //{
              //[!]{----------------------------------------------------------------------
              //프로그램을 지정하지 않고 문서 자체를 사용하여 직접 연다.
              //이는 마우스로 해당 문서를 실행하는 것과 완전히 같으며 굳이 IE 를 사용하지
              //않아도 자동으로 *.html 을 열 기본 프로그램을 사용하여 열어 준다.
              //}-------------------------------------------------------------------------

              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        //[2012.09.27.목][추가!!!]
        case 1 : //도움말(맷돌C/한국형C/한글C).
        {
          //[!]{--------------------------------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/korea-c/manual/manual.html";
          //}-----------------------------------------------------------------

          //[문서열기]
          //{
              //[!]{----------------------------------------------------------------------
              //프로그램을 지정하지 않고 문서 자체를 사용하여 직접 연다.
              //이는 마우스로 해당 문서를 실행하는 것과 완전히 같으며 굳이 IE 를 사용하지
              //않아도 자동으로 *.html 을 열 기본 프로그램을 사용하여 열어 준다.
              //}-------------------------------------------------------------------------

              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 2 : //새로운것 나왔나?
        {
          //[2010.04.20.금][추가!!!]

          //<한국형-C> 의 자료실을 보여준다.

          //[!]{------------------------------------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/korea-c/download/download.html";
          //}---------------------------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 3 : //맷돌A(G.MTDL.A)
        {
          //[2009.10.03.토][추가!!!]

          //맷돌A(G.MTDL.A) 제품 페이지를 보여준다.

          //[2009.05.11.월][수정!!!]{-----------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/mtdl/item.html";
          //}-----------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 4 : //맷돌A1(G.MTDL.A1)
        {
          //[2011.05.13.금][추가!!!]

          //맷돌A1(G.MTDL.A1) 제품 페이지를 보여준다.

          //[2009.05.11.월][수정!!!]{-------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/mtdl/mtdl-a1/item.html";
          //}-------------------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        //[2010.11.10.수][추가!!!]{---------------------------------------------------
        //맷돌B 의 개발로 이전과 달리 맷돌A/B 를 구분하고 맷돌B 간련 내용을 추가한다.
        //더불어, 새로 제작된 [맷돌 연습 기판(G.MTDL.T.A)] 관련 사항도 추가한다.
        //}---------------------------------------------------------------------------

        case 5 : //맷돌B(G.MTDL.B)
        {
          //[2010.11.10.수][추가!!!]

          //맷돌B(G.MTDL.B) 제품 페이지를 보여준다.

          //[!]{---------------------------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/mtdl/mtdl-b/item.html";
          //}------------------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 6 : //맷돌A/B 연습 기판(G.MTDL.T.A)
        {
          //[2010.11.10.수][추가!!!]

          //맷돌A/B 전용 연습 기판(G.MTDL.T.A) 제품 페이지를 보여준다.

          //[!]{-------------------------------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/mtdl/tk/gmtdlta/item.html";
          //}----------------------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 7 : //표준 통신 케이블(G.CO.RS232.XV)
        {
          //[2010.11.10.수][추가!!!]

          //기계닉스 표준 통신 케이블 G.CO.RS232.XV 제품 페이지를 보여준다.

          //[!]{----------------------------------------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/controller/g.co.rs232.5v/item.html";
          //}-------------------------------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 8 : //맷돌(G.MTDL.A) 예제문서
        {
          //[2010.01.16.토][추가!!!]

          //맷돌(G.MTDL.A) 기본 예제 페이지를 보여준다.

          //[2010.01.16.토][수정!!!]{--------------------------------------------------
          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/mtdl/example/ex-basic/ex-basic.html";
          //}--------------------------------------------------------------------------

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        case 9 : //맷돌28호(G.MTDL.A.RC28)
        {
          //[2010.07.10.토][추가!!!]

          //맷돌28호(G.MTDL.A.RC28) 제품란을 보여준다.

          //문서를 사용하지 않고 직접 주소로 이동한다.
          filePath = "http://www.gigyenics.co.kr/mtdl/osx/g.mtdl.a.rc28/item.html";

          //[열기]
          //{
              ShellExecute(0,
                           "open",
                           filePath.c_str(),
                           "", //이 부분은 반드시 단순 문자열 이어야 한다.
                           "",
                           SW_NORMAL);

          //}

        } break;

        //[2010.12.17.금][추가!!!]
        case 10 : //분리줄.
        {

        } break;


        //[2021.03.29.월][추가]{************************************************************************************
        case 11 : //맷돌 A 핀 배치도.
        {
          GmtdlxPin_View(((AnsiString)(ExtractFilePath(Application->ExeName) + "gigyenics\\etc\\gmtdl-x-pin-table\\G.MTDL.A.jpg")).c_str());

        } break;

        //[2021.03.29.월][추가]
        case 12 : //맷돌 A1 핀 배치도.
        {
		  GmtdlxPin_View(((AnsiString)(ExtractFilePath(Application->ExeName) + "gigyenics\\etc\\gmtdl-x-pin-table\\G.MTDL.A1.jpg")).c_str());

        } break;

        //[2021.03.29.월][추가]
        case 13 : //맷돌 B 핀 배치도.
        {
		  GmtdlxPin_View(((AnsiString)(ExtractFilePath(Application->ExeName) + "gigyenics\\etc\\gmtdl-x-pin-table\\G.MTDL.B.jpg")).c_str());

        } break;

        //[2021.03.29.월][추가]
        case 14 : //분리줄.
        {

        } break;
        //}*********************************************************************************************************

        
        //[2010.12.17.금][수정!!!]{-------------------
        //[수정내용] 와 [읽어보기] 를 서로 바꿔었다.
        //}-------------------------------------------

        case 15 : //수정내용.
        {
          //[2009.05.10.일][추가!!!]{------------
          //<\txt\수정내용.txt> 문서를 열어준다.
          //}------------------------------------

          filePath = ExtractFilePath(Application->ExeName) + "txt\\수정내용.gtxt";

          //문서를 열어준다.
          editor_top_Form->_List_Add(filePath);

          //[2022.07.15.금][추가]{------------
          //[읽기전용] 설정.
          editor_edit_Form->_readOnly = true;
          //}---------------------------------

        } break;

        case 16 : //읽어보기.
        {
          //[2009.05.10.일][추가!!!]{------------
          //<\txt\읽어보기.txt> 문서를 열어준다.
          //}------------------------------------

          filePath = ExtractFilePath(Application->ExeName) + "txt\\읽어보기.gtxt";

          //문서를 열어준다.
          editor_top_Form->_List_Add(filePath);

          //[2022.07.15.금][추가]{------------
          //[읽기전용] 설정.
          editor_edit_Form->_readOnly = true;
          //}---------------------------------

        } break;

        case 17 : //권리내용.
        {
          ide_msgbox_Form->_MsgBox(d_MSGBOX_default,
                                   " [맷돌-통합개발환경] 및 기계닉스(GIGYENICS)의 모든 기술은 \r\n"
                                   " <Open Source> 및 <BSD Licence> 를 원칙으로 합니다. ");

        } break;

        //[2018.03.16.금][추가!!!]
        case 18 : //분리줄.
        {

        } break;

        //[2018.03.16.금][추가!!!]
        case 19 : //Linux Wine 으로 구동 방법 설명.
        {
          //[!]{-------------------------------------------------------------------
          //해당 <*.html> 문서 링크.
          //
          //[2018.03.21.수][수정!!!]-----------------------------------------------
          //<*.html> 뿐만 아니라 해당 <*.gtxt> 도 같이 열어 준다.
          //<Linux:Wine> 에서 <ShellExecute()> 로 <*.html> 을 열려면 <html.reg> 로
          //설정이 돼 있어야 하기 때문. 즉, 최소한 기본 설정을 할수 있는 방법은
          //<wine.gtxt> 로 만들어 같이 열어 준다.
          //}----------------------------------------------------------------------

          //[<wine.gtxt> 열기]
          //{
              filePath = ExtractFilePath(Application->ExeName) + "linux\\wine\\wine.gtxt";

              //문서를 열어준다.
              editor_top_Form->_List_Add(filePath);

              //[2022.07.15.금][추가]{------------
              //[읽기전용] 설정.
              editor_edit_Form->_readOnly = true;
              //}---------------------------------

          //}

          //[웹 문서도 열지 확인]
          //{
              //[2018.03.27.화][추가!!!]{------------------------------------------
              //웹문서가 열리는데 시간이 많이 걸릴수 있으므로 선택사항으로 넣는다.
              //}------------------------------------------------------------------
              
              if(ide_msgbox_Form->_MsgBox_Ok_Cancle(d_MSGBOX_default,
                                                    "해당 웹문서도 같이 열겠습니까?") != true) break;

          //}

          //[<wine.html> 열기]
          //{
              filePath = "http://www.gigyenics.co.kr/korea-c/linux/wine/wine.html";

              //[문서 열기]
              //{
                  //[!]{----------------------------------------------------------------------
                  //프로그램을 지정하지 않고 문서 자체를 사용하여 직접 연다.
                  //이는 마우스로 해당 문서를 실행하는 것과 완전히 같으며 굳이 IE 를 사용하지
                  //않아도 자동으로 *.html 을 열 기본 프로그램을 사용하여 열어 준다.
                  //}-------------------------------------------------------------------------

                  ShellExecute(0,
                               "open",
                               filePath.c_str(),
                               "", //이 부분은 반드시 단순 문자열 이어야 한다.
                               "",
                               SW_NORMAL);

              //}

          //}

        } break;

        //[2010.12.17.금][추가!!!]
        case 20 : //분리줄.
        {

        } break;

        case 21 : //기계닉스.
        {
          ide_msgbox_Form->_MsgBox2(d_MSGBOX_default,
                                    false,
                                    " 기계닉스 첨단 대장간 \r\n\r\n"
                                    " 주소 : http://www.gigyenics.co.kr \r\n\r\n"
									" 편지 : gigyein@gmail.com \r\n");

		} break;
		case 22 : //제작정보.      
		{
		  //[2007.12.20.목][추가!!!]{-----
          //개발자와 제작일자를 알려준다.
		  //}-----------------------------



//main_Form->GIGYENICS_GUI_Test();
//return;


		  ide_msgbox_Form->_MsgBox(d_MSGBOX_default,
								   " 설계 : 김 갑철(金甲哲) \r\n"

                                   //[2022.09.14.수][수정]{***********************************************
                                   //<TC++2006> 과 <ECB/CE> 의 설계문서를 동일한 것을 사용하나
                                   //제작도구를 구분하기 위하여 각각 별도로 가지는 <BuildToolDefine.h> 에
                                   //정의된 <d_BuildTool_Name> 를 사용하여 [도구이름] 을 출력한다.
                                   " 도구 : " d_BuildTool_Name " \r\n"
                                   //}********************************************************************

								   " 부품 : 기계닉스 그림부품 \r\n"

                                   //[2009.05.26.화][추가!!!]{------------------------------
								   //배포본 관리를 쉽게 하기 위하여 날짜는 정의로 대체한다.
                                   //[2022.09.14.수][수정]----------------------------------
                                   //[날짜] 를 가장 마지막 위치로 수정.
								   Opt_Ide_BuildDate
								   //}------------------------------------------------------
                                   );

        } break;

/*
		case 23 : //나의 다짐.
        {
          ide_msgbox_Form->_edit_Edit->_EDIT_TextOut("");

          if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
										  //"존경하는 분께 폐가되지 않도록 단계를 마련하였습니다. \r\n"
                                          //"단어를 입력하십시요(공백없이)."
                                          " 기계닉스 첨단 대장간 "
                                          ) != true) return;

          //[단어확인]
          //{
              if((STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "단군박정희") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "국부박정희") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "박정희") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "박정희대통령") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "대통령박정희") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "20120820월:84.24%") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "자유민주주의대한민국") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "대한민국") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "국가보안법") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "국가보안법유지") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "국가보안법폐지반대") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "멸공통일") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "반공통일") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "자주국방") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "한미동맹") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "한미혈맹") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "멸공") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "반공") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "자유민주주의") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "태극기") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "애국우익") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "우익") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "애국우파") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "우파") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "호국") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "부국강병") == true) ||
				 //[2016.05.16.월][추가!!!]
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "자유민주공화당") == true) ||

                 //[2012.09.27.목][추가!!!]
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "5.16군사혁명==구국혁명==대한민국문명개화==대한민국문명진화") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "1961.05.16==군사혁명==구국혁명") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "19610516") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "516군사혁명") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "5.16군사혁명") == true) ||

                 //[2012.04.30.월][추가!!!]{----------------------------------------------------------
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "이명박대통령") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "대통령이명박") == true) ||
                 //}----------------------------------------------------------------------------------
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "이명박") == true) ||
				 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "MB") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "MB:MainBrain") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "MB:지혜") == true) ||

                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "첨단기술병사양성") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "공교육활성화") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "초중고적용") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "공대활성화") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "공대생거두기") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "미래준비교육") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "새누리경제지식공간확대") == true) ||
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "관련산업파생") == true) ||


                 //[2012.06.29.금][추가!!!]
                 (STR_Match_NoCase(ide_msgbox_Form->_edit_Edit->_editbuf, "4대강") == true))
              {
                //[2009.05.08.금][추가!!!]
                ide_msgbox_Form->_MsgBox(d_MSGBOX_default,
                                         " 나는 자랑스런 태극기 앞에 \r\n"
                                         " 조국과 민족의 무궁한 영광을 위하여 \r\n"
                                         " 몸과 마음을 바쳐 충성을 다할 것을 \r\n"
                                         " 굳게 다짐 합니다.\r\n\r\n"
                                         " 나는 박정희 대통령께서 미처 다 완성하지 못하고 떠난 멸공통일과\r\n"
                                         " 부국강병 대한민국의 나머지를 1/100 만이라도 완성 하는데\r\n"
                                         " 필요한 도구가 되기를 바라는 마음으로 만들었다.\r\n\r\n"
                                         " 나는 이 작은 도구가 기술전쟁에서 승리할 첨단 기술의 병사와\r\n"
                                         " 과학/기술계의 줄기세포를 양성해줄 것이라 확신한다.\r\n\r\n"
                                         " 기계닉스 첨단 대장장이 김 갑철(金甲哲)");

              }
              else
              {
                ide_msgbox_Form->_MsgBox(d_MSGBOX_default,
                                         //" 나의 신념과 일치하는 단어가 아닙니다. \r\n"
                                         //" 그냥 부담없이 이 도구를 잘 사용해 주십시요. \r\n"
                                         //" 사용해 주셔서 감사드립니다.\r\n\r\n"
                                         " 대한민국 기계닉스 첨단 대장장이 김 갑철(金甲哲) ");

              }

          //}

        } break;
*/

      }

    } break;

    #if  d_Menu_GIGYENICS
    //{
        //[2009.08.14.금][추가!!!]{-------------
        //[개발자] 전용판인 경우만 활성화 된다.
        //}-------------------------------------

        case d_menu_gigyenics_ix :
        {
          //하위 항목에 따른 처리를 수행한다.
          switch(pSUBMENUindex)
          {
            case 0 : //각종 시험용 함수들 검증하기.
            {
              //개발에 사용되는 편리한 임시 기능을 여기에 등록하여 사용한다.

              //[2009.08.26.수][추가!!!]
              //Ide_Copy_VmosGos_In_OsFolder();

              //[2010.01.24.일][추가!!!]
              //Ide_GuiPart_Test0();

              //[2017.06.11.월][추가!!!]
              main_Form->GIGYENICS_GUI_Test();

            } break;

            case 1 : //각종 시험용 함수들 검증하기.
            {
              //[2010.02.10.수][추가!!!]{----
              //추가 검증용 함수를 등록한다.
              //}----------------------------

              //Ide_GuiPart_Test1();

            } break;

          }

        } break;

    //}
    #endif

  }

  return;

}

void __fastcall Tide_menu_Form::_EVENT_ItemSelect_listSubMenu(void)
{
  //[2011.11.15.화][생성!!!]{-----------------------------------------
  //선택된 [항목] 에 해당하는 처리를 수행.
  //
  //[항목이름] 자체가 지정 위치의 [폴더이름] 이 되므로
  //[폴더] 안의 <항목이름.gvmx> 를 읽어서 실행시킨다.
  //
  //<메뉴:GVMS(PC)> 와 <메뉴:GVMX(맷돌)> 의 두개 하위항목이 해당한다.
  //
  //<GVMS:Ide_System_GVMS_Path>, <GVMX:Ide_System_GVMX_Path> 가 기본
  //[경로] 가 된다.
  //
  //처리가 복잡하므로 <ide_main.cpp> 의 전용함수를 사용하여 처리.
  //}-----------------------------------------------------------------

  //[VAR]
  //{
      char  itemStr[OPT_lineStrSize] = {""};

  //}

  //[썸네일 보기 삭제]
  //{
      //[2023.01.02.월][추가]{----------------------------------------------------
      //<GVMS:썸네일> 을 보여주기 위한 <_gvms_GImageBox> 가 존재한다면 삭제한다.
      //[생성] 은 <ide_main.cpp:Ide_ListSubMenu_GVMS_Thumb_View()> 에서 처리된다.
      //
      //[중요]********************************************************************
      //<_EVENT_ItemSelect_listSubMenu()> 에서도 먼저 감추고 삭제한다.
      //그렇지 않은 경우는 메모리 오류가 발생한다(아마도 촛점 때문인듯).
      //
      //반드시, <_listSubMenu> 를 감추기 전에 먼저 실행해야 한다.
      //}--------------------------------------------------------------------------

      if(_gvms_GImageBox != NULL) { _gvms_GImageBox->Visible = false; }

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

  //}

  //[감추기]
  //{
      //[2011.11.17.목][추가!!!]{--------------------
      //[하위항목] 기능으로 먼저 보이지 않게 감춘다.
      //}--------------------------------------------

      _listSubMenu->Visible = false;

  //}

  //[<주 항목> 구분처리]
  //{
      if     (_listSubMenu->_menuItemIndex == d_menu_gvms_ix)
      {
        //[!]{---------
        //<GVMS> 관련.
        //}------------

        //항목문자열 얻기.
        _listSubMenu->_ItemSelStr(itemStr);

        //<GVMS> 실행.
        Ide_ListSubMenu_GVMS_Install(itemStr);

      }
      else if(_listSubMenu->_menuItemIndex == d_menu_gvmx_ix)
      {
        //[!]{---------
        //<GVMX> 관련.
        //}------------

        //항목문자열 얻기.
        _listSubMenu->_ItemSelStr(itemStr);

        //<GVMS> 실행.
        Ide_ListSubMenu_GVMX_Install(itemStr);

      }

  //}

}

void __fastcall Tide_menu_Form::_EVENT_ItemMouseSelect_listSubMenu(void)
{
  //[2023.01.02.월][생성]{----------------------------------------------------------------------
  //[가선택] 시에 [항목이름] 에 해당하는 [썸네일] 을 해당 항목의 옆에 보여준다.
  //
  //처리가 복잡하므로 <Ide_ListSubMenu_GVMS_Thumb_View()> 를 호출하여 처리.
  //
  //[배치구조]**********************************************************************************
  //
  //IDE:gigyenics\gvm\gvms\[항목이름]\__모양새\항목이름.jpg   <---해당 GUI 의 썸네일(40% 크기).
  //IDE:gigyenics\gvm\gvms\[항목이름]\항목이름.gvms           <---해당 GVMS.
  //
  //<메뉴:GVMS(PC)> 만 해당되며, <GVMS:Ide_System_GVMS_Path> 가 기본 경로가 된다.
  //}-------------------------------------------------------------------------------------------

  //[VAR]
  //{
      char  itemStr[OPT_lineStrSize] = {""};

  //}

  //[<_EVENT_FocusKill> 사용 중지]
  //{
      //[중요]{**************************************************************************
      //<GImageBox> 가 보일때 촛점을 가질수 있고, 이때 <_listSubMenu> 가 사라지기 때문에
      //일단, <촛점> 을 잃더라도 사라지지 않도록 만든다.
      //}********************************************************************************

      _listSubMenu->_EVENT_FocusKill = NULL;

  //}

  //[<GVMS> 구분 처리]
  //{
      if((_listSubMenu->_menuItemIndex == d_menu_gvms_ix) && (_listSubMenu->_itemMouseSelIndex >= 0) && (_listSubMenu->Visible == true))
      {
        //[!]{---------
        //<GVMS> 관련.
        //}------------

        //항목문자열 얻기.
        _listSubMenu->_ItemMouseSelStr(itemStr);

        //썸네일 보이기.
        Ide_ListSubMenu_GVMS_Thumb_View(itemStr);

      }

  //}

  //[<_EVENT_FocusKill> 사용 설정 ]
  //{
      //[촛점 설정]
      //{
          //[중요]{------------------------------------------------------------------
          //먼저 <GImageBox> 에 촛점이 맞추어진 것을 가져온다.
          //
          //이렇게 하지 않으면 이미 촛점이 없는 상태라서 [편집기] 나 다른 그림부품이
          //촛점을 가져가도 <_listSubMenu> 가 사라지지 않게 된다.
          //}------------------------------------------------------------------------

          if(_listSubMenu->Visible == true)
          {
            _listSubMenu->SetFocus();

          }

      //}

      _listSubMenu->_EVENT_FocusKill = _EVENT_FocusKill_listSubMenu;

  //}

}

void __fastcall Tide_menu_Form::_EVENT_MouseEnter_listSubMenu(void)
{
  //[2023.01.26.목][생성]{-----------------------------
  //[마우스] 가 <_listSubMenu> 영역안으로 들어온 경우.
  //}--------------------------------------------------

  // ...

}

void __fastcall Tide_menu_Form::_EVENT_MouseLeave_listSubMenu(void)
{
  //[2023.01.02.월][생성]{----------------------------------------------
  //[마우스] 가 <_listSubMenu> 영역을 벗어난 경우는 [썸네일] 을 감춘다.
  //}-------------------------------------------------------------------

  if(_gvms_GImageBox != NULL) { _gvms_GImageBox->Visible = false; }

}

void __fastcall Tide_menu_Form::_EVENT_FocusSet_listSubMenu(void)
{
  //[2011.11.15.화][생성]

  // ...

}

void __fastcall Tide_menu_Form::_EVENT_FocusKill_listSubMenu(void)
{
  //[2011.11.15.화][생성]

  if(_mouse_in == true) return;

  //[썸네일 보기 삭제]
  //{
      //[2023.01.02.월][추가]{----------------------------------------------------
      //<GVMS:썸네일> 을 보여주기 위한 <_gvms_GImageBox> 가 존재한다면 삭제한다.
      //[생성] 은 <ide_main.cpp:Ide_ListSubMenu_GVMS_Thumb_View()> 에서 처리된다.
      //
      //[중요]********************************************************************
      //<_EVENT_ItemSelect_listSubMenu()> 에서도 먼저 감추고 삭제한다.
      //그렇지 않은 경우는 메모리 오류가 발생한다(아마도 촛점 때문인듯).
      //}-------------------------------------------------------------------------

      if(_gvms_GImageBox != NULL) { _gvms_GImageBox->Visible = false; }

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

  //}

  //[하위항목해제]
  //{
      //[촛점] 을 잃은 경우는 [하위항목] 을 해제 시켜야 한다.
      _SubMenu_HideAll();

      //다시 그리고 반영까지 처리.
      _Menu2();

  //}

}

void __fastcall Tide_menu_Form::_ListSubMenu_ViewSet(int  pY)
{
  //[2011.11.16.수][생성!!!]{-----------------------------------------------------
  //<_listSubMenu> 가 항목이 너무 많거나 아래 일부가 [화면여역 아래]
  //밖으로 벗어나는 경우는, 화면 영역 안에 보이도록 [높이] 를 조정하고
  //<자동높이:해제> 후 [줄이동자] 를 보여준다.
  //
  //[화면영역] 은 [작업표시줄] 까지 포함한 전체 [화면영역] 을 의미한다.
  //
  //[주의!!!]---------------------------------------------------------------------
  //반드시, [화면상의 좌표] 를 받아서 사용하고 [좌표:Y] 만 있으면 된다.
  //
  //<하위항목높이> 는 현재 물리적인 <_listSubMenu->Height> 가 아니라
  //논리적인 크기 즉, <항목수 * 행높이> 를 사용해야 한다.
  //이는 <_listSubMenu->Height> 는 이미 조정등으로 크기가 일정하지 않기 때문이다.
  //항상 이상적인 전체 [높이] 를 사용해야 한다.
  //
  //[참고!!!]---------------------------------------------------------------------
  //이 함수는 <_listSubMenu> 를 보여주기 전에 호출해야 한다.
  //}-----------------------------------------------------------------------------

  //[VAR]
  //{
      int  totalHeight;

      int  deltaHeight;

  //}

  //[가상적인 <전체높이> 얻기]
  //{
      //[!]{------------------------------------------------
      //현재 가상적인 실제 [하위항목] 의 전체높이를 구한다.
      //<항목수 * 행높이> 가 해당.
      //}---------------------------------------------------

      totalHeight =  (_listSubMenu->_itemCount * _listSubMenu->_fontMaxHeight);

  //}

  //[높이 차이 얻기]
  //{
      //[!]{------------------------------------------------
      //화면에서 벗어나지 않는(보여지는 부분)크기를 얻는다.
      //}---------------------------------------------------

      deltaHeight = (Screen->Height - pY);

  //}

  //[전체가 다 보이는지 여부에 따라 처리]
  //{
      if((pY + totalHeight) >= Screen->Height)
      {
        //[!]{---------------------------------------------------
        //실제 그대로 표시하는 경우 [화면아래] 로 벗어나는 경우.
        //자동높이 해제, 높이수정, 줄이동자 보이기를 수행.
        //}------------------------------------------------------

        _listSubMenu->_AutoHeight(false);

        //행단위로 높이를 정리하기 위하여 [행높이] 로 나누어 [행 수] 를 구하고
        //다시 [행수]*[행높이] 로 전체 [높이] 를 구한다.
        _listSubMenu->_Height((deltaHeight/_listSubMenu->_fontMaxHeight)*_listSubMenu->_fontMaxHeight);

        _listSubMenu->_ScrollVisible(true);

      }
      else
      {
        //[!]{----------------------------------------------
        //실제 그대로 표시하는 경우 화면안에 존재하는 경우.
        //자동높이 설정, 줄이동자 감추기를 수행.
        //}-------------------------------------------------

        _listSubMenu->_AutoHeight(true);

        _listSubMenu->_ScrollVisible(false);

      }

  //}

}

void __fastcall Tide_menu_Form::FormShow(TObject *Sender)
{
  //[2009.08.09.일][생성!!!]{------------------------------------------
  //일부 [부품] 은 초기 생성시에 제 위치를 갖지 못하는 문제가 있으므로
  //반드시 여기서 보일때 재위치에 있도록 위치조정 함수를 호출해 준다.
  //}------------------------------------------------------------------

  _Resize();

  return;
  
}

void __fastcall Tide_menu_Form::comTxd_TimerTimer(TObject *Sender)
{
  //[2009.08.09.일][생성!!!]{----
  //타이머와 해당 LED 를 꺼준다.
  //}----------------------------

  //타이머 끄기.
  comTxd_Timer->Enabled = false;

  //LED 끄기.
  _comTxd_RadioBtn->_Checked(false);

  return;

}

void __fastcall Tide_menu_Form::comRxd_TimerTimer(TObject *Sender)
{
  //[2009.08.09.일][생성!!!]

  //타이머 끄기.
  comRxd_Timer->Enabled = false;

  //LED 끄기.
  _comRxd_RadioBtn->_Checked(false);

  return;

}

void __fastcall Tide_menu_Form::GmtdlxPin_View(char  *pJpeg_PathNameExt)
{
  //[2021.03.24.수][생성]{-----------------------------------------------------------------
  //<pJpeg_PathNameExt> 의 <*.jpg> 문서를 열어주고, 이 크기에 맞게 <GForm> 의 크기를 조정.
  //}--------------------------------------------------------------------------------------

  //[VAR]
  //{
      char          title[1024];
      char          name[1024];

      int           color;

      //[2021.03.29.월][추가]
      unsigned int  imageAreaWidth = 0, imageAreaHeight = 0;

      char          errorFilePathNameExt[1024];
      char          errorStr[1024];

  //}

  //[그림 크기 얻기]
  //{
      //[2021.03.29.월][추가]{--------------------------------------------------
      //표시하는 그림크기에 따라 전체 <GGorm> 의 크기가 결정된다.
      //또한, 그림의 존재 유/무 나 오류까지 모두 검사하므로 가장 먼저 처리하고,
      //결과가 <true> 가 아니라면 더이상 처리하지 않고 여기서 종료.
      //}-----------------------------------------------------------------------

      if(Image_Get_Size(pJpeg_PathNameExt, &imageAreaWidth, &imageAreaHeight) != true)
      {
        Str_FileName_Width_Ellipsis(pJpeg_PathNameExt,
                                    &_font, d_FONTSTYLE_default, 1024,
                                    errorFilePathNameExt);

        STR_Assign(errorStr, "\""); STR_Add(errorStr, errorFilePathNameExt); STR_Add(errorStr, "\"\r\n");
        STR_Add(errorStr, "문서가 존재하지 않거나, BMP, JPG, JPEG 에 해당하지 않습니다.\r\n");

        ide_msgbox_Form->_MsgBox2(d_MSGBOX_error,
                                  false,
                                  errorStr);

        return;

      }

  //}

  //[생성]
  //{
      if(_gmtdlxPin_GForm != NULL) { delete _gmtdlxPin_GForm; _gmtdlxPin_GForm = NULL; }

      _gmtdlxPin_GForm = new TGForm_Form(this);
      _gmtdlxPin_GForm->Parent = NULL;
      _gmtdlxPin_GForm->Visible = false;

      //[색 설정]
      //{
          _gmtdlxPin_GForm->_CaptionBackColor(_ide_option->color_0);

          BMP_Get_Bright_Color(_ide_option->color_0, 100, &color);
          _gmtdlxPin_GForm->_BorderColor(color);

      //}

      //[제묵 설정]
      //{
          //[!]{---------------------------------------------------------------
          //<pJpeg_PathNameExt> 에서 <G.MTDL.A> 와 같은 [이름] 만 추출하여
          //"::: 맷돌(G.MTDL.A) 핀 배치도 :::" 와 같은 문자열로 합성하여 표시.
          //}------------------------------------------------------------------

         //[이름만 추출]
         //{
             STR_GetFileNameOnly_ExceptExt(pJpeg_PathNameExt, name);

         //}

          STR_Assign(title, "::: 맷돌("); STR_Add(title, name); STR_Add(title, ") 핀 배치도 ::: ");

          _gmtdlxPin_GForm->_Caption(title);

      //}

      //[동작함수 등록]
      //{
          _gmtdlxPin_GForm->_EVENT_Close = _EVENT_Close_gmtdlxPin;

      //}

      //[<baseForm> 에 <GImageBox> 생성]
      //{
          //[생성]
          //{
              _gmtdlxPin_GImageBox          = new TGImageBox_Form(_gmtdlxPin_GForm);
              _gmtdlxPin_GImageBox->Parent  = _gmtdlxPin_GForm->_baseForm;
              _gmtdlxPin_GImageBox->Visible = true;

          //}

          _gmtdlxPin_GImageBox->_Width(imageAreaWidth);
          _gmtdlxPin_GImageBox->_Height(imageAreaHeight);
          _gmtdlxPin_GImageBox->_Left(0);
          _gmtdlxPin_GImageBox->_Top(0);

          _gmtdlxPin_GImageBox->_Border(true);

          _gmtdlxPin_GImageBox->_ImageAreaX(0);
          _gmtdlxPin_GImageBox->_ImageAreaY(0);
          _gmtdlxPin_GImageBox->_ImageAreaWidth(imageAreaWidth);
          _gmtdlxPin_GImageBox->_ImageAreaHeight(imageAreaHeight);

          _gmtdlxPin_GImageBox->_BorderColor(clRed);
          _gmtdlxPin_GImageBox->_BackColor(clLime);

          //[그림 올리기]
          //{
              _gmtdlxPin_GImageBox->_Image(pJpeg_PathNameExt, false);

          //}

      //}

  //}

  //[그림 크기에 따른 <GForm> 크기 결정]
  //{
      _gmtdlxPin_GForm->_Width(imageAreaWidth + 8);

      _gmtdlxPin_GForm->_Height(imageAreaHeight + 16 + 8 - 1);

  //}

  //[제목줄 버튼 설정]
  //{
      //크기 조정을 하지 못하게 [최대/기본:버튼] 을 비활성화 한다.
      _gmtdlxPin_GForm->_maxBmpBtn->_Enable(false);

      _gmtdlxPin_GForm->_maxBmpBtn->Visible = false;
      _gmtdlxPin_GForm->_minBmpBtn->Visible = false;

  //}

  //[화면 중앙 위치]
  //{
      _gmtdlxPin_GForm->Left = (Screen->Width/2 - _gmtdlxPin_GForm->Width/2);
      _gmtdlxPin_GForm->Top  = (Screen->Height/2 - _gmtdlxPin_GForm->Height/2);

  //}

  //[항상 위에 보이도록 설정]
  //{
      //[!]{----------------------------------------------------------------------------
      //핀배치도는 편집기를 기술 중에도 계속 참고해야 하므로 [항상 위에] 보이도록 설정.
      //}-------------------------------------------------------------------------------

      _gmtdlxPin_GForm->FormStyle = fsStayOnTop;

  //}

  //[보이기]
  //{
      _gmtdlxPin_GForm->Visible = true;

  //}
  
}

void __fastcall Tide_menu_Form::_EVENT_Close_gmtdlxPin(void)
{
  //[2021.03.24.수][생성]

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

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

}




