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

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

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

« : 29-01-2012 11:21 » 

Я внимательно изучил все темы про ToolBar в этом разделе - там в основном WinAPI. Также я посмотрел официальные примеры Microsoft по MFC для VS2008 - там этот вопрос игнорируется. Ну и почитал в интернетах разные обсуждения. Единственное, что не видел, это пример на CodeProjects, упомянутый много лет назад Джоном, поскольку лениво регистрироваться.

В общем, я хочу 8bit картинки в ToolBar, но упорно получаю 4bit. Я уже понял, что редактором ресурсов в VS2008 пользоваться не стоит.

Итак, есть в ресурсах описанный ToolBar. Есть в ресурсах ссылка на правильный битмап 112х16х8.

Простой код:
Код: (C++)
CToolBar toolBar;
toolBar.CreateEx(mainWindow, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
toolBar.LoadToolBar(IDR_TOOLBAR);
Создаёт работоспособный ToolBar, но с испорченными картинками - понижена цветность до 4bit.

Мои эксперименты с CToolBarCtrl ни к чему не привели - ToolBar просто не появляется на экране.

Как загрузить картинки правильно? И как обеспечить прозрачность фонового цвета?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 29-01-2012 12:56 » 

Насчет цветов: начиная с XP иконка должна быть из трех изображений: 4 бита, 8 бит и 24 бита. Используемый вариант выбирается автоматически. До XP в списке не было 24 бита.

Мануальчик по созданию иконок попался: http://www.allok.ru/?id=10
« Последнее редактирование: 29-01-2012 13:00 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

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

« Ответ #2 : 29-01-2012 13:33 » 

RXL, не понял. Мне не надо рисовалка иконок - их рисует наш дизайнер. Мне надо, чтобы нарисованные иконки правильно изобразились в панели инструментов. Вышеприведённый код не делает то, что нужно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zubr
Гость
« Ответ #3 : 29-01-2012 13:58 » 

Недавно делал MFC-ный тулбар на основе CToolBar с png-ными иконками. Для отрисовки иконок использовал GDI+.
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #4 : 29-01-2012 14:19 » 

Как я вижу, управляет глубиной цвета флаг в CImageList.Create. И как я понимаю, внутри LoadToolBar это вызывает, только с неправильным параметром. Отсюда видится решение - после создания ToolBar удалить его ImageList и подставить свой собственный правильный.

Или как-то через синтаксис RC-файла можно глубину цвета указать?

P.S. И отчего всё так через Ж ?!
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 29-01-2012 14:23 » 

я бы не парился и сделал через http://msdn.microsoft.com/en-us/library/windows/desktop/bb760492(v=vs.85).aspx

(сам с тулбарами мало работал, говорю по аналогии с CButton - делал свою кнопку, но никак не мог побороть гадскую рамку, которая появляется при фокусе. Применил BS_OWNERDRAW и быстренько сделал по своему)
Записан

zubr
Гость
« Ответ #6 : 29-01-2012 14:57 » 

1. Создаем тулбар на базе CToolBar
2. Создаем кнопки CToolBar::SetButtons
3. Устанавливаем предварительные размеры для кнопок CToolBar::SetSizes
4. Для каждой кнопки определяем длину текста и корректируем длину кнопки GetToolBarCtrl().SetButtonInfo
5. Текст и иконки отрисовываем в OnPaint
Я помнится 2 дня потратил на то чтобы приспособить стандартный тулбар, а потом плюнул и за день сделал по вышеприведенному алгоритму.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 29-01-2012 15:05 » 

zubr, да, я тоже обратил внимание - если стандартными средствами не удаётся победить контрол, надо его сразу вручную отрисовать и всё
Записан

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

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

« Ответ #8 : 29-01-2012 22:24 » 

Дим, если у тебя 2008 студия, то попробуй не CToolBar, а CMFCToolBar. В принципе, визард сам создаёт все необходимые компоненты для 8 битовых тулбаров. Необходимо выбрать опцию, хотя она установлена по умолчанию:



зы И конечно же их (8-ми битные bitmaps) можно изменять в редакторе ресурсов.

* ss1.gif (23.94 Кб - загружено 3797 раз.)
« Последнее редактирование: 29-01-2012 22:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Dimka
Деятель
Команда клуба

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

« Ответ #9 : 30-01-2012 05:02 » 

Джон, прекрасно. А теперь: как-то же самое сделать в уже существующем проекте? Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #10 : 30-01-2012 10:19 » 

Ну я думаю что-то вроде такого:

Берёшь оригинальный битмап туллбара, делаешь копию (чтобы с размерами не париться), её редактируешь в 256 цветном режиме (и ессно сохраняешь, дбавляешь в ресурсы и тд). Потом меняешь объект CToolBar на CMFCToolBar. App класс наследуешь от CWinAppEx. CMainFrame должен быть наследован от CFrameWndEx. В CMainFrame::OnCreate создаёшь и загружаешь тулбар:

Код: (C++)
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
                !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
        {
                TRACE0("Failed to create toolbar\n");
                return -1;      // fail to create
        }

где IDR_MAINFRAME_256 - ID битмапа с 8 битными цветами.

Ну как-то так.

зы Кстати, про опцию я наврал (откуда я это взял?). Если её не включать, всё-равно визард делает проект с 256-цветным тулбаром. Так что сорри.
« Последнее редактирование: 30-01-2012 10:23 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #11 : 30-01-2012 10:23 » 

Джон, а потом оказывается, что студия не знает класс CWinAppEx. Или это в какой-то версии так ?
Записан

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

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

« Ответ #12 : 30-01-2012 10:24 » 

Лёш, в 2008 студии знает.

* ToolBar256_2.rar (164.71 Кб - загружено 735 раз.)
« Последнее редактирование: 30-01-2012 10:27 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #13 : 30-01-2012 10:24 » 

я про неё и говорю
Записан

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

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

« Ответ #14 : 30-01-2012 10:27 » 

Прицепил проект
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Dimka
Деятель
Команда клуба

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

« Ответ #15 : 30-01-2012 13:06 » 

Алексей1153++, надо добавить #include <afxcontrolbars.h> в stdafx.h. А то у меня тоже не находило Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #16 : 30-01-2012 18:11 » 

Dimka, знамо дело, что надо , а так его нету, этого заголовка. Даже так: я когда на новый ноут студию поставил, стал компилить проект со старого ноута - а он мне раз, говорит, нету такого заголовка у меня - <afxcontrolbars.h> . Я его заремарил - собралось. Видимо, в той студии заголовок был, но в проекте его содержимое не участвовало. И так несколько, кстати, проектов (студия автоматом этот хедер добавляла в stdafx.h)

ну и ещё один проект, где я когда-то пробовал Ex классы, тут студия честно сказала - нету у меня их.
---------------------------
PS пока писал, стукнула мысля: я ж на днях только SP1 к студии скачал и поставил )) Проверяю - ага, теперь есть хедер
Записан

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

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

