class Pusher : public Ctrl { public: virtual void CancelMode(); virtual void LeftDown(Point, dword); virtual void MouseMove(Point, dword); virtual void MouseLeave(); virtual void LeftRepeat(Point, dword); virtual void LeftUp(Point, dword); virtual void GotFocus(); virtual void LostFocus(); virtual void State(int); virtual String GetDesc() const; virtual bool Key(dword key, int); virtual bool HotKey(dword key); virtual dword GetAccessKeys() const; virtual void AssignAccessKeys(dword used); private: bool push:1; bool keypush:1; bool clickfocus:1; void EndPush(); protected: int accesskey; String label; Font font; void KeyPush(); bool IsPush() const { return push || keypush; } bool IsKeyPush() { return keypush; } bool FinishPush(); protected: virtual void RefreshPush(); virtual void RefreshFocus(); virtual void PerformAction(); public: Pusher& SetFont(Font fnt); Pusher& SetLabel(const char *text); Pusher& ClickFocus(bool cf = true); Pusher& NoClickFocus() { return ClickFocus(false); } bool IsClickFocus() const { return clickfocus; } Font GetFont() const { return font; } String GetLabel() const { return label; } void PseudoPush(); int GetVisualState() const; Event<> WhenPush; Event<> WhenRepeat; Pusher(); virtual ~Pusher(); }; class Button : public Pusher { public: virtual void Paint(Draw& draw); virtual bool Key(dword key, int); virtual bool HotKey(dword key); virtual void MouseEnter(Point, dword); virtual void MouseLeave(); virtual dword GetAccessKeys() const; virtual void AssignAccessKeys(dword used); virtual void Layout(); virtual void GotFocus(); virtual void LostFocus(); virtual int OverPaint() const; public: struct Style : ChStyle