newbie1992 Ответов: 3

Как обрезать (сделать прямоугольное отверстие) панель в C#


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

я пытаюсь обрезать квадрат в середине панели
для примера
если бы размер моей панели был
Panel myPanel = new Panel () { Size = new Size (300, 800), Location = new Point(0,0); BackColor = Color.FromArgb(0,0,0); }

я хотел бы обрезать квадрат размером 250, 250 и расположенный в точке 25,25

Что я уже пробовал:

GraphicsPath graphicPath = new GraphicPath();
Rectangle myRec = new Rectangle(new point(25,25), new Size(250,250));
Panel myPanel = new Panel() { Size = new Size(300, 800), Location = new Point(0,0); BackColor = Color.FromArgb(0,0,0); }
myPanel.Region = new Region(myRec);


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

Graeme_Grant

Вы пытаетесь обрезать изображение???

newbie1992

Здравствуйте сэр
Нет... я не нащупываю образ..

Я стараюсь, чтобы моя панель обрезать..так что есть пустое пространство в середине панели

Graeme_Grant

Вы имеете в виду изменение размера панели?

newbie1992

Нет... не изменяю размер, но я пытаюсь просверлить "дырку" на панели
Отверстие имеет размер прямоугольника..
Это было похоже на карточку... я нарисовал на ней прямоугольник..
Я вырезал прямоугольник..
Я получу карту с отверстием в середине карты

Ralf Meier

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

Graeme_Grant

[перешел к решению 2 ниже]

newbie1992

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

3 Ответов

Рейтинг:
1

RickZeeland

В дополнение к хорошей статье, упомянутой Грэмом (которая действительно заслуживает очков) Создание Прозрачных Элементов Управления-Без Мерцания[^], следующее:

Если вы хотите "пробить дыру", эта статья может быть вам интересна: Фил Райт: Фабрика компонентов:. NET2, прозрачные элементы управления[^]
Также используя WS_EX_TRANSPARENT может представлять интерес: c# - какой-нибудь трюк, чтобы использовать непрозрачность на панели в форме окна Visual Studio? - переполнение стека[^]


Graeme_Grant

5 б

Рейтинг:
1

BillWoodruff

using System.Drawing;
using System.Windows.Forms;

namespace PathStuff
{
    public static class PathExtensions
    {
        public static void MakeHole(this Control cntrl, Rectangle xrect)
        {
            var region = new Region(cntrl.ClientRectangle);
            region.Exclude(xrect);

            cntrl.Region = region;
        }

        public static void MakeHoleCenteredProportional(this Control cntrl, int scaleX, int scaleY)
        {
            var rect = new Rectangle();
            rect.Size = cntrl.ClientRectangle.Size;
            Region region = new Region(rect);

            rect.Inflate(cntrl.Width / (scaleX * -2), cntrl.Height / (scaleY * -2));

            region.Exclude(rect);

            cntrl.Region = region;
        }
    }
}
Пример использования в форме:
using PathStuff;
namespace YourForm
{
    private void Form1_Load(object sender, EventArgs e)
    {
         PathExtensions.MakeHole(this, new Rectangle(100,100, 100, 100));

        // or
        PathExtensions.MakeHoleCenteredProportional(this Control cntrl, (this, 2, 2);
    
    }
};
Обратите внимание, что метод MakeHoleCenteredProportional делает отверстие центрированным в элементе управления; его размер определяется приведенными соотношениями: значение #2 создаст длину или ширину, равную половине размера соответствующего размера элемента управления.

Предложение: используйте двойную буферизацию с формами или UserControls с этим.


Рейтинг:
0

Graeme_Grant

[перенесено из комментариев - Спасибо за предложение RickZeeland]

Предполагается ли, что отверстие показывает объекты за ним? Как прозрачная дыра? Что-то вроде этого: Создание Прозрачных Элементов Управления-Отсутствие Мерцания[^][^]???


RickZeeland

Ваша рука помощи в CP land :)

Graeme_Grant

;)