Стирание границы TabControl в v bnet без создания CustomTabControl - PullRequest
0 голосов
/ 13 января 2020

Я хочу нарисовать свой собственный TabControl с другим стилем. У меня есть TabControl в моей форме, для которого я добавил обработчик события,

MainTabControl.DrawMode = TabDrawMode.OwnerDrawFixed
AddHandler MainTabControl.DrawItem, AddressOf TabControlPaint

TabControlPaint () - это метод, в котором я рисую свою собственную графику, используя переменные Bitmaps и буфера. (см. здесь )

Я не наследую от TabControl, потому что мое приложение имеет много форм и windows, и это заставит меня go для каждой формы и изменить TabControl для мой CustomTabControl. Я хотел бы иметь возможность рисовать свои собственные вкладки, перезаписывая событие DrawItem.

Я получил этот результат Снимок экрана , где вы можете видеть красную рамку, другой цвет фона для вкладок, даже выбранные различные цветовые схемы для вкладки.

Что я не могу понять, так это стереть эту белую трехмерную рамку, которая появляется только на выбранной вкладке . Я предполагаю, что рисуется сверху, когда метод OnPaint () вызывается после события drawItem (поправьте меня, если я ошибаюсь). Если я отлаживаю, эта белая трехмерная граница появляется после того, как метод TabControlPaint (тот, который я вызываю для события DrawItem) завершил выполнение.

Чтобы сделать вопрос более понятным, я хочу создать свой собственный TabControl, не переписывая метод OnPaint. То, что я придумала до сих пор, не было успешным только из-за этой windows нарисованной границы. Есть ли способ снять его? Или вы знаете какие-либо альтернативы?

1 Ответ

0 голосов
/ 14 января 2020

Мне удалось решить проблему:

For Each page As TabPage In MainTabControl.TabPages AddHandler page.Paint, AddressOf test Next

, затем в своей тестовой функции я рисую все, что хочу. В этом случае я просто нарисовал прямоугольник. Это не эффективно, но я думаю, что это можно улучшить с помощью двойной буферизации.

Private Sub test(ByVal sender As System.Object, ByVal e As PaintEventArgs)
    Dim ScreenGraphic As Graphics = Graphics.FromHwnd(MainTabControl.Handle)
    Dim myRect As Rectangle = MainTabControl.GetTabRect(MainTabControl.SelectedIndex)
    Dim borderColor As Pen = New Pen(Color.FromArgb(42, 38, 37), 5)
    myRect.X -= 1
    myRect.Y -= 1
    ScreenGraphic.DrawRectangle(borderColor, myRect)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...