문제

.NET 2.0 TextBox 컨트롤에서도 MouseDown을 캡처할 수 있는 방법이 있습니까?상속된 Control 클래스에 이벤트가 있다는 것을 알고 있지만 TextBox에는 노출되지 않습니다.이벤트 핸들러를 재정의하는 방법이 있습니까?

또한 MouseDown 이벤트가 노출된 OpenNETCF TextBox2 컨트롤을 시도했지만, 무엇을 하든 핸들러가 실행되지 않습니다.

어떤 제안이 있으십니까?


마우스가있는 미친 모바일 장치는 무엇입니까?:)

예, Windows Mobile에는 실제 마우스가 없습니다. 그러나 Windows Mobile .NET이 마우스 이벤트를 지원하지 않는다고 착각하시는 것입니다.화면 클릭이나 이동은 여전히 ​​"마우스" 이벤트로 간주됩니다.전체 Windows에서 코드를 쉽게 이식할 수 있도록 이런 방식으로 수행되었습니다.이는 Windows Mobile에만 국한된 문제가 아닙니다.Windows의 TextBox 컨트롤에는 기본 마우스 이벤트도 없습니다.이 경우 저는 우연히 Windows Mobile을 사용하고 있었습니다.

편집하다:참고로 Windows Mobile은 임베디드 데스크톱 시스템과 Slim Terminal Services 클라이언트 또는 "WinTerms"에 자주 사용되는 WindowsCE 코어로 구축되었기 때문에 오랫동안 하드웨어 마우스를 지원해 왔습니다.대부분의 장치에는 연결할 포트가 없습니다.


.NET Framework에 따르면 텍스트 상자의 Mousedown 이벤트 핸들러가 지원됩니다.코드를 실행하려고하면 어떻게됩니까?

실제로 그것은 "Control"에서 상속받기 때문에 존재하는 것입니다. 모든 다른 양식 컨트롤.그러나 TextBox 클래스에서는 재정의되고 비공개로 변경되었습니다.따라서 Visual Studio의 IntelliSense에는 표시되지 않습니다.

그러나 실제로는 다음과 같이 코드를 작성할 수 있습니다.

textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);

그러면 컴파일되고 잘 실행됩니다. 유일한 문제는 TextBox 컨트롤을 탭할 때 textBox1_MouseDown()이 실행되지 않는다는 것입니다.이는 이벤트가 내부적으로 재정의되었기 때문이라고 가정합니다.내부적으로 이벤트에서 일어나는 일을 변경하고 싶지도 않습니다. 다른 이벤트와 마찬가지로 일부 사용자 지정 코드를 실행할 수 있도록 해당 이벤트에 자체 이벤트 핸들러를 추가하고 싶습니다.

도움이 되었습니까?

해결책

당신 말이 맞는 것 같습니다.버머.MouseOver 이벤트가 없습니다.

그러나 항상 .NET에서 작동하는 대체 방법 중 하나는 P/Invoke입니다.누군가 이미 .NET CF TextBox에 대해 이 작업을 수행했습니다.CodeProject에서 이것을 찾았습니다.

http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx

도움이 되었기를 바랍니다

다른 팁

나는 이 답변이 너무 늦었다는 것을 알고 있지만, 이 답변이 이를 발견한 누군가에게 유용할 수 있기를 바랍니다.또한 나 자신도 그것을 완전히 생각해 내지 못했습니다.나는 원래 OpenNETCF 보드에서 대부분의 정보를 찾았다고 생각하지만 아래에 입력된 내용은 내 응용 프로그램 중 하나에서 추출되었습니다.

OpenNETCF.Windows.Forms.IMessageFilter 인터페이스를 구현하고 이를 애플리케이션의 메시지 필터에 연결하여 mousedown 이벤트를 얻을 수 있습니다.

static class Program {
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    public static void Main() {
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

MouseUpDownFilter를 구현하는 방법은 다음과 같습니다.

public class MouseUpDownFilter : IMessageFilter {
    List ControlList = new List();

    public void WatchControl(Control buttonToWatch) {
        ControlList.Add(buttonToWatch);
    }

    public event MouseEventHandler MouseUp;
    public event MouseEventHandler MouseDown;

    public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m) {
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;

        // If the message code isn't one of the ones we're interested in
        // then we can stop here
        if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) {
            return false;
        }

        //  see if the control is a watched button
        foreach (Control c in ControlList) {
            if (m.HWnd == c.Handle) {
                int i = (int)m.LParam;
                int x = i & 0xFFFF;
                int y = (i >> 16) & 0xFFFF;
                MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0);

                if (m.Msg == WM_LBUTTONDOWN)
                    MouseDown(c, args);
                else
                    MouseUp(c, args);

                // returning true means we've processed this message
                return true;
            }
        }
        return false;
    }
}

이제 이 MouseUpDownFilter는 감시 컨트롤(예: 텍스트 상자)에서 MouseUp/MouseDown 이벤트가 발생할 때 발생합니다.이 필터를 사용하려면 감시 컨트롤을 추가하고 양식의 로드 이벤트에서 발생할 수 있는 이벤트에 할당합니다.

private void MainForm_Load(object sender, EventArgs e) {
    Program.mudFilter.WatchControl(this.textBox1);
    Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown);
    Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp);
}

void mudFilter_MouseDown(object sender, MouseEventArgs e) {
    if (sender == textBox1) {
        // do what you want to do in the textBox1 mouse down event :)
    }

}

그럴 수 있지.아마도 당신은 Windows Mobile에 대해 나보다 더 많이 알고 있을 것입니다.:) 방금 프로그래밍을 시작했습니다.그러나 일반 WinForms에서는 OnXxx 이벤트 핸들러 메서드를 원하는 대로 재정의할 수 있습니다.CF를 사용하여 Reflector를 간략히 살펴보면 Control, TextBoxBase 및 TextBox가 OnMouseDown 이벤트 핸들러를 재정의하는 것을 방지하지 않는다는 것을 알 수 있습니다.

이것을 시도해 보셨나요?:

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        //do something specific here
        base.OnMouseDown(e);
    }
}

대신 캡처할 수 있는 'OnEnter' 이벤트가 있나요?

아마도 텍스트 상자를 탭하거나 탭/클릭하여 텍스트 상자를 입력할 때도 캡처할 수 있을 것입니다. 그러나 이것이 문제가 되지 않으면 더 간단한 해결 방법이 될 수 있습니다.

.Net Framework에 따르면, TextBox의 MouseDown 이벤트 처리기 지원됩니다.코드를 실행하려고 하면 어떻게 되나요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top