Puedes hacerlo manejando los eventos correctos:
En VB:
Private ReadOnly State_Normal As Color = Color.Gray
Private ReadOnly State_Focused As Color = Color.White
Private ReadOnly State_Clicked As Color = Color.Red
Private Sub Button_MouseEnter(sender As Object, e As EventArgs) Handles Button1.MouseEnter
sender.backcolor = State_Focused
End Sub
Private Sub Button_MouseLeave(sender As Object, e As EventArgs) Handles Button1.MouseLeave
sender.backcolor = State_Normal
End Sub
Private Sub Button_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
sender.backcolor = State_Clicked
End Sub
Private Sub Button_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
sender.backcolor = IIf(sender.focused, State_Focused, State_Normal)
End Sub
En C#
private readonly Color State_Normal = Color.Gray;
private readonly Color State_Focused = Color.White;
private readonly Color State_Clicked = Color.Red;
private void button1_MouseEnter()
{ button1.BackColor = State_Focused; }
private void button1_MouseLeave()
{ button1.BackColor = State_Normal; }
private void button1_MouseDown()
{ button1.BackColor = State_Clicked; }
private void button1_MouseUp()
{ button1.BackColor = (button1.Focused ? State_Focused : State_Normal); }