Как сделать прозрачным groupbox

Добавил пользователь Дмитрий К.
Обновлено: 10.09.2024

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

4 ответа

Мы не могли сделать VB6.0 checkbox прозрачным. Не могли бы вы подсказать мне, как сделать флажок максимально прозрачным? Я искал в интернете, и многие источники указывают на то, что checkbox не может быть сделано таким же прозрачным.

Как сделать JFrame прозрачным? Я хочу сделать свой JFrame прозрачным. Пользователь должен видеть фон, когда мой JFrame находится поверх него.

Свойство transparent не работает для перекрывающихся элементов управления. Я предполагаю, что у вас есть ваша фотография в PictureBox?

1) возможно, проще всего разместить как ваше изображение, так и GroupBox в панели (вы задаете свойство BackgroundImage панели). Это сработает. Тогда GroupBox и панель технически не перекрываются, но GruopBox является дочерним элементом панели. Это не требует кода, и вы видите именно то, что получаете непосредственно в конструкторе форм.

2) Нарисуйте изображение непосредственно на форме самостоятельно в одном из методов OnPaint или OnPaintBackground формы.

тема слишком старая, но я просто помещу свой ответ для обмена с другими, я не такой эксперт, но я нашел его, просто если я сделаю фоновое изображение панели любым изображением и помещу GroupBox внутри панели, а затем в обратном цвете GroupBOx выберите Web > Transparent. ничего другого, что должно было бы сделать всю работу,

Если вы ищете решение WPF, попробуйте следующее. Убедитесь, что для параметра Window.AllowsTransparency установлено значение true

Если вы хотите сделать это в Visual Basic 6, вы можете сделать это с помощью следующего кода:-

Аннотация: Здесь вы познакомитесь с панелями Panel, GroupBox и RadioGroup, научитесь пользоваться "флажком" CheckBox и радиокнопками. В процессе изучения лекции создадите полезную утилиту.

Компонент Panel (Панель)

Компонент Panel находится на вкладке Standard и применяется для улучшения внешнего вида формы, а также для группировки нескольких компонентов. Этот компонент по своим свойствам немного напоминает форму. Если установить несколько других компонентов на Panel , то при смещении панели будут смещаться и компоненты, установленные на ней.

Изучим этот компонент на практике. Создайте новый проект, и установите на форму один компонент Panel . По умолчанию, свойству Caption панели присваивается то же имя, что и свойству Name , то есть прямо по центру панели выходит текст "Panel1". Нас это не устраивает. Очистим свойство Caption панели – просто удалите этот текст, ничего туда не вписывая.

Разберем другие полезные свойства этого компонента. Свойства семейства Bevel отвечают за внешний вид компонента:

BevelIner и BevelOuter имеют одинаковые значения, и отвечают за то, какой панель будет выглядеть – выпуклой или вогнутой. Попробуйте изменять значения этих свойств, и Вы все поймете.

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

Еще одно очень важное свойство – Align (Выравнивание). Это свойство часто используют не только у панелей, но и у многих других компонентов. Align имеет несколько значений:

  • AlBottom – указывает, что панель будет занимать весь низ формы. Когда размеры формы меняются, меняется и размер панели, но она по-прежнему занимает весь низ.
  • AlClient – указывает, что панель занимает все пространство формы. Если вы установили панель, и растянули ее по всему верху, а затем установили еще одну панель и указали значение alClient , то вторая панель займет все оставшееся место.
  • AlCustom – указывает пользовательские настройки. При изменении размеров формы такая панель останется, как при разработке дизайна.
  • AlLeft – занимает всю левую часть формы.
  • AlNone – выравнивания нет. Работает практически как AlCustom.
  • AlRight – занимает всю правую часть формы.
  • AlTop – панель вытягивается по всей верхней части формы.

Ранее мы создавали простой редактор текстов. Улучшим этот пример. Укажите у свойства Height ( высота ) панели значение 40. Свойство Top установите в 0. Тем самым мы прижали панель к самому верху формы. Свойству Align присваиваем значение alTop , растягивая панель по всему верхнему краю. Теперь, если пользователь станет менять размеры формы, сжимая окно или наоборот, растягивая, панель все равно будет занимать весь верх. Устанавливая на эту панель кнопки, мы получим типичную панель инструментов . Так и сделаем: установите на панель три кнопки, одну рядом с другой. На кнопках должен быть текст: "Сохранить", "Загрузить" и "Очистить".

