Рисование прямоугольника над текстовым полем - PullRequest
0 голосов
/ 03 июня 2019

Моя проблема в том, что я хочу нарисовать прямоугольник поверх существующего текстового поля.

У меня есть решение, но текстовое поле всегда перерисовывается, чего я не хочу.

вот код

private bool isDragging = false;

void Form2_MouseMove(object sender, MouseEventArgs e)

{
    if (isDragging)
    {
        endPos = e.Location;
        Rectangle rect;
        if (endPos.Y > startPos.Y)
        {
              rect = new Rectangle(startPos.X, startPos.Y,
              endPos.X - startPos.X, endPos.Y - startPos.Y);
        }
        else
        {
              rect = new Rectangle(endPos.X, endPos.Y,
              startPos.X - endPos.X, startPos.Y - endPos.Y);
        }
        Region dragRegion = new Region(rect);
        this.Invalidate();
    }
}

void Form2_MouseUp(object sender, MouseEventArgs e)
{
    isDragging = false;
    this.Invalidate();
}
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp;
        cp = base.CreateParams;
        cp.Style &= 0x7DFFFFFF; //WS_CLIPCHILDREN
        return cp;
    }
}


void Form2_MouseDown(object sender, MouseEventArgs e)
{
    isDragging = true;
    startPos = e.Location;
}

// this is where we intercept the Paint event for the TextBox at the OS level  
protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case 15: // this is the WM_PAINT message  
                 // invalidate the TextBox so that it gets refreshed properly  
            Input.Invalidate();
            // call the default win32 Paint method for the TextBox first  
            base.WndProc(ref m);
            // now use our code to draw extra stuff over the TextBox  

            break;
        default:
            base.WndProc(ref m);
            break;
    }
}



protected override void OnPaint(PaintEventArgs e)

{
    if (isDragging)
    {
        using (Pen p = new Pen(Color.Gray))
        {
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            e.Graphics.DrawRectangle(p,
            startPos.X, startPos.Y,
            endPos.X - startPos.X, endPos.Y - startPos.Y);
        }
    }
    base.OnPaint(e);
}


проблема здесь в том, что текстовое поле мигает, а прямоугольник не устанавливается перед текстовым полем после завершения перетаскивания.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 03 июня 2019

Вы выключаете флаг: WS_CLIPCHILDREN в WndProc.

WS_CLIPCHILDREN значение равно 0x02000000, и вы отключаете его в своем коде:

cp.Style &= 0x7DFFFFFF; //WS_CLIPCHILDREN

WS_CLIPCHILDREN флаг установлен по умолчанию, он предотвращает мерцание дочерних элементов управления. Если вы не выключите флаг, мерцание прекратится.

Согласно документации на WS_CLIPCHILDREN : исключает область, занимаемую дочерними окнами, когда рисование происходит в родительском окне. Этот стиль используется при создании родительского окна.

Примечание. : при отключении флага более понятно использовать значение флага, которое вы хотите отключить:

cp.Style &= ~0x02000000; //WS_CLIPCHILDREN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...