Событие на клик мыши - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Никак не могу найти, как в си сделать событие по клику. Например, мне нужно, чтобы при нажатии по левой кнопки мыши что-то делалось. Подскажите, какая функция за это отвечает?

Решение задачи: «Событие на клик мыши»

textual
Листинг программы
#include "stdafx.h"
 
#include "gfx16.h"
 
/* ******************************************************************** **
** @@                   internal defines
** ******************************************************************** */
 
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
 
/* ******************************************************************** **
** @@                   internal prototypes
** ******************************************************************** */
 
TButton::TButton
(
   Rect& r,
   const char* aTitle,
   WORD aCommand,
   short hCtx,
   WORD aFlags
)
:  TView(r)
{
   setHelpContext(hCtx);
   HotKey = 0;
   hotNumber = 0;
 
   if (* aTitle)
   {
      Title = new char [strlen(aTitle) + 1];
 
      short i = 0;
 
      for (i = 0; * aTitle; ++i, ++aTitle)
      {
         if (* aTitle == '~')
         {
            Title[i] = *(++aTitle);
            HotKey = ToUpper(Title[i]);
            ++aTitle;
            hotNumber = i;
         }
         else
         {
            Title[i] = * aTitle;
         }
      }
 
      Title[i] = 0;
   }
   else
   {
      Title = 0;
   }
 
   Command = aCommand;
   Flags = aFlags;
   Default = (bool) (Flags & bfDefault);
   setOptions(ofPostProcess);
   Rect R;
   extent(R);
   rect._Size.x = strlen(Title) * 8 + 6;
 
   if (rect._Size.x > R._Size.x - 7)
   {
      rect._Size.x = (R._Size.x - 7);
   }
 
   if (Flags & bfLeftJust)
   {
      rect._Origin.x = R._Origin.x + 6;
   }
   else
   {
      rect._Origin.x = R._Origin.x + (R._Size.x - 7 - rect._Size.x) / 2 + 3;
   }
   rect._Origin.y = (R._Size.y - 8) / 2 - 3;
   rect._Size.y = 8 + 6;
}
 
TButton::~TButton()
{
   if (Title)
   {
      delete Title;
   }
}
 
void TButton::draw()
{
   if (!getState(sfExposed) || !getState(sfVisible))
   {
      return;
   }
 
   SetViewPort();
 
   if (_pOwner)
   {
      SetColor(Default  ?  BLACK  :  _pOwner->getColor(0));
   }
   else
   {
      SetColor(BLACK);
   }
 
   _Rectangle(Point(0),Size);
 
   Rect r;
   extent(r);
 
   r.grow(- 1,- 1);
 
   SetColor(BLACK);
 
   Rectangle(r._Origin,r._Size);
 
   r.grow(- 1,- 1);
 
   Bar(r._Origin,r._Size,LIGHTGRAY,1);
 
   release();
}
 
void TButton::release()
{
   if (!getState(sfExposed) || !getState(sfVisible))
   {
      return;
   }
 
   SetViewPort();
   Rect r;
   extent(r);
   r.grow(- 2,- 2);
   SetColor(WHITE);
   Line(r._Origin,Point(r._Size.x - 1,1));
   Line(r._Origin,Point(1,r._Size.y - 1));
   SetColor(DARKGRAY);
   Line(Point(r._Origin.x + r._Size.x - 2,r._Origin.y + 1),Point(1,r._Size.y - 1));
   Line(Point(r._Origin.x + r._Size.x - 1,r._Origin.y),Point(1,r._Size.y));
   Line(Point(r._Origin.x + 1,r._Origin.y + r._Size.y - 2),Point(r._Size.x - 1,1));
   Line(Point(r._Origin.x,r._Origin.y + r._Size.y - 1),Point(r._Size.x,1));
   pressed = false;
   showTitle();
   mark();
}
 
void TButton::showTitle()
{
   SetViewPort();
   Bar(rect._Origin,rect._Size,LIGHTGRAY,1);
   Rect r= rect;
   r.grow(- 2,- 2);
 
   if (pressed)
   {
      r._Origin.x += 2;
      r._Origin.y += 2;
   }
 
   ++r._Origin.y;
 
   moveto(r._Origin.x + 2,r._Origin.y + textheight(Title) / 2);
   outtext(Title);
 
   if (! commandEnabled(Command))
   {
      moveto(r._Origin.x + 1,r._Origin.y + textheight(Title) / 2);
      outtext(Title);
   }
 
   if (HotKey)
   {
      SetColor(BLACK);
      Line(Point(r._Origin.x + 1 + hotNumber * 8,r._Origin.y + 8),Point(8,1));
   }
}
 
