Вверх ↑
Разработчик
Ответов: 26113
Рейтинг: 2126
#1: 2022-02-04 16:11:41 ЛС | профиль | цитата
andrestudio писал(а):
Эти опции для стекла. Я их пробовал, фигня какая то...

Вот и я про то же. А знаешь, почему граница как бы белая, а потому, что она не белая. Это альфа наложение цвета твоего окна на тень в режиме не альфа отрисовки. На любом цвете видно, что эта граница отличается по оттенку. Ты наверное видел, как картинка pf24bit отображается на контексте с альфа каналом, вот тут тоже самое. Так что закрасить средствами не GDI+ тоже не получится, тк перо обычного GDI не поддерживает альфа наложение. Но не лепить же в форму еще и графику на GDI+.

--- Добавлено в 2022-02-04 16:26:55

Короче, вот как отрисовывает у меня WM_NCPAINT:

...
var
...
DC: HDC;
aRect: TRect;
Pen: HPen;
OldPen: HPen;
OldBrush: HBrush;
...
WM_NCPAINT:
begin
GetWindowRect(Control.Handle, aRect);
OffsetRect(aRect, -aRect.Left, -aRect.Top);
DC := GetWindowDC(Control.Handle);
CNS_NC_SIZE := 1;
Pen := CreatePen(PS_SOLID, CNS_NC_SIZE*2-1, RGB(255, 0, 0));
OldPen := SelectObject(DC, Pen);
OldBrush := SelectObject(DC, GetStockObject(NULL_BRUSH));
Rectangle(DC, aRect.left, aRect.Top, aRect.Right, aRect.Bottom);
SelectObject(DC, OldBrush);
SelectObject(DC, OldPen);
DeleteObject(Pen);
end;
...
Константа CNS_NC_SIZE прописана вот так, чтобы можно было с ней экспериментировать по ходу пьесы

{$WRITEABLECONST ON}
const
CNS_NC_SIZE: Integer = 4;

А в конце метода _work_doShadow вызываю WM_NCPAINT

...
FreeLibrary(Hdwmapi);
end;
Control.Perform(WM_NCPAINT, 0, 0);
...
Короче, все эти эксперименты ни к чему хорошему пока не привели.

--- Добавлено в 2022-02-04 16:34:31

P.S. А с цветом там действительно полная задница творится -- https://docs.microsoft.com/en-us/windows/win32/dwm/composition-ovw#controlling-non-client-region-rendering
карма: 22

0
Редактировалось 5 раз(а), последний 2022-02-04 16:34:31