В WINAPI я создаю кнопку вроде:
case WM_CREATE:
{
Start = CreateWindowEx(WS_EX_TRANSPARENT, "Button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL);
break;
}
Кнопка выглядит так:
Но мне нужно, чтобы он выглядел так (как я сделал в .Net):
Как я могу избавиться от этой черной границы / фона?
Start = CreateWindowEx(WS_EX_TRANSPARENT, ...);
Вы получили черный контур, потому что вы использовали флаг стиля WS_EX_TRANSPARENT. Непонятно, зачем вы это использовали, вы мало что можете сделать с ним, когда используете элемент управления Button. В противном случае, вероятно, наименее понятный флаг стиля. Вместо этого пройдите 0, чтобы получить нормально выглядящую кнопку.
В противном случае потерянное дело, чтобы получить точный Судя по кнопке .NET, Winforms не использует встроенный элемент управления Button. Он создает свой собственный, используя пользовательский рендер, чтобы получить градиентный вид. Воспроизведение этого нативного кода — большая работа.
Я думаю, что граница, которую вы видите, заключается в том, что кнопка имеет свойство «Кнопка по умолчанию». Если вы отключите это, то у него будет нормальная граница. Свойство Default просто сообщает Win32, какую кнопку активировать, если пользователь нажимает клавишу ВВОД в диалоговом окне / форме. Если у вас есть только одна кнопка, она всегда будет иметь свойство по умолчанию. Если вы добавите секунду, это не будет.
Свойство является BS_DEFPUSHBUTTON свойство, поэтому в вашем вызове CreateWindowEx вы должны иметь возможность сделать что-то вроде:
Start = CreateWindowEx(WS_EX_TRANSPARENT, "Button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | ~BS_DEFPUSHBUTTON, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL);
Если нет, вам придется установить его с ModifyStyle или же ModifyStyleEx, и передать его в параметр «Удалить». Я забываю, в каком конкретном стиле должны быть переданы, но, если я правильно помню, это параметры обычного стиля, а НЕ параметры EX.
Я не проверял это, но попробуйте создать кнопку следующим образом:
Start = CreateWindowEx(0, WC_BUTTON, "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_TEXT, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL);
break;
Это также может зависеть от того, как вы создали свое главное окно. Можете ли вы опубликовать код для создания главного окна?
РЕДАКТИРОВАТЬ: Я неправильно определил границу как границу кнопки по умолчанию. Как отметил Дэвид Хефферман, это не так. То есть у меня сейчас воспроизвел этот эффект границы; Когда программа запускается, границы не появляется, но только небольшое наведение мыши на левую кнопку создает границу — по крайней мере, в Windows 7.
Исходный ответ следует:
Черная граница, потому что это по умолчанию. Вы не должны мешать системе визуализировать кнопки по умолчанию и т. Д. Пользователи полагаются на эти сигналы.
Чтобы изменить шрифт, может быть, как, WM_SETFONT?
Отказ от ответственности: я не пробовал это. Возможно, вам нужно обработать WM_CTRLCOLOR или что-то в этом роде. Просто попробуйте, и, в конце концов, если кнопки по умолчанию не обрезают вас, просто внедрите свою собственную кнопку.