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

#include <vcl.h>
#pragma hdrstop

#include "gui_imagebox.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui_imagebox_Form *gui_imagebox_Form;
//---------------------------------------------------------------------------


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


__fastcall Tgui_imagebox_Form::Tgui_imagebox_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[환경변수]
  //{
      //[2007.10.02.화][추가!!!]
      IDE_Get_Option(&_ide_option);

  //}

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

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

      //그림 영역 크기 설정.
      _bmp_->Width       = this->Width;
      _bmp_->Height      = this->Height;

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

  //[속성 초기화]
  //{
      //실제 그림 영역을 생성한다.
      _bitmap_ = new Graphics::TBitmap;

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

      //[이미지 영역 정보]
      //{
          _image_x       = 0;
          _image_y       = 0;
          _image_width   = _bmp_->Width;
          _image_height  = _bmp_->Height;
      //}

      _index_bitmap  = false;
      _index_width   = _image_width;
      _index         = 0;

      //이미지를 가진 bipmap 크기 정보.
      _bitmap_->Width  = _image_width;
      _bitmap_->Height = _image_height;

      //기본적으로 테두리는 없다.
      _border = false;
  //}

  //[모양 그리기]
  //{
      _Shape();
  //}

  return;

}

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

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

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

}

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

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

  if(Message.Msg == WM_ERASEBKGND)
  {
    _Draw();

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

  }

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

  return;

}

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

void __fastcall Tgui_imagebox_Form::_Shape(void)
{
  //[2006.11.09.목][생성!!!]

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

  //[바탕색]
  //{
      //바탕을 일단 배경색으로 지운다.
      _bmp_->Canvas->Brush->Color = IDE_COLOR_2;
      _bmp_->Canvas->FillRect(_bmp_->Canvas->ClipRect);
  //}

  //[그림표시]
  //{
      //그림을 표시하면서 지정색에 테두리 색을 사용한다.
      //이는 그림의 색을 테두리 색과 일치하여 보기 좋게 하기 위한 것이다.

      //[index 그림 접근]{-------------------------------------------------------------------
      //_bitmap_ 의 그림을 index 를 사용하여 부분별로 읽어서 _bmp_ 의 그림영역에 올려준다.
      //높이는 _bitmap_->Height 와 같은 것으로 간주하고, 폭만 _index_width 의 값을 적용한다.
      //}------------------------------------------------------------------------------------

      if(_index_bitmap == true)
      {
        BMP_Copy_ChangeColor(//원본 정보.
                             _bitmap_, _index*_index_width , 0, _index_width, _bitmap_->Height,
                             //복사본 정보.
                             _bmp_, _image_x, _image_y, _image_width, _image_height,
                             //바꿀 대상 색.
                             clBlack,
                             //바꿀색.(테두리색)
                             _ide_option->color_0);
      }
      else
      {
        BMP_Copy_ChangeColor(//원본 정보.
                             _bitmap_, 0 , 0, _bitmap_->Width, _bitmap_->Height,
                             //복사본 정보.
                             _bmp_, _image_x, _image_y, _image_width, _image_height,
                             //바꿀 대상 색.
                             clBlack,
                             //바꿀색.(테두리색)
                             _ide_option->color_0);
      }
  //}

  //[테두리 만들기]
  //{
      //테두리는 [유/무] 를 선택하여 처리한다.
      if(_border == true)
      {
        _bmp_->Canvas->Pen->Color   = _ide_option->color_0;
        _bmp_->Canvas->Pen->Width   = 1;
        _bmp_->Canvas->Brush->Style = bsClear;
        _bmp_->Canvas->Rectangle(_bmp_->Canvas->ClipRect);

      }
  //}

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

  return ;

}

void __fastcall Tgui_imagebox_Form::_Border(bool  pBORDER)
{
  //[2006.11.09.목][생성!!!]

  _border = pBORDER;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Left(int  pLEFT)
{
  //[2006.11.09.목][생성!!!]

  this->Left = pLEFT;

  return ;

}

void __fastcall Tgui_imagebox_Form::_Top(int  pTOP)
{
  //[2006.11.09.목][생성!!!]

  this->Top = pTOP;

  return ;

}

void __fastcall Tgui_imagebox_Form::_Width(int  pWIDTH)
{
  //[2006.11.09.목][생성!!!]

  this->Width = pWIDTH;

  //[bmp 크기 조정]
  //{
      //다른 컨트롤과 달리 크기 조정이 될수 있으므로 이 경우 bmp 도 같이 조정한다.
      _bmp_->Width = this->Width;
  //}

  //높이가 바뀌었으므로 다시 그려준다.
  _Shape();

  return ;

}

void __fastcall Tgui_imagebox_Form::_Height(int  pHEIGHT)
{
  //[2006.11.09.목][생성!!!]

  this->Height = pHEIGHT;

  //[bmp 크기 조정]
  //{
      //다른 컨트롤과 달리 크기 조정이 될수 있으므로 이 경우 bmp 도 같이 조정한다.
      _bmp_->Height = this->Height;
  //}

  //높이가 바뀌었으므로 다시 그려준다.
  _Shape();

  return ;

}

void __fastcall Tgui_imagebox_Form::_Bitmap(AnsiString  pBITMAPname)
{
  //[2006.11.09.목][생성!!!]

  //지정 이름의 bmp 를 읽어들인다.
  _bitmap_->LoadFromFile(pBITMAPname);

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

  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_IndexBitmap(bool  pINDEXBITMAP)
{
  //[2006.11.10.금][생성!!!]

  _index_bitmap = pINDEXBITMAP;

  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_IndexWidth(int  pINDEXWIDTH)
{
  //[2006.11.10.금][생성!!!]

  _index_width = pINDEXWIDTH;

  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Index(int  pINDEX)
{
  //[2006.11.10.금][생성!!!]

  _index = pINDEX;

  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Image_X(int  pIMAGEx)
{
  //[2006.11.11.토][생성!!!]

  _image_x = pIMAGEx;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Image_Y(int  pIMAGEy)
{
  //[2006.11.11.토][생성!!!]

  _image_y = pIMAGEy;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Image_Width(int  pIMAGEwidth)
{
  //[2006.11.11.토][생성!!!]

  _image_width = pIMAGEwidth;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Image_Height(int  pIMAGEheight)
{
  //[2006.11.11.토][생성!!!]

  _image_height = pIMAGEheight;

  //다시 그린다.
  _Shape();

  return;

}

void __fastcall Tgui_imagebox_Form::_Draw(void)
{
  //[2006.11.09.목][생성!!!]

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

  return;

}

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

