gastraler Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 Есть вот такая кнопка: 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 не красивая кнопка, не нравится она мне.Как сделать чтобы нормальная кнопка не залипала и меняла цвет? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 В каком смысле - "залипает"? Попробуй с разными стилями и бордерами в свойствах кнопки в дизайнере поиграться. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 24 мая, 2012 Автор Поделиться Опубликовано 24 мая, 2012 Играюсь уже с утра. Надо чтобы нажал изменила цвет, отпустил, цвет вернулся на исходную.Кнопка без фиксации. Но чтобы не Flat. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 Халтурный способ: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; } }}Работает? Или что-то ещё требовалось? Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 24 мая, 2012 Автор Поделиться Опубликовано 24 мая, 2012 Нет, или я не так записал. 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; } }Также залипает. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 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 (когда кнопку отпускают) - кнопка красится в родной цвет и выполняется какой-то дополнительный код. Надеюсь, теперь вопросов нет. Задача состояла в том, чтобы проверять состояние левой кнопки мыши - если нажата, то красить кнопку в другой цвет, если не нажата - красить в родной обратно. На отладке же прекрасно видно, что при выполнении обработчика события Click() прицепиться ни к чему было нельзя. Мораль - больше пользоваться отладчиком. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 24 мая, 2012 Автор Поделиться Опубликовано 24 мая, 2012 Вот я подставляю кнопку в твой код: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; } } } }}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);и получаю вот это: а надо вот это: Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 Так блин, на второй картинке и есть flat-стиль. Ща ещё поразбираюсь.UPD:В свойствах кнопки делаешь вот так:В коде делаешь вот так: Показать контент 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; Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 24 мая, 2012 Автор Поделиться Опубликовано 24 мая, 2012 Надо чтобы работал как Flat a выгледел иначе, для Flat эти настройки в VC существуют, для остальных нет. За инфу спасибо, MouseEventArgs с этим можно что то сделать.Я видел люди пишут классы, но пока не попалось готовых (всяка хрень). Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 мая, 2012 Поделиться Опубликовано 24 мая, 2012 А, BackColor можно задать и в свойствах кнопки - ставишь там Blue, тогда из конструктора формы строчку про цвет можно убрать. И "работал как flat" - это фигня какая-то, т.к. в обоих случаях это кнопка, а flat - это просто стиль, которым его винда рисует. Ну как, получилось? Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 27 мая, 2012 Автор Поделиться Опубликовано 27 мая, 2012 Вот так получилось: 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);Теперь кнопка без защелки, любого типа. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 27 мая, 2012 Автор Поделиться Опубликовано 27 мая, 2012 Как убрать зависимость элементов в окне от клавиши "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; } } Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 27 мая, 2012 Поделиться Опубликовано 27 мая, 2012 Например, [так]. Эта статья - шестая по счёту ссылка из выборки вот по [такому] запросу. Не совсем понимаю, почему ты её не нашёл. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 27 мая, 2012 Автор Поделиться Опубликовано 27 мая, 2012 Вот чего я нашел: Pro.dot.NET.2.0.Windows.Forms.and.Custom.Controls.pdf Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 мая, 2012 Поделиться Опубликовано 27 мая, 2012 Я не искал в поисковике ответов. Я полез в 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 фукус с элемента на элемент не должны перемещаться. Работает это или нет не знаю. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 28 мая, 2012 Автор Поделиться Опубликовано 28 мая, 2012 Не то, нужен метод Сontrol.Focus или Control.Select.Эх на работу вызывают Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 28 мая, 2012 Автор Поделиться Опубликовано 28 мая, 2012 Я использовал KeyboardHook, так как все равно фокусировка на кнопки теряется, т.е. из окна игры не будет фокусировки на кнопки. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 28 мая, 2012 Поделиться Опубликовано 28 мая, 2012 В 28.05.2012 в 11:11, gastraler сказал: Я использовал KeyboardHook, так как все равно фокусировка на кнопки теряется, т.е. из окна игры не будет фокусировки на кнопки.Так если у тебя фокус на окне игры - как же он на кнопке в другом окне окажется в это же время? Не проще ли горячими клавишами пользоваться? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения