Инвертирование (негатив) всех цветов формы C # - PullRequest
0 голосов
/ 16 марта 2012

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

Я хочу добавить кнопку «Снимок экрана» в это приложение. Я закодировал его (и он работает нормально), но я должен дать пользователю визуальную индикацию о снятом снимке экрана (НЕ любым MessageBox).

Один из лучших методов, который я мог придумать, - это на мгновение инвертировать все цвета и вернуться к нормальному состоянию (как снимок в Adobe Reader).

Может кто-нибудь помочь мне с этим?

Или с любой другой идеей, по которой, по вашему мнению, можно сделать снимок экрана.

Или даже Можете ли вы сказать мне, как «перекрасить» все окно?

Мне нужна подсказка, с которой я мог бы начать свое исследование! (

Заранее спасибо!

Обновление : Как временная душа, даже на кнопке захвата я сделал это: -

   this.BackColor = Color.White;  // My Original BackColor is Black
   Update();
   Refresh();
   Thread.Sleep(250);  // I don't want responsive UI... It's like Still Picture frame. :)
   this.BackColor = Color.Black;  // Back to Normal
   Update();
   Refresh();

1 Ответ

4 голосов
/ 16 марта 2012

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

  1. Сделать снимок экрана вашего приложения
  2. инвертировать его
  3. показать этот снимок экрана в прозрачной форме фейдера над окном.

Несколько инструкций для каждого шага:

  1. Создание скриншота (код должен находиться внутри вашего главного окна):

    Point lefttopinscreencoords = this.PointToScreen(new System.Drawing.Point(0, 0));
    Bitmap bg = new Bitmap(this.Width, this.Height);
    this.DrawToBitmap(bg, new Rectangle(0, 0, bg.Width, bg.Height));
    
  2. Преобразование изображения (здесь преобразование в оттенки серого):

    ColorMatrix cm = new ColorMatrix(new float[][]
                                                {
                                                    new float[] {0.3f, 0.3f, 0.3f, 0, 0},
                                                    new float[] {0.59f, 0.59f, 0.59f, 0, 0},
                                                    new float[] {0.11f, 0.11f, 0.11f, 0, 0},
                                                    new float[] {0, 0, 0, 1, 0, 0},
                                                    new float[] {0, 0, 0, 0, 1, 0},
                                                    new float[] {0, 0, 0, 0, 0, 1}
                                                });
    Bitmap BogusBackground = new Bitmap(this.Width, this.Height);
    ImageAttributes imageAttributes = new ImageAttributes();
    imageAttributes.SetColorMatrix(cm);
    Graphics g = Graphics.FromImage(BogusBackground);
    g.DrawImage(bg, new Rectangle(0, 0, BogusBackground.Width, BogusBackground.Height),
                0,0,
                bg.Width,
                bg.Height,
                GraphicsUnit.Pixel, imageAttributes);
    g.Dispose();
    
  3. Отличный фейдер формы, который вы можете найти здесь: http://www.codeproject.com/KB/cs/notanotherformfader.aspx?msg=1980689.Теперь, если вы создаете производную форму (из FormFader) с именем SplashForm, вы можете сделать что-то вроде этого:

    SplashForm sp = new SplashForm();
    sp.BackgroundImage = BogusBackground;
    sp.BackgroundImageLayout = ImageLayout.Stretch;
    sp.FadeOnLoad = false;
    sp.FadeOnClose = true;
    sp.FadeOpacity = 1;
    sp.Location = this.Location;
    sp.Height = this.Height;
    sp.Width = this.Width;
    sp.StartPosition = FormStartPosition.Manual;
    sp.Show();
    sp.Close();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...