На оставшееся внизу место помещаем компонент Memo , дважды щелкаем по свойству Lines , чтобы вызвать редактор текста, и удаляем из Memo весь текст. Свойству Align компонента Memo присвоим значение alClient , чтобы растянуть Memo по всему оставшемуся месту. Вот и все, мы имеем панель инструментов и рабочую область редактора текстов. Сохраните проект, скомпилируйте его и посмотрите, как меняются размеры панели и Memo при изменении размера окна. Запрограммировать кнопки вы сможете самостоятельно, используя пример из второй лекции.

Компоненты GroupBox и CheckBox

GroupBox во многом похож на обычную панель. Он предназначен для группировки схожих по смыслу компонентов. Текст из свойства Caption выходит не посреди панели, а вверху, создавая таким образом заглавие этой панели. При перемещении GroupBox , будут перемещаться и все компоненты, расположенные на нем.

Создайте новое приложение . Мы сделаем полезную утилиту, меняющую вид формы в зависимости от настроек. На форму установите компонент GroupBox , присвоив его свойствам Left и Top значение 6, чтобы прижать его к верхнему левому краю окна. В свойстве Caption этого компонента напишите текст " BorderIcons ". Поскольку обрамление компонента вплотную подходит к тексту – заголовку, с дизайнерской точки зрения будет нелишним добавить пару пробелов перед текстом, и столько же после него.

Мы уже знаем, что BorderIcons – это свойство формы, программирующее ее внешний вид. Это свойство имеет 4 значения, каждое из которых можно включить, либо выключить. Таким образом, нам нужно 4 классических "флажка", в которые можно будет поставить "галочку" или убрать ее. Роль таких флажков выполняет компонент CheckBox . Установите 4 CheckBox прямо на панель GroupBox , один над другим:

Внешний вид приложения

Измените свойство Caption этих компонентов, написав там, соответственно, "biSystemMenu", "biMinimize", "biMaximize" и "biHelp". Свойство Checked компонента CheckBox показывает включен ли компонент , другими словами, установлена ли в нем "галочка". У формы по умолчанию первые три значения включены, также сделаем и здесь – у первых трех компонентов CheckBox установите свойство Checked в True .

Компонент RadioGroup

Этот компонент также имеет вид панели и предназначен для группировки так называемых радиокнопок. Включенной может быть лишь одна такая радиокнопка. На рисунке 7.1 в правой части формы вы видите такую панель с установленными радиокнопками. Добавьте компонент RadioGroup на форму, в свойстве Caption установите текст "BorderStyle", не забывая про пробелы до и после текста. Устанавливать на этой панели радиокнопки значительно легче, чем кнопки CheckBox . Выделите эту панель и дважды щелкните по ее свойству Items . Откроется редактор текста, такой же, как у Memo . В этом редакторе нужно написать название каждой кнопки на отдельной строке. Введите следующие названия пунктов:

Как только вы нажмете "ОК" и закроете редактор, на панели RadioGroup появятся описанные кнопки. Ни одна из них не имеет включенного вида. Мы уже знаем, что можно включить только одну такую кнопку из списка. Компонент RadioGroup имеет свойство ItemIndex , которое указывает, какая кнопка в данный момент включена. По умолчанию, ItemIndex равен -1. Поскольку нумерация кнопок начинается с нуля, значение -1 означает, что ни одна кнопка не включена. Установите значение 0, включив тем самым первую кнопку (на форме одноименное свойство включено по умолчанию).

Ниже установите кнопку, написав на ней слово "Применить". Все, с дизайном окончено, переходим к программированию кнопки. Если вы еще не сохранили проект в новую папку, сделайте это сейчас. Свойству Name формы, как обычно, дайте имя fMain, модулю – просто Main, всему проекту в целом – FormViewer .

Вернемся к кнопке. Щелкните дважды по ней, создав процедуру обработки нажатия кнопки.

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

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

Примеры

В следующем примере кода создаются экземпляры и GroupBox два RadioButton элемента управления. Переключатели добавляются в поле группы, а поле Группа добавляется в Form .

Комментарии

GroupBoxОтображает рамку вокруг группы элементов управления с заголовком или без него. Используйте GroupBox для логической группировки коллекции элементов управления в форме. Поле группы — это контейнерный элемент управления, который можно использовать для определения групп элементов управления.

Обычно поле группы используется для хранения логической группы RadioButton элементов управления. Если у вас есть два поля группы, каждая из которых содержит несколько переключателей (также называемых переключателями), каждая группа кнопок является взаимно исключающей, задавая одно значение параметра для каждой группы.

Добавить элементы управления в можно с GroupBox помощью Add метода Controls Свойства.

Можно выбрать или получить фокус, только элементы управления, находящиеся в нем GroupBox . GroupBoxНевозможно выбрать или получить фокус. Дополнительные сведения о том, как этот элемент управления реагирует на Focus Select методы и, см. в следующих элементах Control : CanFocus , CanSelect . Focused ContainsFocus Focus , Select .

GroupBoxНе удается отобразить полосу прокрутки. Если требуется элемент управления, похожий на GroupBox , который может содержать полосу прокрутки, см Panel . элемент управления.

Конструкторы

Инициализирует новый экземпляр класса GroupBox.

Свойства

Получает объект AccessibleObject, назначенный элементу управления.

Возвращает или задает описание выполняемого по умолчанию действия элемента управления для использования клиентскими приложениями со специальными возможностями.

Возвращает или задает описание элемента управления, используемого клиентскими приложениями со специальными возможностями.

Возвращает или задает имя элемента управления, используемого клиентскими приложениями со специальными возможностями.

Возвращает или задает доступную роль элемента управления.

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

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

Возвращает или задает местоположение, в котором выполняется прокрутка этого элемента управления в ScrollControlIntoView(Control).

Получает или задает значение, указывающее, основано ли изменение размеров объекта GroupBox на его содержимом.

Данное свойство не применимо к этому классу.

Получает или задает поведение объекта GroupBox при включенном свойстве AutoSize.

Возвращает или задает цвет фона для элемента управления.

Возвращает или задает фоновое изображение, отображаемое на элементе управления.

Возвращает или задает макет фонового изображения в соответствии с перечислением ImageLayout.

Возвращает или задает значение BindingContext для элемента управления.

Возвращает расстояние в пикселях между нижней границей элемента управления и верхней границей клиентской области контейнера.

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

Получает значение, указывающее, можно ли для свойства ImeMode установить активное значение с целью включения поддержки IME.

Возвращает значение, указывающее, может ли элемент управления получать фокус.

Определяет, могут ли вызываться события в элементе управления.

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

Возвращает или задает значение, указывающее, была ли мышь захвачена элементом управления.

Возвращает или задает значение, указывающее, вызывает ли элемент управления выполнение проверки для всех элементов управления, требующих проверки, при получении фокуса.

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

Возвращает или задает высоту и ширину клиентской области элемента управления.

Возвращает название организации или имя создателя приложения, содержащего элемент управления.

Возвращает объект IContainer, который содержит коллекцию Component.

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

Возвращает или задает контекстное меню, связанное с элементом управления.

Возвращает или задает объект ContextMenuStrip, сопоставленный с этим элементом управления.

Возвращает коллекцию элементов управления, содержащихся в элементе управления.

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

Возвращает параметры, необходимые для создания дескриптора элемента управления.

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

Возвращает привязки данных для элемента управления.

Возвращает или задает курсор по умолчанию для элемента управления.

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

Возвращает размер пустого пространства в пикселях между элементами управления, которое определено по умолчанию.

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

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

Получает структуру Padding, содержащую параметры внутренних полей для элемента управления GroupBox.

Возвращает внутренние промежутки в содержимом элемента управления в пикселях.

Получает размер элемента управления по умолчанию.

Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время.

Получает значение DPI для устройства, на котором сейчас отображается элемент управления.

Получает прямоугольник, представляющий размеры GroupBox.

Получает значение, указывающее, находится ли базовый класс Control в процессе удаления.

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

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

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

Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.

Возвращает или задает плоский стиль для внешнего вида элемента управления группы.

Возвращает значение, указывающее, имеется ли на элементе управления фокус ввода.

Возвращает или задает шрифт текста, отображаемого элементом управления.

Возвращает или задает высоту шрифта элемента управления.

Возвращает или задает цвет элемента управления.

Возвращает дескриптор окна, с которым связан элемент управления.

Возвращает значение, указывающее, содержит ли элемент управления один или несколько дочерних элементов.

Возвращает или задает высоту элемента управления.

