Mega Code Archive

 
Categories / C# / GUI Windows Form
 

Paint Owner-Draw Buttons

using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;     class OwnerDrawButtons: Form {      readonly int    cxImage, cyImage;      readonly int    cxBtn, cyBtn, dxBtn;      readonly Button btnLarger, btnSmaller;          public static void Main()      {           Application.Run(new OwnerDrawButtons());      }      public OwnerDrawButtons()      {           ResizeRedraw = true;               cxImage = 4 * Font.Height;           cyImage = 4 * Font.Height;           cxBtn = cxImage + 8;           cyBtn = cyImage + 8;           dxBtn = Font.Height;               btnLarger = new Button();           btnLarger.Parent = this;           btnLarger.Size   = new Size(cxBtn, cyBtn);           btnLarger.Click += new EventHandler(ButtonLargerOnClick);           btnLarger.Paint += new PaintEventHandler(ButtonOnPaint);               btnSmaller = new Button();           btnSmaller.Parent = this;           btnSmaller.Size   = new Size(cxBtn, cyBtn);           btnSmaller.Click += new EventHandler(ButtonSmallerOnClick);           btnSmaller.Paint += new PaintEventHandler(ButtonOnPaint);               OnResize(EventArgs.Empty);      }      protected override void OnResize(EventArgs ea)      {           base.OnResize(ea);               btnLarger.Location =                          new Point(ClientSize.Width / 2 - cxBtn - dxBtn / 2,                                   (ClientSize.Height - cyBtn) / 2);           btnSmaller.Location =                          new Point(ClientSize.Width / 2 + dxBtn / 2,                                   (ClientSize.Height - cyBtn) / 2);      }      void ButtonLargerOnClick(object obj, EventArgs ea)      {          Console.WriteLine("clicked large");      }      void ButtonSmallerOnClick(object obj, EventArgs ea)      {          Console.WriteLine("clicked small");      }      void ButtonOnPaint(object obj, PaintEventArgs pea)      {           Button   btn  = (Button) obj;           Graphics grfx = pea.Graphics;                ControlPaint.DrawButton(grfx, 0, 0, cxBtn, cyBtn,                 (btn == (Button) GetChildAtPoint(                                    PointToClient(                                         MousePosition))) &&                      btn.Capture ? ButtonState.Pushed : ButtonState.Normal);               GraphicsState grfxstate = grfx.Save();               grfx.TranslateTransform((cxBtn - cxImage) / 2, (cyBtn - cyImage) / 2);                          DrawLargerButton(grfx, cxImage, cyImage);               grfx.Restore(grfxstate);               if (btn.Focused)                ControlPaint.DrawFocusRectangle(grfx,                      new Rectangle((cxBtn - cxImage) / 2 + cxImage / 16,                                   (cyBtn - cyImage) / 2 + cyImage / 16,                                   7 * cxImage / 8, 7 * cyImage / 8));      }      void DrawLargerButton(Graphics grfx, int cx, int cy)      {           Brush brush = new SolidBrush(btnLarger.ForeColor);           Pen   pen   = new Pen(btnLarger.ForeColor);               grfx.TranslateTransform(cx / 2, cy / 2);               for (int i = 0; i < 4; i++)           {                grfx.DrawLine(pen, 0, 0, cx / 4, 0);                grfx.FillPolygon(brush, new Point[] {                                        new Point(cx / 4, -cy / 8),                                        new Point(cx / 2,       0),                                        new Point(cx / 4,  cy / 8)});                grfx.RotateTransform(90);           }      }           }