#include <windows.h>
#include <windowsx.h>
#include <mem.h>

// Прототип функции окна TOOLBAR
LRESULT CALLBACK _export
ToolbarWndProc(HWND, UINT, WPARAM, LPARAM);

// ======================================================
// Определение класса TbMain
// ======================================================
class TbMain
{
public:
  // Идентификатор приложения
  static HINSTANCE hInst;

  // Идентификаторы кнопок в различном состоянии          
  static HBITMAP   hbmpUp[20];     // исходное состояние 
  static HBITMAP   hbmpDown[20];   // нажатые
  static HBITMAP   hbmpGrayed[20]; // заблокированные

  // Идентификатор родительского окна, создавшего TOOLBAR
  static HWND      hwndParent;

  // Идентификатор первой кнопки в TOOLBAR
  static int       nFirstId;
};

// ======================================================
// Определение класса Toolbar
// ======================================================
class Toolbar
{
  RECT     rcParent;        // размеры родительского окна
  RECT     rcToolbar;       // размеры TOOLBAR
  ATOM     aWndClass;       // атом для кода возврата
  char     szClassName[20]; // имя класса
  HWND     hwndToolbar;     // идентификатор окна TOOLBAR
  HWND     hButton[20];     // идентификаторы кнопок
  int      errno;           // код ошибки

public:

// ======================================================
// Вычисление размеров окна TOOLBAR
// ======================================================
  void GetRect(void)
  {
    rcToolbar.left   = GetRectLeft();
    rcToolbar.top    = GetRectTop();
    rcToolbar.right  = GetRectRihgt();
    rcToolbar.bottom = GetRectBottom();
  }

// ======================================================
// Регистрация класса для окна TOOLBAR
// ======================================================
  virtual BOOL RegisterWndClass(void)
  {
    WNDCLASS wc; // структура для регистрации класса окна

    memset(&wc, 0, sizeof(wc));

    wc.style         = 0;
    wc.lpfnWndProc   = (WNDPROC) ToolbarWndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = TbMain::hInst;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName  = (LPSTR)NULL;

    // Определяем кисть для закрашивания окна
    wc.hbrBackground = GetBrush();

    // Имя класса
    lstrcpy(szClassName, "FrolovAVToolBar");
    wc.lpszClassName = (LPSTR)szClassName;

    // Регистрация класса
    aWndClass = RegisterClass(&wc);
    return (aWndClass != 0);
  }

// ======================================================
// Создание дочернего окна, которое будет использоваться
// для размещения кнопок TOOLBAR
// ======================================================
  void CreateTbWindow(void)
  {
    hwndToolbar = CreateWindow(
    szClassName,                 // имя класса окна
    NULL,                        // заголовок окна
    WS_CHILDWINDOW | WS_VISIBLE, // стиль окна
    rcToolbar.left,              // указываем расположение
    rcToolbar.top,               //   и размеры окна
    rcToolbar.right,
    rcToolbar.bottom,
    TbMain::hwndParent,          // идентификатор родительского окна
    0,                           // идентификатор меню
    TbMain::hInst,               // идентификатор приложения
    NULL);                   // указатель на дополнительные параметры
  }

// ======================================================
// Устанавливаем ширину окна TOOLBAR
// ======================================================
  void SetWidth(int nWidth)
  {
    RECT rcOld;

    GetClientRect(hwndToolbar, &rcOld);

    MoveWindow(hwndToolbar,
      rcOld.left, rcOld.top,
      nWidth, rcOld.bottom, TRUE);
  }

// ======================================================
// Вставляем кнопку в TOOLBAR
// ======================================================
  BOOL InsertButton(UINT nPosition,
       LPCSTR lpszBmpUp, LPCSTR lpszBmpDown, LPCSTR lpszBmpGrayed)
  {
     // Загружаем указанные в параметрах функции изображения
     TbMain::hbmpUp[nPosition] =
       LoadBitmap(TbMain::hInst, lpszBmpUp);
     TbMain::hbmpDown[nPosition] =
       LoadBitmap(TbMain::hInst, lpszBmpDown);
     TbMain::hbmpGrayed[nPosition] =
       LoadBitmap(TbMain::hInst, lpszBmpGrayed);

     // Создаем орган управления - кнопку, которую
     // рисует родительское окно. В нашем случае это будет
     // окно TOOLBAR
     hButton[nPosition] = CreateWindow("button", NULL,
       WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
       GetBtnX(nPosition),  // определяем расположение кнопки 
       GetBtnY(nPosition),  //  исходя из ее порядкового номера
       GetBmpWidth(),       // ширина кнопки    
       GetBmpHeigt(),       // высота кнопки
       hwndToolbar,         // родительское окно для кнопки
       (HMENU)(nPosition + TbMain::nFirstId), // идентификатор кнопки
       TbMain::hInst, NULL);
     return TRUE;
  }

// ======================================================
// Конструктор для класса Toolbar
// ======================================================
  Toolbar(HINSTANCE hInst, HWND hwndParent, int nFirstid);

// ======================================================
// Деструктор для класса Toolbar
// ======================================================
  ~Toolbar();

  // Проверка признака ошибки
  int Error(void) { return errno; }

  // Определение координат окна TOOLBAR
  virtual int GetRectLeft(void)   { return 0; }
  virtual int GetRectTop(void)    { return 0; }
  virtual int GetRectRihgt(void)  { return rcParent.right; }
  virtual int GetRectBottom(void) { return 26; }

  // Определение кисти для окна TOOLBAR
  virtual HBRUSH GetBrush(void)
  {
     return GetStockBrush(LTGRAY_BRUSH);
  }

  // Определение расположения кнопки исходя из ее номера
  virtual int GetBtnX(int nPosition)
  {
     return 3 + (nPosition * 30);
  }

  virtual int GetBtnY(int nPosition)   { return 3; }

  // Определение размеров кнопки
  virtual int GetBmpWidth(void) { return 30; }
  virtual int GetBmpHeigt(void) { return 20; }
};
