Как сделать кнопку прозрачной windows forms

Обновлено: 04.07.2024

Я хотел сделать мои окна прозрачными, поэтому удалил границы, элементы управления и все остальное, оставив только поле форм, затем я попытался сделать BackColor и TransparencyKey прозрачными, но это не сработало, поскольку BackColor не принимал прозрачный цвет. После поиска я нашел это в msdn:

К сожалению, это тоже не сработало. Я все еще получаю серый или любой другой выбранный цвет фона.

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

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

Надеюсь, кто-нибудь сможет осветить мой путь.

Изображение удалено, поскольку проблема решена

Раньше я использовал дикий цвет (цвет, который никто в здравом уме не использовал бы) для BackColor, а затем установил для него ключ прозрачности.

Простое решение получить прозрачный фон в форме окна - это перезаписать метод OnPaintBackground следующим образом:

(Обратите внимание, что base.OnpaintBackground(e) удален из функции)

В моем случае я сделал это со следующей настройкой:

Как видите, это смесь ранее данных.

Вот мое решение:

В конструкторах добавьте эти две строчки:

В вашей форме добавьте этот метод:

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

Мое решение было чрезвычайно близко к решению Джоэла (не Этертона, а просто Джоэла):

Что мне нравится, так это использование определенного цвета вместо реальной способности .jpg отображать прозрачность.

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

Установите изображение как свойство формы BackgrounImage и установите цвет как свойство формы TransparencyKey . Нет необходимости в изменении стиля элемента управления и в BackColor.

Я попробовал прямо сейчас, и у меня это сработало .

Я пробовал почти все это. но по-прежнему не мог работать. В конце концов я обнаружил, что это из-за проблем с 24-битными картами. Если вы попробовали растровое изображение размером менее 24 бит. Большинство из вышеперечисленных методов должны работать.

Поэтому убедитесь, что вы везде используете один и тот же BackColor и задаете этот цвет как TransparencyKey.

Просто установите Button свойство FlatStyle на "Flat" & hellip; и voilà! Я знаю, что это работает с PNG, но я не тестировал его с помощью GIF.

ответил(а) 2011-06-13T16:46:00+04:00 10 лет, 5 месяцев назад ответил(а) 2009-09-17T06:31:00+04:00 12 лет, 2 месяца назад

Я уверен, что вам нужно использовать PNG с WinForms для получения прозрачности изображения. Я знаю, что успешно использовал их.

EDIT: Когда я использовал PNG, я накладывал их на элемент управления Image на Form1.BackgroundImage; Я не использовал их в кнопках.

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

Следующий ответ проверяется в Visual Studio 2012 и работает с форматом backgroundImage BMP, GIF, PNG, а также JPG; созданный MS Paint.

Чтобы сделать свой фон видимым с помощью кнопки:

Перейдите в окно свойств кнопки. Затем измените FlatStyle и BackColor, как показано на рисунке ниже:

The FlatStyle is to be chosen as Flat

The color is to be chosen from Web Tab

Примечание. Цвет выбирается из веб-вкладки, а FlatStyle выбирается как Flat.

Но после этого кнопка будет прозрачной до тех пор, пока мышь не надвинется или она не будет выбрана или не нажата. При этом условии он будет в некотором непрозрачном цвете. Если вы хотите сделать его прозрачным, следуйте следующим изображениям и измените соответствующие цвета на прозрачные, как раньше. Цвета, которые необходимо изменить: "MouseOverBackColor" и "MouseDownBackColor".

enter image description here

enter image description here

Примечание. Если вы выберете всегда прозрачный, как показано, не будет никаких изменений в появлении кнопки, пока она будет действовать!

Есть залитый градиентом диалог. Нужно нарисовать кнопку, которая прозрачна. Т.е на ней есть изображение, а фон прозрачный



есть такое TRANSPARENT
это цвет родителя обычно применяют для бэк граундов.
ноя не уверен точно где тебе надо сбелать такое может вобще кнопка не нужна (в АПИ можно и без кнопок)
да и в МФЦ можно сделать всё картинкой
ведь цель кнопки не нажатие а красивое нажатие. а тебе надо тольго нажатее если без фона есть такое TRANSPARENT
это цвет родителя обычно применяют для бэк граундов.
Это применяют для рисования текста, как режим SetBkMode() Другого не видел ОООчень сомневаюсь, что это подойдет для кнопки, если я сомневаюсь-поправьте меня. Рисую кнопки, получается бред..
Есть Фон в виде градиента.. Левая часть имеет нарисованые буквы, а потому не растягивается. Поэтому bmp я порезал на две части, вывожу
Подготовка
// TODO: Add your message handler code here and/or call default

