Полупрозрачная панель с элементами управления внизу - PullRequest
0 голосов
/ 02 марта 2011

У меня есть пользовательский элемент управления, который я использую в качестве резиновой ленты, которая рисует синюю рамку и полупрозрачную середину.Я управляю событиями мыши вниз / переместить, чтобы изменить размер панели.Кажется, что все работает нормально, когда вызывается событие перемещения мыши, все рисует, как я и ожидал, но когда мышь перестает двигаться, некоторые пользовательские элементы управления под полупрозрачностью перерисовываются сверху.Игра с z-порядком ничего не делает.

Вот прозрачная панель:

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
                return cp;
            }
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            pe.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 101, 135, 196)), this.ClientRectangle);
            pe.Graphics.DrawRectangle(Pens.DarkBlue,
              pe.ClipRectangle.Left,
              pe.ClipRectangle.Top,
              this.Width - 1,
              this.Height - 1);
        }

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            //do not allow the background to be painted 
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
        }

1 Ответ

0 голосов
/ 03 марта 2011

Итак, оказывается, что это довольно сложная проблема с полупрозрачностью (даже если Microsoft сделала это в Explorer и т. Д.). В конце концов я нашел решение, где середина теперь полностью прозрачна, а резиновая полоса - это просто граница.

Граница все еще отрисовывается под определенными элементами управления, поэтому для каждого элемента управления мы добавляем в их событие Paint оператор, который вызывает ruberBand.Invalidate(), если резиновая полоса видна. Эй, Престо, резаная резиновая полоса, которая вытягивается над элементами управления.

IMO это все же лучше, чем использование DrawReversibleRectangle, потому что вы можете использовать его внутри панелей для автопрокрутки по краю, и, кроме того, оно не мерцает.

...