아하
생활

생활꿀팁

그윽한백로58
그윽한백로58

C#에서 버튼 클릭시 눌려있음, 재클릭시 뗌 이벤트가 있을까요?

사진처럼 on / off 버튼이 있고 on을 누르면 on이 눌려있고 그 상태에서 on을 재클릭하면 on이 떼지고,

on이 눌린 상태에서 off를 클릭하면 on이 떼지고 off가 눌려있는 버튼을 구현하려고 합니다.

체크박스로 하려고 했는데 잘 안되더라구요. off클릭하면 on떼지는거는 on의 눌림효과 여부로 판단하면 될것 같은데

눌림효과를 C#에서 어떻게 할지 잘 모르겠습니다.

cw/ccw 마찬가지로 구현하려고 합니다. 그러한 이벤트가 C# forms에 있을까요?

링크를 주셔도 괜찮습니다.

55글자 더 채워주세요.
4개의 답변이 있어요!
  • 정겨운참매48
    정겨운참매48

    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; }