Событие на клик мыши - 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 ""; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д