void TButton::press()
{
   if (!getState(sfExposed) || !getState(sfVisible))
   {
      return;
   }
 
   pressed = true;
   SetViewPort();
   Rect r;
   extent(r);
   r.grow(- 2,- 2);
   SetColor(DARKGRAY);
   Line(r._Origin,Point(r._Size.x,1));
   Line(r._Origin,Point(1,r._Size.y));
   SetColor(LIGHTGRAY);
   Line(Point(r._Origin.x + r._Size.x - 2,r._Origin.y + 1),Point(1,r._Size.y - 1));
   Line(Point(r._Origin.x + r._Size.x - 1,r._Origin.y + 1),Point(1,r._Size.y - 1));
   Line(Point(r._Origin.x + 1,r._Origin.y + r._Size.y - 2),Point(r._Size.x - 1,1));
   Line(Point(r._Origin.x + 1,r._Origin.y + r._Size.y - 1),Point(r._Size.x - 1,1));
   showTitle();
   mark();
}
 
void TButton::mark()
{
   if (!getState(sfExposed) || !getState(sfVisible))
   {
      return;
   }
 
   SetViewPort();
 
   SetColor(getState(sfSelected) ? BLACK : LIGHTGRAY);
   setlinestyle(USERBIT_LINE,LinePattern,1);
 
   Rect r= rect;
 
   r._Origin.x -= 2;
   r._Size.x += 4;
 
   _Rectangle(r._Origin,r._Size);
 
   setlinestyle(SOLID_LINE,0,1);
}
 
void TButton::grabDefault()
{
   if (!Default)
   {
      if (_pOwner)
      {
         message(_pOwner,evBroadCast,cmReleaseDefault);
      }
 
      Default = true;
 
      if (getState(sfExposed))
      {
         SetViewPort();
         SetColor(BLACK);
         _Rectangle(Point(0),Size);
      }
   }
}
 
void TButton::releaseDefault()
{
   if (Default)
   {
      Default = false;
 
      if (getState(sfExposed))
      {
         SetViewPort();
 
         if (_pOwner)
         {
            SetColor(_pOwner->getColor(0));
         }
 
         _Rectangle(Point(0),Size);
      }
   }
}
 
void TButton::becomeDefault()
{
   if (! (Flags & bfDefault))
   {
      Flags |= bfDefault;
      grabDefault();
 
      if (_pOwner)
      {
         message(_pOwner,evBroadCast,cmClearDefault);
      }
   }
}
 
void TButton::Select()
{
      mark();
      grabDefault();
 
/*
   if (commandEnabled(Command) && TView::Select())
   {
      mark();
      grabDefault();
      return true;
   }
   else
   {
      return false;
   }
*/
}
 
void TButton::Unselect()
{
   TView::Unselect();
   mark();
   releaseDefault();
 
   if (_pOwner)
   {
      message(_pOwner,evBroadCast,cmGrabDefault);
   }
}
 
void TButton::HandleEvent
(
   TEvent*        pEvt
)
{
   if (!pEvt || (pEvt->Is() == EVT_NONE))
   {
      return;
   }
 
   if ((pEvt->Is() == EVT_KEYBOARD && pEvt->value() == getAltCode(HotKey)) || (getState(sfSelected) && pEvt->Is() == EVT_KEYBOARD && ((ToUpper(pEvt->value()) == HotKey) || (pEvt->value() == _CR_))) || (pEvt->Is() == evCommand && pEvt->value() == cmDefault && Default))
   {
      if (commandEnabled(Command))
      {
         press();
 
         TEvent      event;
 
         event.set(evCommand,Command);
         PutBack(&event);
         delay(150);
         release();
      }
 
      pEvt->clear();
   }
   else if (pEvt->Is() == evBroadCast)
   {
      switch (pEvt->value())
      {
         case cmGrabDefault:
            if (Flags & bfDefault)
            {
               grabDefault();
               pEvt->clear();
            }
            break;
         case cmReleaseDefault:
            releaseDefault();
            break;
         case cmClearDefault:
            if (pEvt->data() != this)
            {
               Flags &= ~bfDefault;
               releaseDefault();
            }
            break;
         case cmCommandSetChanged:
            if (pEvt->shift() == Command || pEvt->shift() == 0)
            {
               showTitle();
               mark();
               pEvt->clear();
            }
            break;
      }
   }
}
 
WORD TButton::getColor
(
   WORD clr
)
{
   return clr;
}
 
char* TButton::getPalette() const
{
   return "";
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы