Настройка области 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]()
См. также