« Ответ #17 : 30-01-2012 18:23 » 

Если честно, то я с 2008 не работаю совсем. Нет проектов. Все новые делаем на 2010, а ежели какие старые апгрейдим, то на неё же. Поэтому 2008 у меня просто рудиментарно стоит. Удалить всё руки не доходят.
Так что про СП, хидеры и пр. ничего сказать не могу. Может какие и ставились автоматом при апдейте винды.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Dimka
Деятель
Команда клуба

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

« Ответ #18 : 31-01-2012 18:25 » 

В общем, дизайнер сделал 16-цветные картинки Улыбаюсь Важно, чтобы они были без палитры.

Использование классов CMFC... вместо C... в существующем проекте почему-то не пошло. Toolbar стал рисоваться с чёрным фоном, а главное окно вообще перестало отрисовывать фон и отображать MDI-детей. А при попытках включить Docking, упорно возникает внутреннее исключение, валящее программу.

На этом эксперименты остановлены.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #19 : 31-01-2012 18:44 » 

Стандартные 16-цветные картинки в тулбаре - это ограничение (или тяжёлое наследие?) винды. При этом палитра тоже должна быть тоже стандартная виндовская, поскольку алгоритмы отображающие, например, неактивные кнопки основаны на ней. Прозрачный цвет, если не вру, 100% магента. Всё остальное должно быть сделано ручками.

