Как сделать этикетку прозрачной без мерцания во время загрузки - PullRequest
0 голосов
/ 08 июля 2011

У меня есть панель, и у меня есть картинка. Есть около 20 ярлыков, которые я должен показать на панели. Я хочу, чтобы фон метки был прозрачным, т.е. изображение в картинке отображается, а метка отображает только текст. Теперь, поскольку этикетки не обладают истинной прозрачностью, я сделал их дочерними для picturebox

 this.lbl1.Parent = pictureBox1;

Это решило мою непосредственную проблему, но теперь, когда форма загружается, всем ярлыкам требуется время, чтобы они стали видимыми и делают это по одному. Я был бы признателен, если бы вы, ребята, могли дать какое-то решение для этого.

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 08 июля 2011

Стандартное лекарство от мерцания - двойная буферизация. Но это не может решить этот вид мерцания. Это другой вид, вызванный тем, что несколько окон перекрывают друг друга. Каждый ярлык имеет свое собственное окно. Когда форма должна нарисовать себя, она рисует фон, оставляя отверстия для дочерних окон. Каждое дочернее окно затем принимает рисунок по очереди. И их дочерние окна рисуют себя рядом. Etcetera.

Это становится заметным, когда рисование выполняется одним элементом управления, без сомнения, в вашей графической коробке. Особенно, когда он отображает большое изображение, которое необходимо изменить. Отверстия для дочерних окон остаются неокрашенными, пока рисует графический блок. Они имеют белый фон, черный, когда вы используете свойства TransparencyKey или Opacity формы. Это может плохо контрастировать с изображением в графическом окне, и этот эффект воспринимается пользователем как мерцание.

Одно из немедленных лекарств - не использовать элементы управления, чтобы не платить за их окно. Метка очень удобна, но это огромная трата системных ресурсов, чтобы сжечь окно, просто чтобы отобразить строку. Вы можете просто реализовать графическое окно «Событие Paint» и нарисовать строки с помощью TextRenderer.DrawText (). По умолчанию в PictureBox включена двойная буферизация, поэтому изображение и текст отрисовываются плавно, без мерцания. Очевидным недостатком является то, что вы теряете удобство «укажи и нажми», тебе придется писать код.

Возможны и другие исправления. Один из них заключается в том, чтобы не дать графическому блоку оставить отверстия для дочерних окон. Он нарисует все изображение, над ним появляются метки. Это все еще мерцает, но не так заметно. Добавьте новый класс в свой проект и вставьте этот код:

using System;
using System.Windows.Forms;

internal class MyPictureBox : PictureBox {
    protected override CreateParams CreateParams {
        get {
            var parms = base.CreateParams;
            parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
            return parms;
        }
    }
}

Скомпилируйте и перетащите новый элемент управления Picture Box с верхней части панели инструментов на форму.

Еще один возможный обходной путь - сделать форму и всех ее потомков двойной буферизацией. Это совсем не ускоряет рисование, но все окна отображаются в буфере памяти, результат переносится на экран. Вы заметите задержку, но окно внезапно появляется на экране. Это называется композитингом. Winforms не поддерживает это напрямую, поскольку может иметь побочные эффекты, но его легко включить. Вставьте этот код в свой класс формы:

protected override CreateParams CreateParams {
    get {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
} 

Поддерживается XP и более поздними версиями. Остерегайтесь рисования артефактов.

1 голос
/ 08 июля 2011

или вы можете отказаться от меток и нарисовать текст самостоятельно:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  TextRenderer.DrawText(e.Graphics, "Label1", SystemFonts.DefaultFont,
                        new Point(10, 10), Color.Black, Color.Empty);
}
0 голосов
/ 08 июля 2011

Метка не поддерживает прозрачность, вы должны создать свой собственный уникальный элемент управления, вы можете увидеть эти примеры кода.

http://www.codeproject.com/KB/dotnet/transparent_controls_net.aspx http://www.codeproject.com/KB/vb/uLabelX.aspx

Пока

...