2012-12-27 2 views
0

В WINAPI я создаю кнопку, как: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; 
} 

Кнопка выглядит следующим образом: enter image description here

Но мне нужно, чтобы она выглядела, как этот (который я сделал в .NET) :

enter image description here

Как я могу избавиться от этой черной границы/фон?

ответ

3
Start = CreateWindowEx(WS_EX_TRANSPARENT, ...); 

У вас есть черный контур, потому что вы использовали флаг стиля WS_EX_TRANSPARENT. Непонятно, почему вы его использовали, вы не можете с ним справиться, когда используете элемент управления Button. В противном случае это, вероятно, least understood style flag. Пройдите 0 вместо этого, чтобы получить кнопку обычного поиска.

В противном случае потерянная причина для получения точного вида кнопки .NET, Winforms не использует встроенное управление Button. Он создает свой собственный, используя собственный визуализатор, чтобы получить градиентный вид. Воспроизведение этого родного кода - это большая работа.

+0

Можете ли вы объяснить, как WS_EX_TRANSPARENT изменяет внешний вид границы? Я не думал, что это повлияет на внешний вид. Приходится соглашаться с тем, что это неправильно понимается. –

+0

Понятия не имею, никогда не пробовал это до полутора часов назад. Похоже, что он пропускает WM_ERASEBKGND, что не является необычным для симуляции прозрачности. –

+0

Ты прав. Когда я удаляю прозрачный флаг, вместо этого он помещает серая рамка. Я сделал ее прозрачной, чтобы она не была серой, как на этом изображении: http://i.imgur.com/sgcE4.png – Brandon

0

EDIT: Я неправильно определил границу как границу по умолчанию. Как отметил Дэвид Хефферман, это не так. То есть, у меня есть reproduced that border effect; при запуске программы не существует границ, но только немного Mousing над левой кнопкой создает границу – по крайней мере, в ОС Windows 7.

Оригинальный ответ следующим образом:


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

Чтобы изменить шрифт, возможно, понравится WM_SETFONT?

Отказ от ответственности: Я не пробовал это. Возможно, вам нужно обработать WM_CTRLCOLOR или что-то в этом роде. Просто попробуйте, и, в конце концов, если кнопки по умолчанию не вырезают для вас, просто реализуйте свою собственную кнопку.

+0

Нет, черная рамка из-за нестандартного расширенного стиля окна –

+0

@DavidHeffernan: похоже, вы правы в целом. однако [как показано здесь] (https://gist.github.com/4396146) черная рамка не отображается, пока не появится одна кнопка над кнопкой, или нажмите другую кнопку (возможно, другие способы). так что это кажется ошибкой. я неправильно идентифицировал его как границу кнопки по умолчанию. –

0

Я думаю, что граница, которую вы видите, связана с тем, что кнопка имеет свойство «Кнопка по умолчанию». Если вы отключите это, тогда у него будет нормальная граница. Свойство Default просто сообщает Win32, какая кнопка активируется, если пользователи нажимают ENTER в диалоговом окне/форме. Если у вас есть только одна кнопка, она всегда будет иметь свойство по умолчанию. Если вы добавите секунду, это не произойдет.

Свойство является собственностью 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.

0

Я не проверял, но попробуйте создать кнопку, как это:

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; 

Он также может зависеть от того, как вы создали главное окно. Можете ли вы опубликовать код для создания основного окна?