Дим, если есть пример такого "старого" существующего проекта, выложи пожалуйста, ради спортивного интереса поиграюсь на досуге.
Ну или хотя бы начальные условия: студия, тип приложения.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #20 : 01-02-2012 03:15 » 

Использование классов CMFC... вместо C... в существующем проекте почему-то не пошло.

На этом эксперименты остановлены.

у меня с CMFC* такие же негативные впечатления остались - вроде бы чота красиво, но никак не настроишь, как надо. Сразу высказывать не стал, решил сначала подождать, что у Димки получится Улыбаюсь
Записан

Dimka
Деятель
Команда клуба

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

« Ответ #21 : 01-02-2012 07:31 » 

Джон, проект выложить сложно - там помимо GUI много всякого копирайтного кода, связанного с обработкой изображений (которые как раз в MDI-окошках отображаются).

Где и как была создана первая версия - не знаю, были ли миграции - тоже; сейчас она существует в виде проекта для VS2008. Писал её пожилой человек, в 90-х годах освоивший C++ с MFC и COM, и решивший, что ему лично этого вполне достаточно, а все новомодные новшества - от лукавого. Улыбаюсь

Там используются классы: CMDIChildWnd, CMDIFrameWnd, CStatusBar, CToolBar, CDialog, CScrollView, CDocument. Больше из MFC ничего не используется. Всё это я старательно менял на CMFC... и всякие ...Ex, но не взлетело.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #22 : 01-02-2012 11:43 » 

Ок, судя по всему был MDI проект на какой-то более ранней версии. Ибо, как я уже сказал, мастер в девятке сразу использует CMFCToolBar. Попробуем.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Dimka
Деятель
Команда клуба

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

« Ответ #23 : 01-02-2012 18:33 » 

Джон, хм... попробовал создать MFC Application в 2005 и 2008 студиях. В обоих случаях получил CMDIFrameWnd, CToolBar, CStatusBar.

Как ты автоматом получаешь CMFC... классы  - не знаю. Улыбаюсь

Даже в 2010 студии, если постараться и выбирать "классические" решения в визарде создания MFC приложения, получается такой же эффект.
« Последнее редактирование: 01-02-2012 18:40 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #24 : 02-02-2012 05:45 » 

всё стандартное создаётся, если оставить эти пункты



* vs9_1.JPG (53.38 Кб - загружено 3580 раз.)
* vs9_2.JPG (56.99 Кб - загружено 3630 раз.)
Записан

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

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

« Ответ #25 : 02-02-2012 09:19 » 

В 2005 наверно ещё такого не было, даже нверняка не было.
А вот так я делаю в 2008-ой. У меня:







Все остальные странички мастера без изменения.

Вот что получается:

* ss0.gif (36.77 Кб - загружено 3496 раз.)
* ss1.gif (14.61 Кб - загружено 3656 раз.)
* ss2.gif (22.86 Кб - загружено 3806 раз.)
* ss3.gif (23.23 Кб - загружено 3669 раз.)
* ss4.gif (19.95 Кб - загружено 3697 раз.)
* TestTB256.zip (155.06 Кб - загружено 715 раз.)
« Последнее редактирование: 02-02-2012 09:20 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
RXL
Технический
Администратор

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

WWW
« Ответ #26 : 02-02-2012 11:18 » 

Жень, серийники потри Ага

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

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

« Ответ #27 : 02-02-2012 11:22 » 

Ром, а это MSDN подписка. Так что кто сворует - сам дурак. Ага

ps Тем более такое старьё. Ага
« Последнее редактирование: 02-02-2012 11:24 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Dimka
Деятель
Команда клуба

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

« Ответ #28 : 02-02-2012 16:35 » 

Джон, не, ну согласен, что CMFC получить можно.

Вопрос же не в этом, а вопрос в том, как приложение, созданное с Classic menu, переделать на новый лад без пересоздания?

И ты хотел поиграться Ага
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #29 : 02-02-2012 17:11 » 

Ааа, дык ну пока руки не дошли. Но я всё-равно намерен использовать в нём CMFC...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines