Содержимое панели не будет визуально обновляться в течение определенного времени, но впоследствии будет полностью очищено - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть форма с закрепленной картинкой, чтобы заполнить все это.В этой форме у меня есть панель, которая обычно невидима, и другая картинка;на панели у меня есть ярлык и еще одна панель с ярлыком.

Вот что ДОЛЖНО произойти, когда пользователь наводит курсор мыши на второй блок изображения:

  1. Изображение в блоке изображения меняется, и становится видимой первая панель, что делает видимыми вторую панель и обе метки
  2. Пользователь нажимает на вторую метку
  3. Обработчик OnClick второй метки изменяет текст первой метки, а вторая панель становится невидимой
  4. Таймер срабатывает на несколько секунд
  5. Сегмент кода в обработчике OnTick таймера приводит к изменению изображения во втором блоке изображений и превращению первой панели в невидимый

Вот что происходит:

  1. Изображение в окне рисунка изменяется, и первая панель становится видимой, что делает вторую панель и обе метки видимыми тоже
  2. Пользователь нажимает на вторую метку
  3. Обработчик OnClick второй метки устанавливает первую меткуtext в новую строку и устанавливает свойство Visible второй панели в false, НО вторая панель остается visible (хотя вы не можете с ним взаимодействовать), и текст первой метки пишется поверх старого текста
  4. Таймер тикает на несколько секунд
  5. Сегмент кода в OnTick таймераобработчик вызывает изменение изображения во втором окне изображения, и первая панель становится невидимой

Я перепробовал все, что мог придумать.Я назвал Invalidate, Update и Refresh для каждого элемента управления в форме, я назвал Application.DoEvents, я сбросил изображение на фоне PictureBox на себя, ничего.ДЕЙСТВИТЕЛЬНО странная часть состоит в том, что на шаге 5, когда передняя панель изображений перезагружается и все панели устанавливаются невидимыми, ничто не остается позади - только на те короткие несколько секунд между завершением обработчика OnClick и очисткой таймера OnTick возникают проблемы,Я могу отредактировать это для получения дополнительной информации, если это необходимо, но есть ли у кого-нибудь идеи, что делать?

Редактировать: Мне было указано, что я, вероятно, должен загрузить код для этого.Ну, этот код взломан, но все в порядке.Кроме того: есть некоторые странные дополнительные биты (в перечислении типов среди других), они для более поздних частей проекта и не имеют значения прямо сейчас.

    bool CountingHoverTime = false;
    int HoverTime = 0;
    int MasterTick = 0;

    enum GhostState { Stand, Speak, Pet, Ask };
    GhostState curState;

    public enum TalkType { HoverGen, Petted, Spont, TimerMsg, Response };

    private void Form1_Load(object sender, EventArgs e)
    {
        FormBorderStyle = FormBorderStyle.None;
        ShowInTaskbar = false;
        TopMost = true;
        ControlBox = false;
        Text = String.Empty;
        WindowState = FormWindowState.Maximized;


        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;
        this.TransparencyKey = Color.Transparent;

    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        //base.OnPaintBackground(e);
    }

    private void pictureBox2_MouseHover(object sender, EventArgs e)
    {
        if(curState == GhostState.Stand)
        {
            CountingHoverTime = true;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if((curState != GhostState.Ask) && (curState != GhostState.Stand))
        {
            MasterTick++;
            if(MasterTick > 10)
            {
                SetToBasic();
            }
        }
        else
        {
            MasterTick = 0;
        }

        if (CountingHoverTime)
        {
            HoverTime++;
            if (HoverTime > 4)
            {
                HoverTime = 0;
                curState = GhostState.Ask;
                Say("What can I do for you?", TalkType.HoverGen);
            }
        }
    }

    public void SetToBasic()
    {
        curState = GhostState.Stand;
        ghostBox.Image = Properties.Resources.stickStand1;
        TalkPanel.Visible = false;
    }

    public void Say(String speak, TalkType type)
    {
        mainText.Text = speak;
        if(type == TalkType.Response || type == TalkType.Spont)
        {
            curState = GhostState.Speak;
        }
        else
        {
            curState = GhostState.Ask;
        }
        ghostBox.Image = Properties.Resources.stickTalk;
        if (type == TalkType.HoverGen)
            OptionPanel.Visible = true;
        else
            OptionPanel.Visible = false;

        TalkPanel.Visible = true;
        backBox.Image = Properties.Resources.background;
        ghostBox.Invalidate();
        TalkPanel.Invalidate();
        mainText.Invalidate();
        backBox.Invalidate();
        ghostBox.Update();
        TalkPanel.Update();
        mainText.Update();
        backBox.Update();
        Application.DoEvents();
    }

    private void op1label_Click(object sender, EventArgs e)
    {
        curState = GhostState.Speak;
        OptionPanel.Visible = false;
        Say("No can do yet.", TalkType.Response);
    }

Редактировать 2: я собрал гифкувизуализация происходящего, спасибо HandbagCrab.

This is a demonstration of what's going wrong.

1 Ответ

0 голосов
/ 20 декабря 2018

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

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

Form setup

Я оставил фоныметки здесь розовые, но вы должны изменить их на цвет фона, чтобы они не были прозрачными.

Когда я запускаю форму, я получаю прозрачность и при нажатии на серую панель (я использовалпанель для имитации вашего человечка) показывает скрытую панель с метками.Нажатие на label2 обновляет текст на label1 (тот, который содержит текст «длинноватый текст»), полностью заменяя текст.

Здесь он используется (я не сделал gif, поскольку хотел, чтобы каждый шагбыть четко видимым)

Вот приложение, когда оно открыто:

In Action 1

Вот оно после нажатия на серое поле:

After clicking the grey box

Вот обновленный текст при нажатии на label2:

After clicking label 2

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

Вот я, щелкающий правой кнопкой мыши по рабочему столу через прозрачный участок:

Right clicking through the transparent section

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...