Сделал свою кнопку..И перерисовываю ее

CEliteAntiKeyLoggerDlg*dlg=(CEliteAntiKeyLoggerDlg*)GetParent();//Указатель на диалог dc.Detach();// TODO: Add your code to draw the specified item
Воощем получается бурда.. Картинка не растягивается нормально, а такое ощущение-что когда тянещь окно в ширину, то начинается рисоваться с конца правой стороны до растягивания. Вообщем как повтор.
А кнопки захватывают фон начиная от левой части бекграунда основного окна, а не там ,где надо.. Что я не так делаю? Картинка не растягивается нормально, а такое ощущение-что когда тянещь окно в ширину, то начинается рисоваться с конца правой стороны до растягивания.

Потрейси программу, что тут еще можно предложить. Иначе не отладить никогда.
Пойми, что происходит - станет понятно, что делать.

"Тянешь окно в ширину.."
Не понял - так что, размеры окна меняются? Тогда размеры битмэпа может тоже
должны меняться ?
Смысл то в том, что каждому пикселу окна соответствует пиксел
в мемДС. При этом мемДС может быть и значительно больще окна. Тогда окно - это
как щелочка, через которую рассматривают битмэп в мемДС. "Передвигая" окошко.
А если мемДС меньше окошка - то что ж получится ?

Но если я неправильно понял происходящее, то сорри.

Ну неужели никто не знает как убрать это чертово мигание..
Вот усовершенствованый код
Создаем список изображения с маской.
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

Вот так рисуем битмапы на заголовке

BmpNewMem.CreateCompatibleBitmap(pDCDest, rCl.Width(), rCl.Height());\ // TODO: Add your message handler code here and/or call default

И все равно ересь.
Если поставить у диалога стиль WS_CLIPCHILDREN тогда все нормально. Но сильное мигание при изменении размеров, если стиль убрать, тодга нет мигание, но фон под кнопкой не корректно прорисовывается..
Неужели никто не знает, как обойти проблему?

Добавлено 27.01.06, 13:36

Добавлено 27.01.06, 13:54
Вот что еще дал эксперимент
Поставил у верхних кнопок стиль TRANSPARENT и включил у диалога стиль WS_CLIPCHILDREN.
При перетаскивании окна кнопки стали пропадать..Тогда в OnSize поставил Invalidate()
Короче - мигают только верхние кнопки.. Все равно бред..

Неужели никто неработал с битмапом и контекстом устройства.. Я небольшой пример набросал, он не мерцает. Теперь осталось только приладить туда твои кнопки по тому же самому принципу.
Очень не советую рисовать фон в CEliteDlg::OnEraseBkgnd()

MOHAX
Твой пример я еще не смотрел.Но надеюсь мне поможет. Проблема из всего топика одна-вовремя выхватывать бекграунд диалога под кнопкой, создавая ощущения прозрачности..
Ага, вот глянул в блокноте..Ты только диалог нарисовал с фоном(как я понял.) Но диалог у меня не мерцает. У меня либо мерцают кнопки, но нормально фон под ними перерисовывается, либо наоборот-кнопки не мерцают ,но фон не корректно перерисовывается.

Добавлено 28.01.06, 21:04
Вот что еще мне посоветовали..
Нужно выдерать кусок фона диалога, и отрисовывать его в..фоне кнопки..Говорят помогает, хотя еще толком не проверял.
Т.е. копировать весь фон в память а затем

Форма является основным компонентом графического интерфейса программы. Именно на ней размещаются управляющие интерфейсы.

Рассмотрим некоторые из свойств формы, которые влияют на её внешний вид.

Объявляем форму

Для того что бы объявить форму, нам надо добавить библиотеку System.Windows.Forms.dll

После объявляем форму $main_form

Отобразим форму $main_form.

В результате получилась вот такая форма:

DefaultForm

Что бы в загаловке формы отобразить текст нужно присвоить его свойству Text нашей формы:

Текст отобразится в заголовке:

DefaultFormTextHello

Изменение размера формы:

Давайте изменим размер формы.

Это можно сделать через свойства Width(ширина) и Height(высота) формы, где значения параметров это кол-во пикселей.

Этого же результата можно добиться используя параметр формы Size:

$main_form . Size = New-object System . Drawing . Size ( 300 , 500 )

Так же можно задать размер с помощью параметра DesktopBounds:

$main_form . DesktopBounds = New-object System . Drawing . Rectangle ( 0 , 0 , 300 , 500 )

Так же для изменения размеров можно воспользоваться свойством ClientSize

$main_form . ClientSize = New-object System . Drawing . Size ( 300 , 500 )

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

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

Для этогу существуют такие параметры , как MinimumSize(минимальный размер формы) и MaximumSize (максимальный размер формы). Если задать эти параметры, то в период жизни форма не сможет за них выйти.

Пример объявления данных свойств:

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

Для этого с начала надо разрешить менять размер формы, в зависимости от расположения объектов в области видимости свойством AutoSize перевести его в значение true

После надо выбрать режим автоматического подбора размера формы и указать его в свойстве AutoSizeMode. Существует два режима этого свойства GrowOnly и GrowAndShrink:

$main_form . AutoSizeMode = [ System . Windows . Forms . AutoSizeMode ] : : GrowOnly $main_form . AutoSizeMode = [ System . Windows . Forms . AutoSizeMode ] : : GrowAndShrink

Шрифты

Так же не малую роль в отображении формы влияют шрифты. К тому же настройки шрифтов наследуются на управляющие элементы принадлежащие этой форме.

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

$main_form . Font = New-Object System . Drawing . Font ( "Calibri" , 24 )

Что бы поменять цвет шрифта существует следующее свойство ForeColor:

Не малуюроль в определении размеров управляющих элементов играет размер шрифта его можно узнать из свойства AutoScaleBaseSize, его так же можно перераспределить.

Шаблон окна

Шаблон окна формы опредиляется парметром FormBorderStyle, который может принимать семь значений Fixed3D, FixedDialog, FixedSingle, FixedToolWindow, None, Sizabl, SizableToolWindow по умолчанию стоит значение Sizable. Заметим, что внешний вид формы на примерах может существенно отличаться на разных компьютерах и существенно зависит от OC. Так же после назначения определённого шаблона окна в дальнейшем его можно будет редактировать другими свойствами формы.

Рассмотрим шаблоны формы:

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : Fixed3D

FormBorderStyleFixed3D

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : FixedDialog

FormBorderStyleFixedDialog

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : FixedSingle

FormBorderStyleFixedSingle

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : FixedToolWindow

FormBorderStyleFixedToolWindow

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : None

FormBorderStyleNone

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : Sizable

FormBorderStyleSizable

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : SizableToolWindow

FormBorderStyleSizableToolWindow

Управляющие кнопки

Для управления отображения управляющими кнопками используются следующие свойства ControlBox, MaximizeBox и MinimizeBox.

Свойство ControlBox управляет видимостью всей областью управляющих кнопок. По умолчанию она находиться в состоянии true.

DefaultFormTextHello

Зададим данному свойству значение false

FormControlBoxFalse

Если в форме свойству Text присвоить пустое значение, то шапка формы совсем исчезнет.

Вот так будет выглядеть форма:

FormNotTitle

Включим назад ControlBox и рассмотрим следующие свойства: MaximizeBox и MinimizeBox. Они тоже булевые и служат для того, что бы выключать кнопки развернуть окно и свернуть окно. По умолчанию они имеют свойство true. Рассмотрим как выглядит их выключение:

FormMaximizeBoxFalse

FormMinimizeBoxFalse

Однако, если выключить и MaximizeBox и MinimizeBox кнопки перестают быть видимыми:

FormMaximizeBoxMinimizeBoxFalse

Заметим так же, что отключение кнопок по одиночке или одновременно влияет не только на отображение этих кнопок и возможностями их использовать, но так же и на свойство формы. Так на форме с выключенным свойством MaximizeBox пользователю отключаются все стандартные возможности распахнуть форму на весь экран. Так же дела обстоят и с MinimizeBox.

Иконка.

