Как создать button без фона и границ?
Вся суть в заголовке. Нужна кнопка, которая бы отображалась как текст определенного цвета. Пытаюсь создать. В свойствах все кроме «Foreground» делаю прозрачным, но вокруг кнопки остается серая рамка которую не получается убрать. Кроме того, кнопка начинает мигать если на нее навести или кликнуть. Что делаю не так?
Отслеживать
задан 21 фев 2018 в 20:45
557 2 2 золотых знака 4 4 серебряных знака 27 27 бронзовых знаков
Почему бы просто не использовать TextBlock ?
– user227049
21 фев 2018 в 21:24
@FoggyFinder Потому что нужно проверять, что на элемент нажали.
21 фев 2018 в 21:29
просто обрабатывайте событие нажатия
– user227049
21 фев 2018 в 21:30
@FoggyFinder Объясните пожалуйста как это сделать. У кнопки я вижу в обработчике событий «Click», а у TextBlock’a такого нет. Как быть?
21 фев 2018 в 21:33
я имею ввиду использовать MouseLeftButtonUp или PreviewMouseLeftButtonUp
– user227049
21 фев 2018 в 21:34
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В WPF есть традиция отделять контент от представления. Если вам нужна по смыслу кнопка, используйте кнопку. Если нужно изменить её отображение, используйте стиль:
И применяйте к вашей кнопке:
С другой стороны, возможно, вам не нужна кнопка, а нужно «приклеить» обработчик нажатия на текст. Выбирайте сами, как правильно для вашего кода.
Если для вас вдруг более правильным является использование TextBlock ‘а, можно «повесить» обработчик на MouseLeftButtonDown или (возможно, более правильно) на MouseLeftButtonUp .
Создание прозрачного элемента управления
Когда элемент управления становится прозрачным, цвет фона не отображается, поэтому свойство BackColor игнорируется. Однако настройка для свойства BackColor не изменяется, когда элемент управления является прозрачным.
См. также
- Коллекции, элементы управления и объекты Microsoft Forms
- Справочник по Microsoft Forms
- Темы по основам Microsoft Forms
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Отправить и просмотреть отзыв по
Практическое руководство. Установка степени прозрачности фона элемента управления
В предыдущих версиях платформы .NET Framework элементы управления не поддерживали задание прозрачных цветов фона, если предварительно не был установлен метод SetStyle в конструкторе форм. В текущей версии платформы для большинства элементов управления можно задать цвет фона Transparent в окне Свойства во время разработки или в коде в конструкторе форм.
Элементы управления Windows Forms не поддерживают настоящую прозрачность. Фон прозрачного элемента управления Windows Forms закрашивается его родительским элементом.
Элемент управления Button не поддерживает прозрачный цвет фона, даже если свойство BackColor имеет значение Transparent.
Установка прозрачного фона для элемента управления
- В окне «Свойства» выберите свойство BackColor и задайте ему значение Transparent
См. также
- FromArgb
- Разработка пользовательских элементов управления Windows Forms в .NET Framework
- Использование управляемых графических классов
- Практическое руководство. Рисование непрозрачных и полупрозрачных линий
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Как сделать кнопку прозрачной c windows forms
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.
Модераторы: ElcnU
‘> Прозрачный фон у кнопки?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
Сообщ. #1 , 06.03.02, 08:42
Unregistered
Вобщем дело такое
есть окно
в нем создаеца дочернее окошко(типа кнопка)
хотелось бы чтобы у кнопки был виден тока текст
стили у нее такие:
WS_CHILD | WS_VISIBLE и WS_EX_TRANSPARENT
тока она падла не прозрачная нифига
а закрашена серым
помогите плиз
Сообщ. #2 , 06.03.02, 08:55

Рейтинг (т): 2
стиль WS_EX_TRANSPARENT не делает контролы прозрачными. Используй общепризнанный класс CButtonST, который можно взять на www.codeproject.com (сделай там поиск).
Сообщ. #3 , 06.03.02, 08:59
Unregistered
я не пользую MFC
Сообщ. #4 , 06.03.02, 09:29