Возвращает или задает режим редактора метода ввода элемента управления.

Получает или задает режим IME элемента управления.

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

Возвращает или задает значение, указывающее, является ли элемент управления видимым для приложений со специальными возможностями.

Указывает, является ли один из предков этого элемента управления узлом и этим сайтом в Десигнмоде. Это свойство доступно только для чтения.

Возвращает значение, указывающее, был ли удален элемент управления.

Возвращает значение, указывающее, имеется ли у элемента управления связанный с ним дескриптор.

Возвращает значение, указывающее, отображается ли зеркально элемент управления.

Получает кэшированный экземпляр механизма размещения элемента управления.

Возвращает или задает расстояние в пикселях между левой границей элемента управления и левой границей клиентской области его контейнера.

Возвращает или задает координаты левого верхнего угла элемента управления относительно левого верхнего угла его контейнера.

Возвращает или задает расстояние между элементами управления.

Возвращает или задает размер, являющийся верхней границей, которую может указать метод GetPreferredSize(Size).

Возвращает или задает размер, являющийся нижней границей, которую может указать метод GetPreferredSize(Size).

Возвращает или задает имя элемента управления.

Возвращает или задает заполнение в элементе управления.

Возвращает или задает родительский контейнер элемента управления.

Возвращает размер прямоугольной области, в которую может поместиться элемент управления.

Возвращает имя продукта сборки, содержащей элемент управления.

Возвращает версию сборки, содержащую элемент управления.

Возвращает значение, указывающее, осуществляет ли в настоящий момент элемент управления повторное создание дескриптора.

Возвращает или задает область окна, связанную с элементом управления.

Это свойство устарело.

Возвращает или задает значение, указывающее, перерисовывается ли элемент управления при изменении размеров.

Возвращает расстояние в пикселях между правой границей элемента управления и левой границей клиентской области его контейнера.

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

Получает значение, определяющее масштабирование дочерних элементов управления.

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

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

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

Возвращает или задает высоту и ширину элемента управления.

Возвращает или задает последовательность перехода по клавише TAB между элементами управления внутри контейнера.

Получает или задает значение, показывающее, может ли пользователь нажать клавишу TAB для передачи фокуса в элемент управления GroupBox.

Возвращает или задает объект, содержащий данные об элементе управления.

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

Возвращает или задает расстояние в пикселях между верхней границей элемента управления и верхней границей клиентской области его контейнера.

Получает родительский элемент управления, не имеющий другого родительского элемента управления Windows Forms. Как правило, им является внешний объект Form, в котором содержится элемент управления.

возвращает или задает значение, определяющее, следует ли использовать Graphics класс (GDI+) или TextRenderer класс (GDI) для отрисовки текста.

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

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

Возвращает или задает ширину элемента управления.

Данное свойство не применимо к этому классу.

Методы

Уведомляет клиентские приложения со специальными возможностями об указанном перечислении AccessibleEvents для указанного дочернего элемента управления.

Уведомляет клиентские приложения со специальными возможностями об указанном перечислении AccessibleEvents для указанного дочернего элемента управления.

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

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

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

Помещает элемент управления в начало z-порядка.

Возвращает значение, указывающее, является ли указанный элемент управления дочерним элементом.

Создает новый объект специальных возможностей для объекта GroupBox.

Создает для элемента управления новый объект с поддержкой специальных возможностей.

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

Создает новый экземпляр коллекции элементов управления для данного элемента управления.

Создает объект Graphics для элемента управления.

Создает дескриптор для элемента управления.

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

Удаляет дескриптор, связанный с элементом управления.

Освобождает все ресурсы, занятые модулем Component.

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

Начинает операцию перетаскивания.

Поддерживает отрисовку в указанном точечном рисунке.

Получает возвращаемое значение асинхронной операции, представленное переданным объектом IAsyncResult.

Определяет, равен ли указанный объект текущему объекту.

Возвращает форму, в которой находится элемент управления.

Устанавливает фокус ввода на элемент управления.

Получает указанный объект AccessibleObject.

Получает значение, указывающее, как будет вести себя элемент управления, когда его свойство AutoSize включено.

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

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

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

Служит хэш-функцией по умолчанию.

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

Возвращает следующий или предыдущий элемент среди дочерних элементов управления в последовательности клавиши TAB.

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

Возвращает границы, внутри которых масштабируется элемент управления.

Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.

