Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кнопки с надписями разных цветов и разных шрифтов.  (Прочитано 19053 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Diletant
Помогающий

de
Offline Offline

« : 07-11-2005 07:53 » 

Собственно в сабже все изложено, а если чуть подробнее, то вопрос звучит так: Возможно ли на одном диалоге разместить несколько кнопок, надпись на которых была бы сделана различными шрифтами и цветом? Если да, то как?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 07-11-2005 08:22 » 

Собственно в сабже все изложено, а если чуть подробнее, то вопрос звучит так: Возможно ли на одном диалоге разместить несколько кнопок, надпись на которых была бы сделана различными шрифтами и цветом? Если да, то как?

канеш возможно

Код:
HBRUSH CMy111View::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);

//определяем, что именно нужная кнопка
if(pWnd->GetDlgCtrlID()==IDC_bnMY)
{
//тут издеваемся над ей
}

return hbr;
}


Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 07-11-2005 08:45 » 

Леш,

а не проще ли сделать класс для кнопки и при ее создании устанавливать нужные параметры? Просто в этом случае не надо делать для каждой кнопки дополнительный if(pWnd->GetDlgCtrlID()==IDC_bnMY).
Или будет еще больше головной боли?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 07-11-2005 08:56 » 

это уже дело вкуса и количества кнопок Улыбаюсь

да, наверное класс лучше
Записан

Diletant
Помогающий

de
Offline Offline

« Ответ #4 : 07-11-2005 09:16 » 

Спасибо. Вообще-то все эти игры с графическими элементами не совсем мой профиль, но где-то когда-то читал, что смена шрифта у одного контрола в диалоге при перерисовке вызывает смену шрифта у всех прочих котролов. Так ли это? В общем, к вечеру проверю, сообщу.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 07-11-2005 09:19 » 

нет, это не так. Для любого объекта класса CWnd и его дитёв можно задать свой шрифт

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

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 07-11-2005 14:57 » 

Не совсем так. У диалога действительно есть СВОЙ шрифт. Если посмотреть в rc файл,
то он стоит в самом начале блока

Код:
IDD_HALLO1 DIALOGEX 0, 0, 267, 67
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
    WS_SYSMENU
CAPTION "HALLO1"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
...

Фонт необходим диалогу для размерности - тн Dialog Units или Dialog Base Units. Они зависят от шрифта - не соврать 1/4 - высота 1/8 ширина (или наоборот). Это необходимо, чтобы при изменении размеров шрифтов в системе происходил пропорциональный размер диалога и соответственно всех его контроллов. Для подробностей посмотрите на эту тему ф-ю GetDialogBaseUnits() в MSDN.
Этот фонт обычно задаётся в редакторе ресурсов. Так же его необходимо указывать при создании диалога динамически.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 07-11-2005 16:32 » 

Создаем класс
CCrutoBotton public: CButton
{

private:

void SetNewCrutoFont (Font); // тип параметра - это по выбору.

private:
CFont myCrutoFont;

}

Затем каждый контроль который требует такого вот изменения делаем в класс - визарде зависимым от класса вышеупомянутого.

В функции Крутоботона создаем новый фонт по требованию и this->SetFont()

Собственно все.
Записан

А птичку нашу прошу не обижать!!!
Diletant
Помогающий

de
Offline Offline

« Ответ #8 : 13-11-2005 12:27 » 

С кнопками, диалогами и прочими элементами более или менее теперь понятно, за что спасибо всем откликнувшимся. А как перекрасить само окно? То что дается в качестве совета в MSDN, перекрашивает только внутреннюю область. А хотелось бы перекрасить и бордюры, статусбар и область меню. Заголовок может остаться, как есть. Поскольку внешний вид окна можно переделать с помощью системных настроек, то возможность должна быть. Только можно ли это сделать для одного окна?
Записан
sandyru
Гость
« Ответ #9 : 15-11-2005 15:02 » 

Стандартную кнопку перекрасить нельзя, шрифт поменять можно.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 15-11-2005 17:14 » 

У стандартной виндовской кнопки можно поменять фоновый цвет. Для этого родительское окно должно перехватывать сообшение WM_CTLCOLORBTN. Это сообшение посылается кнопкой, перед тем как начать вырисовывать содержимое.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Diletant
Помогающий

de
Offline Offline

« Ответ #11 : 16-11-2005 11:02 » 

Как показала практика, перекрасить можно все даже бордюры (Если использовать OnNcPaint()). Теперь нужно обратно открасить меню, но это уж как-нибудь. Улыбаюсь
Записан
sandyru
Гость
« Ответ #12 : 16-11-2005 15:38 » 

Петзольд:
"
Когда оконная процедура родительского окна получает сообщение WM_CTLCOLORBTN, то параметр wParam
этого сообщения является описателем контекста устройства кнопки , а параметр lParam — описателем окна
кнопки . К тому времени , когда оконная процедура родительского окна получает это сообщение , кнопка
управления уже получила свой контекст устройства . При обработке сообщения WM_CTLCOLORBTH в вашей
оконной процедуре , вы :
•Необязательно устанавливаете цвет текста с помощью функции SetTextColor.
•Необязательно устанавливаете цвет фона текста с помощью функции SetBkColor.
•Возвращаете описатель кисти дочернему окну .
Теоретически , дочернее окно использует кисть для рисования фона . Вы должны удалить кисть , когда она
становится ненужной .
Здесь тоже возникает проблема с сообщением WM_CTLCOLORBTN: только нажимаемые кнопки и кнопки ,
определяемые пользователем посылают своему родительскому окну сообщение WM_CTLCOLORBTN. Кроме
того , только кнопки , определяемые пользователем , реагируют на обработку сообщения родительским окном ,
используя кисть для закрашивания фона . А это совершенно бесполезно , поскольку за рисование кнопок ,
определяемых пользователем и так всегда отвечает родительское окно .
Позже в этой главе мы рассмотрим случаи , когда сообщения , похожие на WM_CTLCOLORBTN, но используемые
для других типов дочерних окон управления , оказываются более полезными .
"
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines