.NET Windows Forms прозрачное управление

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

15
задан Peter Mortensen 5 February 2010 в 18:42
поделиться

5 ответов

Можно ли сделать это в.NET/C#?

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

public class DarkenArea : Form
{
    public DarkenArea()
    {
        FormBorderStyle = FormBorderStyle.None;
        SizeGripStyle = SizeGripStyle.Hide;
        StartPosition = FormStartPosition.Manual;
        MaximizeBox = false;
        MinimizeBox = false;
        ShowInTaskbar = false;
        BackColor = Color.Magenta;
        TransparencyKey = Color.Magenta;
        Opacity = 0.5f;
    }
}

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

public void ShowWithoutActivate()
{
    // Show the window without activating it (i.e. do not take focus)
    PlatformInvoke.ShowWindow(this.Handle, (short)SW_SHOWNOACTIVATE);
}

необходимо сделать, это на самом деле потянуть почти исключает рисунок в области управления, Вы хотите остаться выделенными. Так переопределите обработчик OnPaint и подойдите к концу черный/синий или независимо от того, что Вы хотите, но, исключая область Вы хотите остаться яркими...

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // Do your painting here be exclude the area you want to be brighter
}

Последний необходимо переопределить WndProc для предотвращения мыши, взаимодействующей с окном, если пользователь пробует что-то сумасшедшее как нажатие на затемненную область. Что-то вроде этого...

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WM_NCHITTEST)
        m.Result = (IntPtr)HTTRANSPARENT;
    else
        base.WndProc(ref m);
}

, Которого должно быть достаточно для получения желаемого эффекта. Когда Вы готовы инвертировать эффект, Вы избавляетесь от экземпляра DarkenArea и продолжаете.

14
ответ дан 1 December 2019 в 02:56
поделиться

Большой потускневший прямоугольник хорош.

Другой способ сделать это был бы:

класс Формы основы Самокрутки говорит MyLightboxAwareForm класс, который слушал бы LightboxEvent от LightboxManager. Тогда имейте все свои формы, наследовались от MyLightboxAwareForm.

При вызове Show метод на любом Lightbox, эти LightboxManager широковещательно передал бы LightboxShown событие ко всему MyLightboxAwareForm экземпляры и то, чтобы заставлять их потускнеть самих.

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

И если Вы хотите прямоугольник, потускневший стиль, Вы могли бы просто поместить логику в MyLightboxAwareForm

1
ответ дан 1 December 2019 в 02:56
поделиться

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

В моем грубом образце, я назвал эту форму, 'LBform' и суть его - это:

public Rectangle ControlBounds { get; set; }
private void LBform_Load(object sender, EventArgs e)
{
    Bitmap background = new Bitmap(this.Width, this.Height);
    Graphics g = Graphics.FromImage(background);
    g.FillRectangle(Brushes.Fuchsia, this.ControlBounds);

    g.Flush();

    this.BackgroundImage = background;
    this.Invalidate();
}

Цвет. Fuchia является TransparencyKey для этой полупрозрачной формы, таким образом, Вы будете в состоянии видеть через оттянутый прямоугольник, и взаимодействовать с чем-либо в он - границы на основной форме.

В экспериментальном проекте я сделал на скорую руку для попытки этого, я использовал UserControl, динамично добавленный к форме, но Вы могли столь же легко уже использовать управление на форме. В основной форме (тот Вы затеняете) я поместил соответствующие нормы в нажатие кнопки:

private void button1_Click(object sender, EventArgs e)
{
    // setup user control:
    UserControl1 uc1 = new UserControl1();
    uc1.Left = (this.Width - uc1.Width) / 2;
    uc1.Top = (this.Height - uc1.Height) / 2;
    this.Controls.Add(uc1);
    uc1.BringToFront();

    // load the lightbox form:
    LBform lbform = new LBform();
    lbform.SetBounds(this.Left + 8, this.Top + 30, this.ClientRectangle.Width, this.ClientRectangle.Height);
    lbform.ControlBounds = uc1.Bounds;

    lbform.Owner = this;
    lbform.Show();
}

Действительно основной материал, что можно сделать собственный путь, если Вам нравится, но он просто добавляет usercontrol, затем устанавливая форму лайтбокса по основной форме и устанавливая свойство границ для рендеринга полной прозрачности в правильном месте. Вещи как перетаскивание формы и закрытие формы лайтбокса и UserControl не обрабатываются в моем быстром образце. О, и не забывайте располагать Графический экземпляр - я пропустил это также (поздно, я действительно устал).

Вот мой очень did-it-in-20-minutes демонстрация

8
ответ дан 1 December 2019 в 02:56
поделиться

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

1
ответ дан 1 December 2019 в 02:56
поделиться

Каждая форма имеет свойство "Opacity". Установите это к 50% (или 0.5 от кода) так будет наполовину прозрачно. Удалите границы и покажите, что это максимизировало перед формой Вы хотите сфокусироваться. Можно изменить BackColor формы или даже установить фоновое изображение для различных эффектов.

0
ответ дан 1 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: