2013-04-23 2 views
0

Я создаю программу WinForm на C#, и я хочу настроить ее скин или интерфейс с помощью PNG или других файлов изображений. Меня интересуют не только кнопки, но и фон, индикатор выполнения и другие элементы управления. Я понимаю из большинства моих исследований, что TransparentKey используется для формы неправильной формы, тогда панель поддерживает прозрачность PNG.C# - Пользовательский интерфейс из изображения

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

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

Вот кусок мой текущий код:

public List<Image> BaseImage = new List<Image>(); 
public List<Image> ClickedImage = new List<Image>(); 
public List<object> ControlAction = new List<object>(); 
public List<Image> HoverImage = new List<Image>(); 
private int counter = 0; 

public Control CreatePanel(Image BaseImage, Image HoverImage, Image ClickedImage, 
    string Name, int x, int y, ButtonAction action) 
{ 
       this.BaseImage.Add(BaseImage); 
       this.HoverImage.Add(HoverImage); 
       this.ClickedImage.Add(ClickedImage); 
       int width = BaseImage.Width; 
       int height = BaseImage.Height; 


       Actions Action = new Actions(); 
       EventHandler SelectedAction = null; 

       switch (action) 
       { 
        case ButtonAction.Cancel: 
         SelectedAction = Action.Cancel; 
         break; 

        case ButtonAction.Exit: 
         SelectedAction = Action.Exit; 
         break; 

        case ButtonAction.Minimize: 
         SelectedAction = Action.Minimize; 
         break; 

        case ButtonAction.Open: 
         SelectedAction = Action.Open; 
         break; 

        case ButtonAction.Pause: 
         SelectedAction = Action.Pause; 
         break; 

        case ButtonAction.Start: 
         SelectedAction = Action.Start; 
         break; 
       } 


       Simplify.Invoke(() => 
       { 
        this.newPanel.SuspendLayout(); 

       this.newPanel.Location = new System.Drawing.Point(x, y); 
       this.newPanel.Name = Name; 
       this.newPanel.TabIndex = counter; 
       this.newPanel.Size = new System.Drawing.Size(width, height); 
       this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255); 
       this.newPanel.BackgroundImage = this.BaseImage[counter]; 

       this.newPanel.Click += new EventHandler(SelectedAction); 
       this.newPanel.MouseEnter += new EventHandler(PanelHover); 
       this.newPanel.MouseDown += new MouseEventHandler(PanelClicked); 
       this.newPanel.MouseLeave += new EventHandler(PanelLeave); 

       this.newPanel.ResumeLayout(false); 
        }); 

       ControlAction.Add(action); 
       counter += 1; 

    return newPanel; 
} 

private void PanelClicked(object sender, MouseEventArgs e) 
{ 
       this.newPanel.SuspendLayout(); 
       this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255); 
       this.newPanel.BackgroundImage = ClickedImage[newPanel.TabIndex]; 
       this.newPanel.Size = new Size(ClickedImage[newPanel.TabIndex].Width, ClickedImage[newPanel.TabIndex].Height); 
       this.newPanel.ResumeLayout(false); 
} 

private void PanelHover(object sender, EventArgs e) 
{ 
        this.newPanel.SuspendLayout(); 
        this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255); 
        this.newPanel.BackgroundImage = HoverImage[newPanel.TabIndex]; 
        this.newPanel.Size = new Size(HoverImage[newPanel.TabIndex].Width, HoverImage[newPanel.TabIndex].Height); 
        this.newPanel.ResumeLayout(false); 
} 

private void PanelLeave(object sender, EventArgs e) 
{ 
        this.newPanel.SuspendLayout(); 
        this.newPanel.BackColor = Color.FromArgb(0, 255, 255, 255); 
        this.newPanel.BackgroundImage = BaseImage[newPanel.TabIndex]; 
        this.newPanel.Size = new Size(BaseImage[newPanel.TabIndex].Width, BaseImage[newPanel.TabIndex].Height); 
        this.newPanel.ResumeLayout(false); 
} 

Мой код выше создает панель, которая функционирует как кнопка. Его действие берется из класса Действия, которые в основном просто назначают метод, назначаемый при щелчке пользователем. Я меняю состояние управления, заменяя его BackgroundImage, в то же время изменяя его размер, чтобы избежать получения обрезанной области.

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

Дополнительная информация - Я использую .NET Framework 2.0

ответ

1

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

Я бы рекомендовал использовать WPF (основание презентации Windows). Он предлагает настраиваемые элементы управления, а также поддерживает аппаратную ускоренную графику.

С winforms вы получите мерцающий экран, проблемы с изменением размера и перерисовкой, с которыми вы не столкнетесь с wpf.

+0

Да, я испытал эту мерцающую проблему, но мне удалось решить ее, сделав DoubleBuffer. Кроме того, я использую .NET Framework 2.0. Разве нет альтернативного пути? Хотя я попытаюсь изучить WPF, если это действительно рекомендуется. – CudoX

+0

Вы не сможете использовать двойную буферизацию во всех элементах управления. Я пережил это в прошлом. Если вам действительно нужен интерфейс, богатый графикой, рекомендуется WPF. –

+0

Я понимаю. Я просмотрел несколько видеороликов и прочитал много статей и статей о WPF. Кажется, что это действительно рекомендуется для настройки графических интерфейсов. Я буду переносить свой проект на .NET Framework 3.0 вместо этого, чтобы использовать WPF. Большое спасибо за ваши ответы. – CudoX

Смежные вопросы