An Unclickable Button

 
Download Source Code and Demo Project

Environment: VC++ 5.0 (SP3) NT 4.0 (SP3), Win95

I wrote this a while back for a friend. It is basically just a normal
pushbutton, except that when the user tries to click on it, it moves out
of the way making it practically un-clickable.

I have no idea what anyone would ever want to use such a control in
their app, apart from wanting to be extremely annoying to users (and hey –
don’t we all get like that on occasion?) 🙂

The button is just a normal button with OnMouseMove overridden: (m_nJumpDistance
is the distance in pixels to jump once the mouse has moved over the control).


void CTrickButton::OnMouseMove(UINT nFlags, CPoint point)
{
CWnd* pParent = GetParent();
if (!pParent) pParent = GetDesktopWindow();

CRect ParentRect; // Parent client area (Parent coords)
pParent->GetClientRect(ParentRect);

ClientToScreen(&point); // Convert point to parent coords
pParent->ScreenToClient(&point);

CRect ButtonRect; // Button Dimensions (Parent coords)
GetWindowRect(ButtonRect);
pParent->ScreenToClient(ButtonRect);
CPoint Center = ButtonRect.CenterPoint(); // Center of button (parent coords)

CSize CriticalSize(ButtonRect.Width()/6, ButtonRect.Height()/6);

CRect NewButtonRect = ButtonRect; // New position (parent coords)

if (point.x – CriticalSize.cx > Center.x) // Mouse is right of center
{
if (ButtonRect.left > ParentRect.left + ButtonRect.Width() + m_nJumpDistance)
NewButtonRect -= CSize(ButtonRect.right – point.x + m_nJumpDistance, 0);
else
NewButtonRect += CSize(point.x – ButtonRect.left + m_nJumpDistance, 0);
}
else if (point.x + CriticalSize.cx < Center.x) // Mouse is left of center { if (ButtonRect.right < ParentRect.right - ButtonRect.Width() - m_nJumpDistance) NewButtonRect += CSize(point.x - ButtonRect.left + m_nJumpDistance, 0); else NewButtonRect -= CSize(ButtonRect.right - point.x + m_nJumpDistance, 0); } if (point.y - CriticalSize.cy > Center.y) // Mouse is below center
{
if (ButtonRect.top > ParentRect.top + ButtonRect.Height() + m_nJumpDistance)
NewButtonRect -= CSize(0, ButtonRect.bottom – point.y + m_nJumpDistance);
else
NewButtonRect += CSize(0, point.y – ButtonRect.top + m_nJumpDistance);
}
else if (point.y + CriticalSize.cy < Center.y) // Mouse is above center { if (ButtonRect.bottom < ParentRect.bottom - ButtonRect.Height() - m_nJumpDistance) NewButtonRect += CSize(0, point.y - ButtonRect.top + m_nJumpDistance); else NewButtonRect -= CSize(0, ButtonRect.bottom - point.y + m_nJumpDistance); } MoveWindow(NewButtonRect); RedrawWindow(); CButton::OnMouseMove(nFlags, point); }

Last updated: 16 June 1998

More by Author

Must Read