Настройка области Windows без отключения тематики

Кто-нибудь знает, как назначить область окна (SetWindowRgn или Control.Region в WinForms), не убивая тематику в неклиентской области?

Например, при запуске следующего создается строка заголовка без заголовка Windows 2000, граница и т.д.:

var form = new Form { Width=500, Height=500, BackColor = Color.Azure };
form.Text = "But soft, what light through yonder window breaks?";
var region = new Region (new Rectangle (Point.Empty, form.Size));
region.Exclude (new Rectangle (100, 100, 300, 300));
form.Region = region;
form.ShowDialog();

Я предполагаю, что это связано с этой статьей MSDN, в которой говорится:

Пока окно имеет не-NULL регион, примененный к нему (SetWindowRgn), UxTheme Manager предполагает, что это это специализированное окно и окно не будет использовать визуальные стили.

... следовательно, UxThemes принимает это специализированное окно. Есть ли способ явно сказать UxTheme Manager тему для окна?

Ответ 1

Ответ на ваш вопрос заключается в том, что вы не можете.

Но обходным путем, чтобы предоставить вам прозрачный раздел в вашей форме, было бы добавить стиль WS_EX_LAYERED расширенного окна в вашу форму. Затем вы можете сказать диспетчеру окон, что вы хотите использовать цветной цветной ключ, чтобы сделать вашу форму прозрачной:

SetLayeredWindowAttributes(
      Form.Handle, //  __in  HWND hwnd,
      RGB(0, 255, 0), //green is the color key     __in  COLORREF crKey,
      255, //window is opaque otherwise  __in  BYTE bAlpha,
      LWA_COLORKEY //use color-key (rather than per-pixel alpha)  __in  DWORD dwFlags
);

Затем вы можете поместить свою "прозрачную" область в зеленый цвет:

enter image description here

Который во время выполнения будет прозрачным:

enter image description here


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

enter image description here

См. также