2013-05-23 2 views
2

В соответствии с множеством вопросов здесь, на SO, лучший способ сделать фон прозрачной формы - установить ее на довольно неиспользуемый цвет (например, Magenta), а затем установить форму TransparencyKey на этот цвет.Прозрачный фон формы с MenuStrip?

this.BackColor = Color.Magenta; 
this.TransparencyKey = Color.Magenta; 

Эта часть работает хорошо. Проблема, с которой я сталкиваюсь, заключается в том, что она отлично работает , за исключением за MenuStrip. Полупрозрачный фон в MenuStrip + прозрачный фон в виде заканчивается так:

Вот что MenuStrip выглядит. Часть, где он становится пурпурной, - это когда сам MenuStrip настроен на полупрозрачность.

Это то, что моя функция инициализации формы выглядит следующим образом:

public frmMain() { 
    this.TransparencyKey = Color.Magenta; 
    InitializeComponent(); 
    this.BackColor = Color.Magenta; 

    if(Properties.Settings.Default.windowTheme == 0) { // theme is light 
     menuStrip.Renderer = new ToolStripProfessionalRenderer(new LightTheme()); 
    } 
    else if(Properties.Settings.Default.windowTheme == 1) { 
     menuStrip.Renderer = new ToolStripProfessionalRenderer(new DarkTheme()); 
    } 

    menuStrip.Invalidate(); 
} 

и мой пользовательский рендерер для MenuStrip (цвета только для тестирования прямо сейчас):

public class LightTheme: ProfessionalColorTable { 
    public override Color MenuItemSelected { 
     get { return Color.FromArgb(255, Color.Yellow); } 
    } 

    public override Color MenuStripGradientBegin { 
     get { return Color.FromArgb(255, Color.Black); } 
    } 

    public override Color MenuStripGradientEnd { 
     get { return Color.FromArgb(0, Color.Gainsboro); } 
    } 
} 

Что я на самом деле пытаясь выполнить здесь, форма прозрачна, а часть прозрачности MenuStrip прозрачна, поэтому вы можете видеть под ней рабочий стол. Есть ли лучший способ сделать это или способ исправить это?

+0

[Если вопросы включают «теги» в их названиях?] (Http://meta.stackexchange.com/q/19190/246945) – pravprab

ответ

1
public override Color MenuStripGradientEnd { 
    get { return Color.FromArgb(0, Color.Gainsboro); } 
} 

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

Слоистая функция Windows, встроенная в Windows, поддерживает два способа смешивания окна с рабочим столом, основной вызов winapi - SetLayeredWindowAttributes(). Winforms поддерживает параметр LWA_COLORKEY, который включен настройкой свойства TransparencyKey, но не параметром LWA_ALPHA. Вызывается «per-pixel alpha». Вы найдете много подсказок Google на pinvoke, которые вам нужно будет включить.

Но вы окажетесь за грубый сюрприз, вы увидите, что большая часть элементов управления на панели инструментов перестает работать. Текстовый рендеринг в Winforms выполняется GDI, api, который визуализирует текст с альфой 0. С неизбежным побочным эффектом, который, когда вы включаете per-pixel alpha, этот текст теперь прозрачен. Что вы могли бы назвать особенностью, но крайне непрактичным, так как вы не контролируете цвет рабочего стола, а также какие окна за вашим.

Это также можно заменить, заменив элементы управления и используя текстовый рендеринг api, как DirectWrite. Но это довольно много работы, и вы больше не получаете большую выгоду от Winforms. WPF поддерживает альфа-пиксель, он не использует стандартные элементы управления Windows.

+0

Итак, из того, что я понимаю, это просто большой беспорядок, и это звучит так, будто я бы лучше не беспокоиться. Я все еще являюсь промежуточным пользователем C#, поэтому я действительно не знаю, как это сделать. – Abluescarab

+1

Я тоже был промежуточным пользователем C#. Продлилось недолго, я беспокоился. Но да, не утруждайте себя этой работой в Winforms. –

+0

Большое спасибо за помощь. Я думаю, я просто добавлю градиент ... – Abluescarab

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