Иконка отображаемая в левом верхнем углу формы, а так же отображаемая в панели задач может определить через свойство формы Icon например вот так:

$main_form . Icon = New-Object System . Drawing . Icon ( "d:\favicon.ico" )

Если же мы не хотим, что бы иконка отображалась, то её можно скрыть, с помощью свойства ShowIcon установив его в состояние false. Если же шаблон окна не подразумевает наличия иконки, её так же можно включить через это свойство установи параметр truе

Элемент захвата

Для того, чтобы задать видимость захвата для изменения размера, отображаемого в правом нижнем углу формы. Нужно воспользоваться свойством SizeGripStyle. Оно имеет 3 значенич Auto, Hide, Show

Данное значение стоит по умолчанию. Форма сама решает отображать этот элемент или нет.

Элемент будет скрыт с формы.

$main_form . SizeGripStyle = [ System . Windows . Forms . SizeGripStyle ] : : Hide

FormSizeGripStyleHide

элемент отображается на форме

$main_form . SizeGripStyle = [ System . Windows . Forms . SizeGripStyle ] : : Show

FormSizeGripStyleShow

Цвет и прозрачность.

Что бы задасть цвет формы нужно воспользоваться свойством BackColor, этот параметр будет наследоваться размещённым на данной форме управляющим элементам. Сделаем цвет рабочей области, например синим:

FormBackColor

$main_form . BackgroundImage = [ System . Drawing . Image ] : : FromFile ( "d:\favicon.jpg" )

FormBackgroundImage

А в свойстве TransparencyKey формы мы должны указать, какой цвет будет заменяться на прозрачный.

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

FormTransparencyKey

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

$main_form . FormBorderStyle = [ System . Windows . Forms . FormBorderStyle ] : : None

Если же мы не хотим делать дырки в форме, а всеволишь сделать её слегка прозрачной, мы можем воспользоваться свойством Opacity, значения в ней колеблятся от 0 это полностью прозрачная до 1, не прозрачная.

FormOpacity

Курсор

Для изменения вида курсора в приложении можно воспользоваться свойством формы Cursor:

$main_form . Cursor = New-Object System . Windows . Forms . Cursor ( "d:\Cursor.cur" )

Так же можно узнать перехватывается ли курсор приложением в даннй момент, для этого нужно посмотреть данные свойства формы Capture

Что бы уведомить пользователя о текущем процессе, можно так же включить курсор ожидания указав в свойстве UseWaitCursor значение true

Состояние окна.

Что бы узнать в каком состоянии находиться окно или изменить его, можно воспользоваться свойством формы WindowState оно принимает три значения Maximized, Minimized, Normal.

Что бы развернуть окно:

$main_form . WindowState = [ System . Windows . Forms . FormWindowState ] : : Maximized

Свернуть в панель задач:

Перевести в обычный(свободный) режим:

$main_form . WindowState = [ System . Windows . Forms . FormWindowState ] : : Normal

Зеркальный вид окна

Так же есть возможность показать зеркальную форму обычно это используют для приложений в которых ввод текста происходит с права на лево.

Для этого нам нужно сначала включить поддержку ввода текста с права на лево свойством формы RightToLeft

$main_form . RightToLeft = [ System . Windows . Forms . RightToLeft ] : : YES

Только после этого можно отобразить форму зеркально установив свойство формы RightToLeftLayout в значение true

FormMirrored

Посмотреть отображается ли форма в зеркальном виде можно из свойства формы IsMirrored.

Отображение в Панели задач.

Видимость окна.

Так же если надо сделать, что бы форма не закрывалась другими окнами можно воспользоваться свойством TopMost. Если установить его в значение true то другие окна не смогут заслонить его.

Для формы существуют параметры видимости, но для отображения формы лучше пользоваться функция Enabled если установить его в значение false, то его не удасться отобразить методом ShowDialog().

Так же если надо скрыть форму, то это можно сделать изменив свойство Visible на false. Можно так же отобразить форму, но это может быть не всегда хорошей идеей, лучше пользоваться методом ShowDialog.

Комментарии:

Комментарии 12

Огромное спасибо за подробный разбор!
Очень сильно помогло в пониманиии концепции построения GUI для повершела =)

Приятно осознавать, что мой блог помогает людям. 🙂

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