2009-12-08 3 views
0

Возможно ли создать форму с элементами управления, разрешенными для рисования вне их (клиентской) области?unclipped Элементы управления Winforms?

В WPF это возможно не только, но и по умолчанию: ClipBounds = false;.

Как я могу сделать то же самое в WinForms?

ТИА,

ответ

1

Это не представляется возможным (легко) в Windows Forms. Windows Forms создает отдельное окно (HWND) для каждого элемента управления. HWND ограничены конкретным регионом для рисования, а когда вы их в гнездо, они автоматически обрезаются до их родительского HWND.

WPF работает вокруг этого, используя только один HWND для окна, поэтому, когда у вас есть «элементы управления», они просто отображаются WPF, а не фактическими дескрипторами окна ОС.

Лучшим обходным решением является создание большего «родительского» окна (потенциально прозрачного) и включение в него элементов управления, так что отсечения не произойдет. Трудно поправиться.

+0

Перехват сообщений Paint. особенно WM_NCPAINT, не можете ли вы выполнить рисование за пределами границ контроля или это будет скреплено? – jmayor

+0

WM_NCPAINT предназначен для неклиентских областей окна, таких как строка заголовка и т. Д. Он имеет совсем другой эффект, чем эффекты WPF ClipBounds. Мимика поведения WPF в Windows Forms в основном означает выполнение всей вашей собственной картины и полностью отказ от модели управления Windows Forms. В этот момент вам лучше просто разместить WPF в элементе управления ElementHost. –

1

Ну, вы можете. Вам нужно будет получить графический контекст для родительской формы или контейнера. Его легко получить с помощью Control.CreateGraphics(). Но это не сработает, особенно когда вы запускаете XP или с отключенным Aero. Родитель будет рисовать свой фон без учета ваших пикселей, вытирая их, когда ему будет предложено перекрасить себя. Очень заметно, если вы переместите другое окно по вашей форме.

Вы можете обойти это, разрешив родителям оповестить элемент управления, что он это сделал, передав объект e.Graphics в OnPaintBackground и OnPaint переопределив элемент управления. Не красиво.

Наличие контрольной жеребьевки на фоне контейнера было общим в дни контроля ActiveX. Они были известны как «элементы управления без окон», обычно используемые в VB6. В то время это было необходимо для обеспечения выполнения программ. Это немного вернулось в .NET 2.0 с классом ToolStripItem. И WPF, конечно. Также в браузерах. Написание таких элементов управления, однако, непросто, для замены функций, предоставляемых окном и классом Control, требуется код . ToolStripXxx отличается большим количеством ошибок в коде.

+0

Спасибо за ваши мысли. Они очень ценятся. Трудно было решить, принимать ли ваши или Рида. В конце концов я выбрал Рида для объяснения разницы с WPF. –

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