Возвращает значение указанного бита стиля элемента управления для данного элемента управления.

Определяет, находится ли элемент управления на верхнем уровне.

Возвращает объект Type для текущего экземпляра.

Скрывает элемент управления от пользователя.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Вызывается после добавления элемента управления в другой контейнер.

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

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

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

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

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

Вызывает событие GotFocus для указанного элемента управления.

Вызывает событие LostFocus для указанного элемента управления.

Вызывает событие Click для указанного элемента управления.

Вызывает событие Paint для указанного элемента управления.

Вызывает событие PaintBackground для указанного элемента управления.

Определяет, является ли символ входным символом, который распознается элементом управления.

Определяет, является ли заданная клавиша обычной клавишей ввода или специальной клавишей, нуждающейся в предварительной обработке.

Преобразует логическое значение DPI в эквивалентное значение DPI DeviceUnit.

Преобразует размер из логических единиц в единицы устройства путем его масштабирования к текущему DPI и округлением вниз до ближайшего целого значения ширины и высоты.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

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

Парни, подскажите как вывести на экран полупрозрачный png или gif, чтобы кусок PictureBox был прозрачным, вот к примеру картинка:

Изображение

Первый элемент PictureBox содержит изображение стены, а второй PictureBox наложен сверху и содержит изображение двери. Дверь тут полукруглая, верхние углы у картинки прозрачные. Вот собственно в этом и проблема как сделать так чтоб PictureBox содержащий рисунок двери был тоже прозрачным? Поставил BackColor - Transparent в свойствах PictureBox и ничего.
Понимаю что вопрос из разряда rtfm, но я блин в поиске уже утонул, помогите плз.


Код: Выделить всё Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

PictureBox2.BackColor = Color.Transparent
PictureBox1.Image = Image.FromFile("img\wall.jpg")
PictureBox2.Image = Image.FromFile("img\door.jpg")

Я поставил даже так:


Код: Выделить всё Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

PictureBox2.BackColor = Color.Empty
PictureBox1.Image = Image.FromFile("img\wall.jpg")
PictureBox2.Image = Image.FromFile("img\door.jpg")

Всё равно PictureBox выглядывает. Жду помощи.

Вот файл проекта на всякий случай.

Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера.

AnarCky Подскажи пожалуйста как указать прозрачный цвет? С .jpg я пробовал - то же самое получается. Есть мысль прозрачные углы картинки с дверью залить к примеру малиновым цветом, а потом программно исключить его или сделать прозрачным, но не будут ли края PictureBox выглядывать опять?

вот. покопался в книжке. проверь - должно работать:
Код: Выделить всё
Dim bmp As New Bitmap
bmp = Image.FromFile("img\door.jpg")
Dim g As Graphics = Graphics.FromImage(bmp)
Dim backColor As Color = bmp.GetPixel(3, 3) 'этот метод используется чтоб получить цвет пикселя координатами (3; 3)
bmp.MakeTransparent(backColor)
PictureBox2.Image = bmp

впринципе, если точно знаешь цвет фона, то можно сразу подставить в метод MakeTransparent()

Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера.

Бейсик ругается на Dim bmp As New Bitmap :
"Overload resolution failed because no accessible 'New' accepts this number of arguments."

Я нашёл в мсдн пару зацепок, но не представляю как это применить:

Я не въезжаю как всё это дело оформить

Рисуй сразу на форме.
Код: Выделить всё Public Class Form1
Dim ImgDoor As Bitmap = Image.FromFile("img\door.jpg")
Dim ImgWall As Bitmap = Image.FromFile("img\wall.jpg")

Private Sub Form1_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated
Me.DoubleBuffered = True
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim G As Graphics = e.Graphics
G.DrawImage(ImgWall, 59, 25)
G.DrawImage(ImgDoor, 182, 150)
End Sub
End Class

Nord777
Рисовать на форме не вариант - потом придется контролированть клики и курсор мыши в границе двери

И в чем проблема? +3 строки кода. Зато всё под контролем.

Код: Выделить всё Public Class Form1
Dim ImgDoor As Bitmap = Image.FromFile("img\door.jpg")
Dim ImgWall As Bitmap = Image.FromFile("img\wall.jpg")
Dim DoorRect As Rectangle