Рейтинг (т): 2
Тогда рисуй сам кнопку, не закрашивай фон.
Сообщ. #5 , 06.03.02, 09:43
Unregistered
дык сам и рисую
но когда создаеца окно(10х10 например)
оно ложица поверх бмпшки основного окна и закрашивает его в серый цвет
это не кнопка у меня а текст
т.е. для кнопки я регион ставлю вокруг картинки и он ничего не перекрывает
а как для снаr* такой регион поставить?
вот и остаеца тока либо для статика тоже бмпшки фоновые рисовать(что не желательно)
либо прозрачный фон поставить(хз как)
Сообщ. #6 , 06.03.02, 10:00

Рейтинг (т): 2
Ну, все не так уж страшно. При регистрации класса окна сделай у него кисть NULL_BRUSH, и фона не будет (подразумеваю, что ты сам класс окна создаешь и регистрируешь).
Сообщ. #7 , 06.03.02, 10:05
Unregistered
wc.hbrBackground = (HBRUSH)NULL_BRUSH;
Ya?
Сообщ. #8 , 06.03.02, 10:07
Unregistered
не помогло
Сообщ. #9 , 06.03.02, 10:20

Рейтинг (т): 2
вот кусок моей мегадревней разработки URL окна
void RegisterURLWindow(HINSTANCE hInstance)
WNDCLASSEX wc;
ZeroMemory(&wc,sizeof(WNDCLASSEX));
wc.cbSize=sizeof(WNDCLASSEX);
wc.lpfnWndProc=URLWndProc;
wc.hInstance=hInstance;
wc.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR3));
wc.hbrBackground=(HBRUSH)GetStockObject(NULL_BRUSH);
wc.lpszClassName=»URLWindow»;
RegisterClassEx(&wc);
>
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hwnd,&ps);
DrawURL(hwnd,hdc);
EndPaint(hwnd,&ps);
break;
>
void DrawURL(HWND hwnd,HDC hdc)
HFONT oldfont;
oldfont=(HFONT)SelectObject(hdc,font);
SetTextColor(hdc,GetColor(hwnd));
SetBkMode(hdc,TRANSPARENT);
char buf[100];
char* text=GetParam(hwnd,buf,sizeof(buf),URL_TITLE);
RECT r;
GetWindowRect(hwnd,&r);
MapWindowPoints(0,hwnd,(LPPOINT)&r,2);
DrawText(hdc,text,lstrlen(text),&r,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
SelectObject(hdc,oldfont);
>
Всё было прозрачно. Да, ещё нужно установить у родителя (диалога) стили WS_CLIPCHILDREN и WS_CLIPSIBLINGS.
Сообщ. #10 , 06.03.02, 10:51
Unregistered
вобщем все как обычно просто
и во всем виноваты кривые руки ;D
класс окна я назвал STATIC
как я догадался так его назвать хз
Сообщ. #11 , 06.03.02, 14:23
Unregistered
Можно проще.
Кто тебе мешает на самом битмапе, а не на кнопке, написать текст? Останется этот текст накрыть пустым прозрачным окном и не трахаться с текстом.
Сообщ. #12 , 06.03.02, 21:42
Рейтинг (т): 6
The WM_CTLCOLORBTN message is sent to the parent window of a button before drawing the button. The parent window can change the button’s text and background colors. However, only owner-drawn buttons respond to the parent window processing this message.
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_CTLCOLORBTN
WPARAM wParam, // handle to button display context (HDC)
LPARAM lParam // handle to button (HWND)
);
Parameters
wParam
Handle to the display context for the button.
lParam
Handle to the button.
Return Values
If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the background of the button.
Remarks
By default, the DefWindowProc function selects the default system colors for the button. Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.
The system does not automatically destroy the returned brush. It is the application’s responsibility to destroy the brush when it is no longer needed.
The WM_CTLCOLORBTN message is never sent between threads. It is sent only within one thread.
The text color of a check box or radio button applies to the box or button, its check mark, and the text. The focus rectangle for these buttons remains the system default color (typically black). The text color of a group box applies to the text but not to the line that defines the box. The text color of a push button applies only to its focus rectangle; it does not affect the color of the text.
If a dialog box procedure handles this message, it should cast the desired return value to a BOOL and return the value directly. If the dialog box procedure returns FALSE, then default message handling is performed. The DWL_MSGRESULT value set by the SetWindowLong function is ignored.
При обработке этой хрени пишем следующее:
return (LRESULT)(HBRUSH)GetStockObject( HOLLOW_BRUSH );
У меня так, вроде как, работало! Поюзай эту хрень, но она для всех кнопок будет.