VB6 ssTab странности

Я использую элемент управления ssTab (это, вероятно, вся моя проблема) в программе VB6, и я рисую данные в Picturebox, расположенном на вкладке 0. Когда я перерисовываю график (например, после изменения размера окна), первый Я снимаю флажок:

Picture2.Line (0, 0)-(Picture2.Width, Picture2.Height), RGB(255, 255, 255), BF

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

Моей первой попыткой грубо исправить это было добавление изменения вкладки обратно на вкладку 0 непосредственно перед приведенной выше командой Line:

SSTab1.Tab = 0 ' Select tab containing PictureBox2
DoEvents

но это дает те же результаты - и исходная вкладка, и вкладка 0 теперь белые (хотя это меняет видимую вкладку обратно на вкладку 0).

Я заметил, что когда происходит раскрашивание стен, значение Picture2.Width намного больше, чем должно быть. Если видна вкладка 0, ширина Picture2.Width варьируется от 7180 до 21225 Twips, когда я изменяю размер окна. Когда я выбираю вкладку 1 и изменяю размер, Picture2.Width имеет порядок 82180 (высота остается там, где должна быть).

Я знаю, что SStab немного глючит, но кто-нибудь знает какие-то обходные пути? Я, вероятно, смогу собрать исправление (перекрасить фон на обеих вкладках в серый цвет после перерисовки), но я хотел бы понять, почему Picture2.Width теряет рассудок ...

Ответов (4)

Решение

SStab делает видимыми элементы управления на одной вкладке и скрывает другие элементы управления, делая свойство Left отрицательным (в основном «вне экрана»).

Это не должно влиять на свойство ширины - у вас есть собственный код изменения размера ??

Решение этой проблемы - написать код изменения размера для каждой вкладки. Это позволяет SSTab перемещать элементы за пределы экрана для других вкладок, а вам - перемещать элементы для текущей вкладки.

Вот код, который выполняет такое изменение размера.

Private Sub Form_Resize()

Select Case SSTab.Tab
Case TAB0_INDEX
    With fraTab0
        .Left = 150
        .Top = 320
        .Height = SSTab.Height - 400
        .Width = SSTab.Width - 200
    End With

Case TAB1_INDEX

    With txtMaxPixelData
        .Height = SSTab.Height - 850
    End With
    With txtPixelData
        .Height = txtMaxPixelData.Height
    End With
End Select
End Sub

Есть маленький звонок о sstab и ширине ... но, черт возьми, если я могу вспомнить что. Как-то я думаю, что это странно, когда элементы управления на вкладках не видны?

Ага ... он перемещает их "за пределы экрана" (устанавливает "влево" в очень большое отрицательное положение). По крайней мере, это то, что показывает мой быстрый и грязный тест.

Я думаю (не «знаю»), что элемент управления PictureBox часто напрямую связан с контекстом устройства формы ... поэтому меня не удивляет, что ему не нравится то, что с ним делает sstab.

Я бы порекомендовал перерисовывать только при переходе на эту вкладку ... если вы понимаете, о чем я. Или, возможно, обнаружение того, что графическое окно находится за пределами экрана, и пропуск обновления (все равно потребуется выполнить обновление, когда графическое окно перемещено).

Как только я понял причину странного поведения (благодаря DJ: «Способ, которым SStab делает элементы управления на одной вкладке видимыми, скрывая при этом другие элементы управления, - это делает свойство .Left отрицательным (в основном« вне экрана »)»), я понял, где была моя проблема.

Как сказал DJ, в тот момент, когда вы выбираете одну из вкладок, которая не содержит PictureBox, свойство PictureBox.Left становится очень отрицательным (например, -74000). В моем коде Form_Resize () у меня была следующая строка:

Picture2.Width = MainForm.Width - (Picture2.Left + PictureBoxMargin)

Что делает Picture2.Width еще большим положительным числом (моя большая ошибка).

Окончательным решением было создать общедоступную переменную Picture2LeftEdge, установить ее равной Picture2.Left в подпрограмме Form_Initialize () и изменить указанную выше строку изменения размера на:

Picture2.Width = MainForm.Width - (Picture2LeftEdge + PictureBoxMargin)

Спасибо за сверхбыстрые ответы, DJ и rbobby!