Как нарисовать мой «пользовательский интерфейс управления» быстрее и эффективнее - PullRequest
0 голосов
/ 19 июля 2010

На самом деле я сделал пользовательский элемент управления, что его интерфейс похож на «стеклянные окна» в Windows Vista и Seven.Моим шаблоном был этот URL: extremestudio.ro/blog/?p=99

с использованием «Photoshop» и рисование каждого слоя с помощью классов рисования C # и .Net, я наконец-то нарисовал его.На первом шаге я создаю класс растрового изображения, а затем каждый слой будет нарисован на нем с использованием графического контура и кистей и т. Д.

вот элемент управления: стеклянная панель (сначала необходимодобавьте файл «refle.png» к ресурсам вашего проекта, а затем добавьте класс в проект, затем создайте, ...) этот элемент управления наследуется от Panel в пространстве имен форм


protected override void OnCreateControl()
    {
        draw();
        BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
        Parent.Move += new EventHandler(Parent_Move);
        base.OnCreateControl();
    }

    void Parent_Move(object sender, EventArgs e)
    {
        draw();
    }
public void draw()
    {

        if (Width < 20 || Height < 20)
        {
            return;
        }
        Bitmap b = new Bitmap(Width, Height);
        Graphics gr = Graphics.FromImage(b);
        GraphicsPath gp=new GraphicsPath();
        LinearGradientBrush br;
        gr.SmoothingMode = SmoothingMode.HighSpeed;

        //draw shadow(black glow)
        for (int i = 0; i < 10; i++)
        {
            gp = DrawRoundRect(i, i, Width - i * 2 - 1, Height - i * 2 - 1, 7);
            br = new LinearGradientBrush(Bounds, Color.FromArgb(i * 3, Color.Black), Color.FromArgb(i * 3, Color.Black), LinearGradientMode.Vertical);
            gr.DrawPath(new Pen(br, 4), gp);
            br.Dispose();
        }

        //fill white 50
        gp = DrawRoundRect(9, 9, Width - 19, Height - 19, 7);
        br = new LinearGradientBrush(Bounds, Color.FromArgb(30, Color.White), Color.FromArgb(30, Color.White), LinearGradientMode.Vertical);
        gr.FillPath(br, gp);

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

Я думаю (не помню), также я использую метод переопределения "onPaint ()", ... но программа потерпела крах.потому что событие рисования происходит последовательно.

ОК,

Моя проблема заключается в низкой эффективности этого элемента управления при перемещении и изменении размера родительской формы.потому что это работает, потому что вызов метода «draw» для элемента управления и когда вызов метода получил много, это будет замедлять работу приложения и, что более важно, сильно загружать процессор.

Я хочу, чтобы вы узналимне способ нарисовать пользовательский интерфейс этого элемента управления

1 с использованием точечной сети 2.0

2-эффективный

есть есть способ рисоватьПользовательский интерфейс, использующий DirectX, ...? (Я имею в виду не WPF)

, если нет никакого способа, я удалю отражающую часть кода, которая вызывает высокую загрузку ЦП.

спасибо.

спасибо всем за внимание.

Я удаляю все коды, которые замедляют работу программы.Я упрощаю это до простой границы и тени на нем.и это все еще прекрасно.

но мой вопрос об использовании DirectX для рисования элементов управления все еще жив.

1 Ответ

1 голос
/ 23 октября 2010

Используйте свойство DoubleBuffered.(Установите true.)
Рисование будет работать в десять раз быстрее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...