Перейти к содержанию

Рекомендуемые сообщения

Есть вот такая кнопка:

private void button1_Click(object sender, EventArgs e) //Пополнить боезапас
{
if (IsGameAvailable)
{
if (AddAmmo)
{
AddAmmo = false;
button1.BackColor = System.Drawing.Color.Goldenrod;
}
else
{
AddAmmo = true;
button1.BackColor = System.Drawing.Color.Green;
}
}

Но она залипает.

Если сделать кнопку Flat, то ее можно настроить чтобы не залипала. Но Flat не красивая кнопка, не нравится она мне.

Как сделать чтобы нормальная кнопка не залипала и меняла цвет?

Ссылка на комментарий
Поделиться на другие сайты

Халтурный способ:


using System.Drawing;
using System.Windows.Forms;

namespace BtnTest
{
public partial class Form1 : Form
{
public Color BtnClr;
public Form1()
{
InitializeComponent();
}

private void Button1MouseDown(object sender, MouseEventArgs e)
{
BtnClr = ((Button)sender).BackColor;
((Button)sender).BackColor = Color.Red;
}

private void Button1MouseUp(object sender, MouseEventArgs e)
{
((Button)sender).BackColor = BtnClr;
}
}
}

Работает? Или что-то ещё требовалось?

Ссылка на комментарий
Поделиться на другие сайты

Нет, или я не так записал.

private void button1_Click(object sender, System.EventArgs e)
{

if (UnlimitedHealth)
{
UnlimitedHealth = false;
BtnClr = ((Button)sender).BackColor;
((Button)sender).BackColor = Color.Red;
}
else
{
UnlimitedHealth = true;
((Button)sender).BackColor = BtnClr;
}
}

Также залипает.

Ссылка на комментарий
Поделиться на другие сайты


using System.Drawing;
using System.Windows.Forms;
namespace BtnTest
{
public partial class Form1 : Form
{
public Color BtnClr;
public bool IsGameAvailable;
public bool AddAmmo;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Вызывается тогда, когда на кнопке _нажата_ кнопка мыши
/// </summary>
/// <param name="sender">Объект, который послал событие (кнопка)</param>
/// <param name="e">Аргументы, содержащие координаты курсора мыши и состояние кнопок</param>
private void Button1MouseDown(object sender, MouseEventArgs e)
{
BtnClr = ((Button)sender).BackColor; //Сохраняем текущий цвет фона кнопки
((Button)sender).BackColor = Color.Red; //Красим кнопку в красный цвет
}
/// <summary>
/// Вызывается тогда, когда на кнопке _отпущена_ кнопка мыши
/// </summary>
/// <param name="sender">Объект, который послал событие (кнопка)</param>
/// <param name="e">Аргументы, содержащие координаты курсора мыши и состояние кнопок</param>
private void Button1MouseUp(object sender, MouseEventArgs e)
{
((Button)sender).BackColor = BtnClr; //Восстанавливаем изначальный цвет фона кнопки
//if (IsGameAvailable) //Если игра найдена (код закомментирован)
//{
if (AddAmmo) //Если опция активна
{
AddAmmo = false; //Деактивируем её
MessageBox.Show("Add ammo = false!"); //Сообщаем об этом пользователю
}
else //Иначе, если опция не активна
{
AddAmmo = true; //Активируем её
MessageBox.Show("Add ammo = true!"); //Сообщаем об этом пользователю
}
//}
}
}
}

Ты ловишь у кнопки событие [Click()], которое происходит так - сначала кнопка мыши нажимается (событие [MouseDown()]), а затем отжимается - [MouseUp()]. Между этими двумя событиями и происходит выполнение какого-то кода. В моём примере ловится сначала MouseDown - кнопка красится в красный, затем ловится MouseUp (когда кнопку отпускают) - кнопка красится в родной цвет и выполняется какой-то дополнительный код. Надеюсь, теперь вопросов нет. :-P

Задача состояла в том, чтобы проверять состояние левой кнопки мыши - если нажата, то красить кнопку в другой цвет, если не нажата - красить в родной обратно. На отладке же прекрасно видно, что при выполнении обработчика события Click() прицепиться ни к чему было нельзя. Мораль - больше пользоваться отладчиком. :-D

Ссылка на комментарий
Поделиться на другие сайты

Вот я подставляю кнопку в твой код:

using System.Drawing;
using System.Windows.Forms;
namespace BtnTest
{
public partial class Form1 : Form
{
public Color BtnClr;
public bool IsGameAvailable;
public bool AddAmmo;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Вызывается тогда, когда на кнопке _нажата_ кнопка мыши
/// </summary>
/// <param name="sender">Объект, который послал событие (кнопка)</param>
/// <param name="e">Аргументы, содержащие координаты курсора мыши и состояние кнопок</param>
private void Button1MouseDown(object sender, MouseEventArgs e)
{
BtnClr = ((Button)sender).BackColor; //Сохраняем текущий цвет фона кнопки
((Button)sender).BackColor = Color.Red; //Красим кнопку в красный цвет
}
/// <summary>
/// Вызывается тогда, когда на кнопке _отпущена_ кнопка мыши
/// </summary>
/// <param name="sender">Объект, который послал событие (кнопка)</param>
/// <param name="e">Аргументы, содержащие координаты курсора мыши и состояние кнопок</param>
private void Button1MouseUp(object sender, MouseEventArgs e)
{
((Button)sender).BackColor = BtnClr; //Восстанавливаем изначальный цвет фона кнопки
//if (IsGameAvailable) //Если игра найдена (код закомментирован)
//{
if (AddAmmo) //Если опция активна
{
AddAmmo = false; //Деактивируем её
button1.BackColor = System.Drawing.Color.Goldenrod; //Сообщаем об этом пользователю
}
else //Иначе, если опция не активна
{
AddAmmo = true; //Активируем её
button1.BackColor = System.Drawing.Color.Green; //Сообщаем об этом пользователю
}
//}
}
private void button1_Click(object sender, System.EventArgs e)
{
if (IsGameAvailable)
{
if (AddAmmo)
{
AddAmmo = false;
//button1.BackColor = System.Drawing.Color.Goldenrod;
}
else
{
AddAmmo = true;
//button1.BackColor = System.Drawing.Color.Green;
}
}
}
}
}

7af11bd184c1b45823b0d14104cd429e.jpg

this.button1.Location = new System.Drawing.Point(144, 103);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Button1MouseUp);

