Diletant
Помогающий
Offline
|
|
« : 07-11-2005 07:53 » |
|
Собственно в сабже все изложено, а если чуть подробнее, то вопрос звучит так: Возможно ли на одном диалоге разместить несколько кнопок, надпись на которых была бы сделана различными шрифтами и цветом? Если да, то как?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #2 : 07-11-2005 08:45 » |
|
Леш,
а не проще ли сделать класс для кнопки и при ее создании устанавливать нужные параметры? Просто в этом случае не надо делать для каждой кнопки дополнительный if(pWnd->GetDlgCtrlID()==IDC_bnMY). Или будет еще больше головной боли?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 07-11-2005 08:56 » |
|
это уже дело вкуса и количества кнопок да, наверное класс лучше
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #4 : 07-11-2005 09:16 » |
|
Спасибо. Вообще-то все эти игры с графическими элементами не совсем мой профиль, но где-то когда-то читал, что смена шрифта у одного контрола в диалоге при перерисовке вызывает смену шрифта у всех прочих котролов. Так ли это? В общем, к вечеру проверю, сообщу.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 07-11-2005 09:19 » |
|
нет, это не так. Для любого объекта класса CWnd и его дитёв можно задать свой шрифт
помни только, что объект шрифта должен существовать всё время, пока тебе хочется видеть этот шрифт. Глобальный объект, например
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #7 : 07-11-2005 16:32 » |
|
Создаем класс CCrutoBotton public: CButton {
private:
void SetNewCrutoFont (Font); // тип параметра - это по выбору.
private: CFont myCrutoFont;
}
Затем каждый контроль который требует такого вот изменения делаем в класс - визарде зависимым от класса вышеупомянутого.
В функции Крутоботона создаем новый фонт по требованию и this->SetFont()
Собственно все.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #8 : 13-11-2005 12:27 » |
|
С кнопками, диалогами и прочими элементами более или менее теперь понятно, за что спасибо всем откликнувшимся. А как перекрасить само окно? То что дается в качестве совета в MSDN, перекрашивает только внутреннюю область. А хотелось бы перекрасить и бордюры, статусбар и область меню. Заголовок может остаться, как есть. Поскольку внешний вид окна можно переделать с помощью системных настроек, то возможность должна быть. Только можно ли это сделать для одного окна?
|
|
|
Записан
|
|
|
|
sandyru
Гость
|
|
« Ответ #9 : 15-11-2005 15:02 » |
|
Стандартную кнопку перекрасить нельзя, шрифт поменять можно.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 15-11-2005 17:14 » |
|
У стандартной виндовской кнопки можно поменять фоновый цвет. Для этого родительское окно должно перехватывать сообшение WM_CTLCOLORBTN. Это сообшение посылается кнопкой, перед тем как начать вырисовывать содержимое.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Diletant
Помогающий
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, но используемые для других типов дочерних окон управления , оказываются более полезными . "
|
|
|
Записан
|
|
|
|
|