Private Sub Form1_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated
Me.DoubleBuffered = True
DoorRect = New Rectangle(182, 150, ImgDoor.Width, ImgDoor.Height)
End Sub

Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
If DoorRect.Contains(e.Location) Then MsgBox("Door clicked")
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim G As Graphics = e.Graphics
G.DrawImage(ImgWall, 59, 25)
G.DrawImage(ImgDoor, DoorRect)
End Sub
End Class

Nord777 , любопытно спасибо за вариант.

Ну а если удобнее использовать именно PictureBox? Есть же какая-то возможность сделать именно сам PictureBox прозрачным насколько я понял из справки (ведь сам по себе PictureBox способен содержать прозрачный рисунок):

То есть получается если задать этот самый ControlStyles.SupportsTransparentBackColor как true, то запись типа:
PictureBox2.BackColor плюс-чего-то-там
выдаст нам прозрачный PictureBox с картинкой?
Ведь будет легче и естественнее использовать PictureBox с такими заданными свойствами, чем отрисовывать это всё прямо на форме.

Свойство BackColor не поддерживает прозрачные цвета, если бит стиля ControlStyles.SupportsTransparentBackColor не задан как true
Может кто-то знает как или где установить ControlStyles.SupportsTransparentBackColor в true

Control.Setstyle(. true)
Только вам это не поможет.
Control.Region поможет, туда копайте.

вот небольшой пример:
Код: Выделить всё Imports System.Drawing.Drawing2D
Imports System.Drawing

Public Class Form1
Dim GP As New GraphicsPath
Dim P As New Pen(Color.Black, 5)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.ControlBox = False
Me.Size = New Size(380, 300)
Me.Text = ""


Dim FF As New FontFamily("Arial BLack")
Dim Pnt As New PointF(0.0!, 50.0!)
Dim Rect As Rectangle = Me.ClientRectangle
Dim FS As FontStyle = FontStyle.Regular
Dim SF As New StringFormat()
SF.LineAlignment = StringAlignment.Center

GP.AddEllipse(Me.ClientRectangle)
GP.AddString("Round", FF, FS, 100.0!, Pnt, SF)
Me.Region = New Region(GP)
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

e.Graphics.FillPath(Brushes.AliceBlue, GP)
e.Graphics.DrawPath(P, GP)
End Sub

2 программист
порасуждай логически: у тебя анимированноое изображение, это по сути набор кадров. и один и тот же пиксель, на одном и другом кадре может иметь разный цвет (и скорее всего он и будет иметь разный цвет). так что здесь графический редактор в руки и вперед. и кстати у меня пересохранение в .jpg (статичный) с указанием прозрачного цвета работает.

Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера.

Nord777 , спасибо ещё раз - я поиграл вчера с твоим кодом - всё это легко применяется и отдельно для PictureBox, только исчезает он вместе с картинкой - можешь как-нибудь попробовать наложить вместо букв картинку?
Ещё мне вот тут мысля пришла - у PictureBox есть свойство BackgroundImage, так вот - можно поместить это изображение позади основного рисунка (в пикчербоксе получится 2 картинки - одна над другой), и выводить на бэк-рисунок изображение того, что находится под PictureBox - получится такая себе эмуляция прозрачности. Есть у кого-нибудь такое решение?

AnarCky писал(а): и кстати у меня пересохранение в .jpg (статичный) с указанием прозрачного цвета работает.

в смысле работает? проект в студию плз

Nord777, спасибо ещё раз - я поиграл вчера с твоим кодом - всё это легко применяется и отдельно для PictureBox, только исчезает он вместе с картинкой - можешь как-нибудь попробовать наложить вместо букв картинку?

В общем я конечно пошаманил не совсем представляя что делаю:

Код: Выделить всё
Imports System.Drawing.Drawing2D
Imports System.Drawing

Public Class Form1
Dim GP As New GraphicsPath
Dim P As New Pen(Color.Black, 5)


'---БЛОК для PictureBox2---
Private Sub PictureBox2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
Dim FF As New FontFamily("Arial BLack")
Dim Pnt As New PointF(0.0!, 150.0!)
Dim Rect As Rectangle = PictureBox2.ClientRectangle
Dim FS As FontStyle = FontStyle.Regular
Dim SF As New StringFormat()
SF.LineAlignment = StringAlignment.Center

GP.AddEllipse(PictureBox2.ClientRectangle)
GP.AddString("Round", FF, FS, 100.0!, Pnt, SF)
PictureBox2.Region = New Region(GP)
End Sub

Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
e.Graphics.FillPath(Brushes.AliceBlue, GP)
e.Graphics.DrawPath(P, GP)