и получаю вот это: 6a229ac91ad5c91f28179da9b8270f02.gif а надо вот это: 5a405c174da116c85fc0fd006f570d05.gif

Ссылка на комментарий
Поделиться на другие сайты

Так блин, на второй картинке и есть flat-стиль. Ща ещё поразбираюсь.

UPD:

В свойствах кнопки делаешь вот так:

post-6695-0-08188700-1337878079_thumb.pn

В коде делаешь вот так:


using System.Windows.Forms;

namespace BtnTest
{
public partial class Form1 : Form
{
public Color BtnClr;
public bool IsGameAvailable;
public bool AddAmmo;

public Form1()
{
InitializeComponent();
button1.BackColor = Color.Blue;
}

private void Button1MouseDown(object sender, MouseEventArgs e)
{
BtnClr = ((Button)sender).BackColor;
((Button)sender).BackColor = Color.Red;
}

private void Button1MouseUp(object sender, MouseEventArgs e)
{
((Button)sender).BackColor = Color.Blue;
//if (IsGameAvailable)
//{
if (AddAmmo)
{
AddAmmo = false;
MessageBox.Show("Add ammo = false!");
}
else
{
AddAmmo = true;
MessageBox.Show("Add ammo = true!");
}
//}
}
}
}
using System.Drawing;

Ссылка на комментарий
Поделиться на другие сайты

Надо чтобы работал как Flat a выгледел иначе, для Flat эти настройки в VC существуют, для остальных нет. За инфу спасибо, MouseEventArgs с этим можно что то сделать.

Я видел люди пишут классы, но пока не попалось готовых (всяка хрень).

Ссылка на комментарий
Поделиться на другие сайты

А, BackColor можно задать и в свойствах кнопки - ставишь там Blue, тогда из конструктора формы строчку про цвет можно убрать. И "работал как flat" - это фигня какая-то, т.к. в обоих случаях это кнопка, а flat - это просто стиль, которым его винда рисует.

Ну как, получилось? :)

Ссылка на комментарий
Поделиться на другие сайты

Вот так получилось: ed22704751380c81ada4f7f2a1fba880.jpg

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyButton
{
public partial class Form1 : Form
{
bool AddAmmo = false;
public Form1()
{
InitializeComponent();
}
//**************************************************************
private void button1_MouseDown(object sender, MouseEventArgs e)
{
AddAmmo = false;
button1.BackColor = System.Drawing.Color.Green;
}
private void button1_MouseUp(object sender, MouseEventArgs e)
{
AddAmmo = true;
button1.BackColor = System.Drawing.Color.Goldenrod;
}
//*************************************************************
}
}

			this.button1.BackColor = System.Drawing.Color.Goldenrod;
this.button1.Location = new System.Drawing.Point(84, 106);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 1;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = false;
this.button1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.button1_MouseDown);
this.button1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.button1_MouseUp);

Теперь кнопка без защелки, любого типа.

Ссылка на комментарий
Поделиться на другие сайты

Как убрать зависимость элементов в окне от клавиши "Tab" , но чтобы при этом кнопки могли управляться горячими клавишами?

	    private void button1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F1)
{
this.F1();
button1.BackColor = System.Drawing.Color.Green;
}
}

private void button2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F2)
{
this.F2();
button2.BackColor = System.Drawing.Color.Green;
}
}

Ссылка на комментарий
Поделиться на другие сайты

Я не искал в поисковике ответов. Я полез в MSDN по контролам.

По информации из MSDN

Я понял так. Пишешь функцию обработчика PreviewKeyDown

Все контролы перебираешь и связываешь с этим обработчиком.


private void Special_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Down:
case Keys.Up:
e.IsInputKey = true;
break;
}
}

После срабатывания Special_PreviewKeyDown фукус с элемента на элемент не должны перемещаться. Работает это или нет не знаю.

Ссылка на комментарий
Поделиться на другие сайты

Я использовал KeyboardHook, так как все равно фокусировка на кнопки теряется, т.е. из окна игры не будет фокусировки на кнопки.

Так если у тебя фокус на окне игры - как же он на кнопке в другом окне окажется в это же время? Не проще ли горячими клавишами пользоваться?

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.