C#에서 버튼 클릭시 눌려있음, 재클릭시 뗌 이벤트가 있을까요?
사진처럼 on / off 버튼이 있고 on을 누르면 on이 눌려있고 그 상태에서 on을 재클릭하면 on이 떼지고,
on이 눌린 상태에서 off를 클릭하면 on이 떼지고 off가 눌려있는 버튼을 구현하려고 합니다.
체크박스로 하려고 했는데 잘 안되더라구요. off클릭하면 on떼지는거는 on의 눌림효과 여부로 판단하면 될것 같은데
눌림효과를 C#에서 어떻게 할지 잘 모르겠습니다.
cw/ccw 마찬가지로 구현하려고 합니다. 그러한 이벤트가 C# forms에 있을까요?
링크를 주셔도 괜찮습니다.

Windows Forms 응용 프로그램에서
Form에 버튼 btnOn, btnOff
두개 생성하고
WindowsAPI를 사용하면 해결됩니다.
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;
using System.Runtime.InteropServices;
namespace Label
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.btnOn.Click += new System.EventHandler(this.btnOn_Click);
this.btnOff.Click += new System.EventHandler(this.btnOff_Click);
}
private void btnOn_Click(object sender, EventArgs e)
{
this.ClickControl(this.btnOn);
}
private void btnOff_Click(object sender, EventArgs e)
{
this.ClickControl(this.btnOff);
}
private void ClickControl(Control control)
{
int x = 0;
int y = 0;
int longParameter = GetLongParameter(x, y);
WindowsAPI.SendMessage(control.Handle, WindowsAPI.WMLBUTTONDOWN, longParameter, WindowsAPI.MKLBUTTON);
//WindowsAPI.SendMessage(control.Handle, WindowsAPI.WMLBUTTONUP, longParameter, WindowsAPI.MKLBUTTON);
}
private int GetLongParameter(int low, int high)
{
return ((high << 16) | (low & 0xffff));
}
sealed class WindowsAPI
{
#region 메시지 보내기 - SendMessage(windowHandle, message, longParameter, wordParameter)
/// <summary>
/// 메시지 보내기
/// </summary>
/// <param name="windowHandle">윈도우 핸들</param>
/// <param name="message">메시지</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <param name="wordParameter">WORD 매개 변수</param>
/// <returns>처리 결과</returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal extern static IntPtr SendMessage(IntPtr windowHandle, int message, IntPtr longParameter, IntPtr wordParameter);
#endregion
#region 메시지 보내기 - SendMessage(windowHandle, message, longParameter, wordParameter)
/// <summary>
/// 메시지 보내기
/// </summary>
/// <param name="windowHandle">윈도우 핸들</param>
/// <param name="message">메시지</param>
/// <param name="longParameter">LONG 매개 변수</param>
/// <param name="wordParameter">WORD 매개 변수</param>
/// <returns>처리 결과</returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal extern static IntPtr SendMessage(IntPtr windowHandle, int message, int longParameter, int wordParameter);
#endregion
#region Field
/// <summary>
/// WM_LBUTTONDOWN
/// </summary>
internal const int WM_LBUTTONDOWN = 513;
/// <summary>
/// WM_LBUTTONUP
/// </summary>
internal const int WM_LBUTTONUP = 514;
/// <summary>
/// MK_LBUTTON
/// </summary>
internal const int MK_LBUTTON = 0x0001;
/// <summary>
/// MK_RBUTTON
/// </summary>
internal const int MK_RBUTTON = 0x0002;
/// <summary>
/// MK_SHIFT
/// </summary>
internal const int MK_SHIFT = 0x0004;
/// <summary>
/// MK_CONTROL
/// </summary>
internal const int MK_CONTROL = 0x0008;
/// <summary>
/// MK_MBUTTON
/// </summary>
internal const int MK_MBUTTON = 0x0010;
#endregion
}
}
}
이 방법으로 해결은 되나 추천하고 싶지는 않습니다.
리소스 이미지 버튼 UP/DOWN 을 추가하여 (따로 구해야함) 이미지를 변경처리 하거나
이미지 BackColor을 변경하는 방법을 하는 것이 더 좋아 보입니다.
안녕하세요.
CheckBox를 2개 화면에 얹은 다음에 Appearance 속성을 Apperance.Button으로 변경해 주세요. 그런 다음에 각 CheckBox의 CheckedChanged 이벤트 핸들러에서 각 컨트롤의 Checked 속성을 가지고 서로의 Checked 속성을 변경시켜 주시면 될 것 같습니다.
질문주신 내용에 맞는 답변이 되었는지는 잘 모르겠습니다만 어떤 식으로든 도움이 되었으면 합니다.
안녕하세요~! 아하(Aha) 지식답변자 다라닝입니다.
질문하신 내용에 대하여 아래와 같이 답변 드립니다.
변수를 선언하심이 어떠실까요?
bool 변수 하나 선언하고 클릭하는거 여부에따라 true , false 로 전환해주면서
옵션을 먹이면 고민하셨던것보다 쉽게 결과를 얻으실수 있습니다.
부족하지만 도움이 되셨기를 바라며 추가적인 문의가 필요하시면 답변 부탁드려요!
그런 용도라면 Radio box를 보통 사용합니다.
전체 그룹중에 하나만 선택할 수 있게요.
원하시는 바와 같이 구현하실려면 on 버튼을 클릭했을 때 on 버튼을 enable=False로 해주고, off 버튼을 enable=True 해주시면 되겠네요
off버튼은 반대로 로직을 구현해주시고요. 밑에는 간단한 예제입니다.
private void onButton_Click(object sender, EventArgs e) { onButton.Enabled = false; offButton.Enabled = true; } private void offButton_Click(object sender, EventArgs e) { onButton.Enabled = true; offButton.Enabled = false; }