'---Блок для PictureBox3---
Private Sub PictureBox3_BackColorChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox3.BackColorChanged
Dim FF As New FontFamily("Arial BLack")
Dim Pnt As New PointF(0.0!, 150.0!)
Dim Rect As Rectangle = PictureBox3.ClientRectangle
Dim FS As FontStyle = FontStyle.Regular
Dim SF As New StringFormat()
SF.LineAlignment = StringAlignment.Center

GP.AddEllipse(PictureBox3.ClientRectangle)
GP.AddString("Round", FF, FS, 100.0!, Pnt, SF)
PictureBox3.Region = New Region(GP)
End Sub

Private Sub PictureBox3_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox3.Paint
e.Graphics.FillPath(Brushes.AliceBlue, GP)
e.Graphics.DrawPath(P, GP)
End Sub
'-------------------------------------------------------------------------------

Я вместо формы подставил этот код для PictureBox, и изменил события : для PictureBox2 - Click, а для PictureBox3 - BackColorChanged (ставил LoadCompleted, но эффекта не было).

Изображение

Вид в дизайнере:

Изображение

Если закомментировать блок для PictureBox3, и кликнуть на левой двери (PictureBox2), то получим такое:

Изображение

Если закомментировать блок для PictureBox2, то получим такое:

Изображение

Если раскомментировать оба блока и кликнуть на левой двери, то будет так:

Тут почему-то рисунок PictureBox3 появился на PictureBox2.

Короче такая фигня. Хз может она поможет если к примеру в рисунке двери залить каким-нибудь цветом прозрачные углы, а потом программно исключить его с помощью всей этой фишки. Или подложить под дверь бэкграундный рисунок (свойство пикчербокса BackgroundImage) и сделать его прозрачным, хз тут сам контейнер снановится прозрачным с рисунками или без.

Короче всё это фигня. Мне кажется можно попробовать под рисунок двери просто подложить бэкграунд и передавать ему изображение того, что находится под пикчербоксом. То есть снять координаты пикчербокса, его размеры, и сделать скриншот того что под ним и передать это бэкграунду. Если кто-то может - прошу помочь.

Применительно к твоему рисунку двери.
Код: Выделить всё Imports System.Drawing.Drawing2D

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim GP1 As New GraphicsPath
Dim Reg As New Region

Reg.MakeEmpty()
Reg.Union(New Rectangle(0, 33, 128, 95))

GP1.AddEllipse(New Rectangle(0, -1, 126, 75))
Reg.Union(GP1)
PictureBox2.Region = Reg
End Sub
End Class

Nord777 спасибо, но это всё полумеры. А если сложный рисунок будет?
Вот с помощью твоего кода получилосьчто-то похожее на решение, но с побочными эффектами:

Код: Выделить всё Public Class Form1

Dim ImgWall As Bitmap = Image.FromFile("img\wall.jpg")

Private Sub Form1_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated
Me.DoubleBuffered = True
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim G As Graphics = e.Graphics
G.DrawImage(ImgWall, 59, 25)
End Sub

End Class
(Файл проекта ниже)

Если отрисовать фоновый рисунок с помощью самой формы (в данном случае - стена), а сверху просто накладывать PictureBox со свойством BackColor=Transparent , то PictureBox станет прозрачным, но с небольшими глюками: PictureBox расположенный выше (PictureBox2), своей частью не закрытой рисунком будет просвечивать фон сквозь другой PictureBox расположенный ниже (PictureBox1):

Изображение

Соответственно сквозь более верхний PictureBox ничего не просвечивается (PictureBox3).
В принципе пользоваться можно.

Nord777 можно ли сделать кпримеру так: залить нейтральным цветом прозрачные участки рисунка, затем оформить их в виде фигуры и вырезать её из пикчербокса с помощью .Region как в твоём предыдущем посте? То есть не подгонять программно эллипс под рисунок двери, а как-то представить эти углы в виде фигуры да и вырезать нафиг, программно или хз. Определить по цвету эти ненужные пиксели и вырезать.

Public Class Form1
_
Public Shared Sub CopyMemory(ByVal DestData As Integer(,), ByVal SrcData As IntPtr, ByVal Size As Integer)
End Sub

Читайте также: