Курсор мыши исчезает, когда текстовое поле при редактировании ToolStripDropDown - PullRequest
0 голосов
/ 29 августа 2011

У меня есть пользовательский элемент управления с RichTextBox и двумя кнопками на нем.Я пытаюсь показать, что в ToolStripDropDown на ToolStripButton нажмите.Я использую ToolStripControlHost, чтобы поместить свой элемент управления в ToolStripDrowDown.Когда я нажимаю ToolStripButton на панели инструментов формы, я показываю раскрывающийся список в некоторой позиции и фокусируюсь на элементе управления ToolStripControlHost.Указатель мыши остается над ToolStripButton, а курсор находится на RichTextBox.Но когда я начинаю редактировать RichTextBox, указатель мыши исчезает, и я вижу его только тогда, когда он не в форме прямоугольника.Как я могу это исправить?

Вот мой код:

private void toolBtnNote_Click(object sender, EventArgs e)
{

   dropDownClosed = false;
   noteChanged = false;

   tsdd = new ToolStripDropDown();
   this.tsdd.Opened += new EventHandler(tsdd_Opened);
   this.tsdd.AutoSize = true;

   NoteEdit ne = new NoteEdit();
   ne.NoteText = note ?? "";
   // appears when user clicks first button at my control
   ne.OkClick += new NoteEdit.NoteEditEvent(ne_OkClick);
   // appears when user clicks second button at my control
   ne.CancelClick += new NoteEdit.NoteEditEvent(ne_CancelClick);

   this.tbh = new ToolStripControlHost(ne, "noteEdit");
   this.tbh.Padding = new Padding(0);
   this.tbh.AutoSize = false;
   this.tbh.Size = ne.Size;

   this.tsdd.Items.Add(tbh);
   this.tsdd.Padding = new Padding(0);
   this.tsdd.Closing += new ToolStripDropDownClosingEventHandler(tsdd_Closing);
   // show toolstripdrowdown at specific position at DataGridView         
   this.tsdd.Show(dgvMarks, cellRect.Location + new Size(0, cellRect.Height));

   while (!this.dropDownClosed)
   {
       Application.DoEvents();
   }

   if(noteChanged) {...}
}

void ne_CancelClick()
{
    tsdd.Close();
}

void ne_OkClick()
{
    noteChanged = true;
    tsdd.Close();
}

void tsdd_Opened(object sender, EventArgs e)
{
    tbh.Focus();
}

void tsdd_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    dropDownClosed = true;
}

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

Я нашел решение. Не лучше, но это работает. Я просто симулирую клик на показанном RichTextBox с WinApi вот так:

public class WinApiHelper
{
    private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002;
    private const UInt32 MOUSEEVENTF_LEFTUP = 0x0004;

    [DllImport("user32.dll")]
    private static extern void mouse_event(
        UInt32 dwFlags, // motion and click options
        UInt32 dx, // horizontal position or change
        UInt32 dy, // vertical position or change
        UInt32 dwData, // wheel movement
        IntPtr dwExtraInfo // application-defined information
        );

    public static void SendClick(Point location)
    {
        Cursor.Position = location;
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, new System.IntPtr());
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, new System.IntPtr());
    }     
}

private void toolBtnNote_Click(object sender, EventArgs e)
{
        dropDownClosed = false;
        noteChanged = false;

        dgvMarks.Focus();
        tsdd = new ToolStripDropDown();
        this.tsdd.Opened += new EventHandler(tsdd_Opened);
        this.tsdd.AutoSize = true;

        NoteEdit ne = new NoteEdit();
        ne.NoteText = note ?? "";
        ne.OkClick += new NoteEdit.NoteEditEvent(ne_OkClick);
        ne.CancelClick += new NoteEdit.NoteEditEvent(ne_CancelClick);

        this.tbh = new ToolStripControlHost(ne, "noteEdit");
        this.tbh.Padding = new Padding(0);
        this.tbh.AutoSize = false;
        this.tbh.Size = ne.Size;

        this.tsdd.Items.Add(tbh);
        this.tsdd.Padding = new Padding(0);
        this.tsdd.Closing += new ToolStripDropDownClosingEventHandler(tsdd_Closing);

        this.tsdd.Show(dgvMarks, cellRect.Location + new Size(0, cellRect.Height));
        // emulate click on richtextbox at dropdown 
        WinApiHelper.SendClick(tsdd.Location + new Size(ne.Rtb.Location) + new Size(5, 5));

        while (!this.dropDownClosed)
        {
            Application.DoEvents();
        }

        if (noteChanged)
        {...}
 }
0 голосов
/ 29 августа 2011

Это нормальное поведение, когда курсор мыши прячется, когда вы начинаете редактировать TextBox или RichTextBox. Он должен быть восстановлен при перемещении мыши. Следует также отметить, что вызов Cursor.Show не будет иметь эффекта, если вы попытаетесь вызвать его в TextChanged или что-то подобное.

...