Я знаю, что этот вопрос задавали более чем несколько раз, но пока я не смог найти для него хорошее решение.
У меня есть панель с другим контролем над ней.
Я хочу нарисовать линию на ней и поверх всех элементов управления на панели
Я столкнулся с тремя типами решений (без них работал так, как я хотел):
-
Получить рабочий стол DC и рисовать на экране.
Это будет использоваться для других приложений, если они перекрывают форму. -
Переопределение панели "CreateParams":
=
protected override CreateParams CreateParams {
get {
CreateParams cp;
cp = base.CreateParams;
cp.Style &= ~0x04000000; //WS_CLIPSIBLINGS
cp.Style &= ~0x02000000; //WS_CLIPCHILDREN
return cp;
}
}
//ПРИМЕЧАНИЕ. Я также попытался отключить WS_CLIPSIBLINGS
а затем вычертите линию OnPaint().
Но... Поскольку панель OnPaint вызывается перед OnPaint элементов управления в ней,
рисунок элементов управления внутри просто рисует поверх линии.
Я видел, как кто-то предлагает использовать фильтр сообщений для прослушивания сообщений WM_PAINT и использовать таймер, но я не думаю, что это решение является либо "хорошей практикой", либо эффективным.
Что бы вы сделали? Решите, что элементы управления внутри закончили рисование после X ms, и установите таймер на X ms?
Этот снимок экрана показывает панель с отключенными WS_CLIPSIBLINGS и WS_CLIPCHILDREN.
Синяя линия окрашена в панель OnPaint и просто нарисована текстовыми полями и ярлыками.
Красная линия окрашена сверху только потому, что она не окрашивается с панели OnPaint (она фактически нарисована в результате нажатия кнопки)
3rd: Создание прозрачного слоя и рисование поверх этого слоя.
Я создал прозрачный элемент управления, используя:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
Проблема по-прежнему заключается в том, что прозрачный элемент управления находится поверх панели и всех ее элементов управления.
Я попытался вывести его на передний план, используя: "BringToFront()", но, похоже, это не помогло.
Я поместил его в обработчик OnPaint() управления линией.
Должен ли я попытаться положить его в другое место?
- Это также создает проблему с другим контролем над панелью. (улавливание щелчков мыши и т.д.)
Любая помощь будет принята с благодарностью!
** EDIT: Черная линия - образец того, что я пытался сделать. (используется краска для окон)