это быстро и бесплатно
Оформите заказ сейчас и получите скидку 100 руб.!
Ознакомительный фрагмент работы:
ToolBarXP
Недавно я пытался найти в сети ToolBar-элемент в стиле Office XP. Поиски мои не увенчались успехом - все элементы были либо сложны в встраивании в проект, либо платны. Тогда я принял отчаянные меры - написал сам... А, как оказалось, в написании тулбара не было оссобенных проблем. Вот как я сделал.
Создал MFC SDI проект с именем StyleXP. С помощью ClassWizard'а добавил новый класс CToolBarXP, наследованный от CToolBar (CToolBar в списке нет, но я выбрал CToolBarCtrl и вручную изменил имя предка). Дальше встал вопрос: "Какие функции перегружать?". Просмотрев весь предоставленный список в ClassWizard'е, я выбрал WM_PAINT. Долго я с ним провозился, но таки вышло вот что:
void CToolBarXP::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rt, rItem;
COLORREF face, shdw, cbtn;
BYTE r,g,b;
WORD BtnLength;
// Берём клиентскую область эл-та
GetClientRect(rt);
// Выщитываем цвет бэк-граунда(для пущей красоты
// я решил слегка отклониться от стандартного цвета).
face = GetSysColor(COLOR_3DFACE);
r = GetRValue(face)+10;
g = GetGValue(face)+10;
b = GetBValue(face)+10;
face = PALETTERGB(r,g,b);
// Таким же образом выщитываем цвет выделенной кнопки...
cbtn = GetSysColor(COLOR_3DFACE);
r = GetRValue(cbtn)-10;
g = GetGValue(cbtn)-10;
b = GetBValue(cbtn)-10;
cbtn = PALETTERGB(r,g,b);
// ицветрамки
shdw = GetSysColor(COLOR_3DSHADOW);
r = GetRValue(shdw)+10;
g = GetGValue(shdw)+10;
b = GetBValue(shdw)+10;
shdw = PALETTERGB(r,g,b);
// Заполняемтол-барбэкграундом
dc.FillSolidRect(rt, face);
// Создаёмперо
CPen pen;
pen.CreatePen(0, 1, shdw);
dc.SelectObject(&pen);
TBBUTTON btn;
BtnLength = LOWORD(GetToolBarCtrl().GetButtonSize());// Получаемширинукнопки
// Перебираемвсекнопки
for(int i = 0, x = 0, n = 0; i != GetToolBarCtrl().GetButtonCount(); i++)
{
GetToolBarCtrl().GetButton(i, &btn);// Получаемданныеокнопке
if(btn.fsStyle & TBSTYLE_SEP)// Сепаратор ?
{
dc.MoveTo(x+2, 2);// Рисуем вертикальную линию
dc.LineTo(x+2, 20);
x += 6;
}
if(m_nSelected == i)// Накнопкемышка?
{
// Создаём кисть и перо
CPen pn;
CBrush br;
pn.CreatePen(0, 1, shdw);
br.CreateSolidBrush(cbtn);
dc.SelectObject(&pn);
dc.SelectObject(&br);
// Получаем рект кнопки
GetItemRect(i, rItem);
// Рисуемрамку
dc.Rectangle(rItem);
// Рисуемиконкукнопки
GetToolBarCtrl().GetImageList()->Draw(&dc, n, CPoint(x+2, 2), 0);
x += BtnLenght;
n++;
}
else if(!btn.fsStyle & TBSTYLE_SEP)// Кнопкавобычномсостоянии
{
GetToolBarCtrl().GetImageList()->Draw(&dc, n, CPoint(x+3, 3), 0);
x += BtnLenght;
n++;
}
}
// Do not call CToolBarCtrl::OnPaint() for painting messages
}
Так, сразу пока не отвлёкся - в класс надо добавить переменную:
class CToolBarXP : public CToolBarCtrl
{
//***********************************************
protected:
int m_nSelected;// Номер кнопки под мышкой :-)
//{{AFX_MSG(CToolBarXP)
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
В конструкторе класса надо надо инициализировать сию переменную числом -1.
Теперь добавляем через КлассВизард обработку перемещений мышкой:
void CToolBarXP::OnMouseMove(UINT nFlags, CPoint point)
{
CToolBar::OnMouseMove(nFlags, point);
CRect rt;
TBBUTTON btn;
// Перебираемкнопки
for(int i = 0; i != GetToolBarCtrl().GetButtonCount(); i++)
{
GetToolBarCtrl().GetButton(i, &btn);// Получаемданныеокнопке
GetItemRect(i, rt);// Получаем рект кнопки
if(btn.fsStyle & TBSTYLE_SEP) continue;// Сепараторы пропускаем
if(rt.PtInRect(point) && m_nSelected != i)// Мышканадэтой?
{
m_nSelected = i;// Сохраняемвыделение
Invalidate();// Перерисовываем
SetTimer(11, 100, NULL);// Пускаемтаймер
return;
}
}
}
Так... Ну и, собственно таймер:
void CToolBarXP::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 11)// На всякий пожарный
{
// Так где же мышка ???
CPoint p(GetMessagePos());
ScreenToClient(&p);
// Берёмграницыкнопки
CRect rect;
GetClientRect(rect);
// Проверка на наличие внутри курсора
if (!rect.PtInRect(p))
{
// Если мыши нет то оставляем слежение
m_nSelected = -1;
// И убиваем таймер ("А зачем нам кузнец? Нам кузнец не нужен...") ;)
KillTimer(11);
// Не забыть перерисовать кнопку
Invalidate();
}
}
}
Фу... Вроде всё. А! Теперь лезем в MainFrame.h и меняем тип переменной m_wndToolBar с CToolBar на CToolBarXP, незабыв перед этим #include'ть файл с нашим тулбаром. Теперь всё! Жмём F7, ждём пока проект скомпилируется и F5. Лицезреем красочный тулбар.
ReBarXP
Так, тулбар есть. Далее - CReBarXP. Ну это вообще проще пареной репы: создаём MFC проект с помеченной галочкой Internet Explorer ReBars. Добавляем новы класс CReBarXP, наследованный от CReBar, перегружаем у него WM_PAINT и вписываем туда вот что:
void CReBarXP::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rt, rBand;
COLORREF face, shdw;
BYTE r,g,b;
// Цвета(идеинтично CToolBarXP)
GetClientRect(rt);
face = GetSysColor(COLOR_3DFACE);
r = GetRValue(face)+10;
g = GetGValue(face)+10;
b = GetBValue(face)+10;
face = PALETTERGB(r,g,b);
shdw = GetSysColor(COLOR_3DSHADOW);
r = GetRValue(shdw)+10;
g = GetGValue(shdw)+10;
b = GetBValue(shdw)+10;
shdw = PALETTERGB(r,g,b);
CPen pen;
pen.CreatePen(0, 1, shdw);
// Заливаем область
dc.FillSolidRect(rt, face);
dc.SelectObject(&pen);
// Перебираем все бары
for(UINT i = 0; i != GetReBarCtrl().GetBandCount(); i++)
{
GetReBarCtrl().GetRect(i, rBand);// Получаемрект
for(int y = 4; y != rBand.Height()-4; y+=2)// Ресуемсимпатичнуюзакраску
{
dc.MoveTo(rBand.left+3,rBand.top+y);
dc.LineTo(rBand.left+6,rBand.top+y);
}
}
// Do not call CReBar::OnPaint() for painting messages
}
Всё! Теперь только меняем тип ReBar на CReBarXP(обязательно вставив перед объявлением класса include-команду).
StatusBarXP
Так, так... ToolBarXP и ReBarXP есть. Теперь StatusBar'ом займёмся. Проект как создавать я писать не буду, сразу переходим к делу.
Добавляем новый класс CStatusBarXP, наследованный от CStatusBar. В нём переопределяем OnPaint и пишим тудыва:
void CStatusBarXP::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rt, rPane;
COLORREF face, shdw;
CString Text;
CFont* Font;
BYTE r,g,b;
// Высчитываем цвета(большая часть кода:))
GetClientRect(rt);
face = GetSysColor(COLOR_3DFACE);
r = GetRValue(face)-10;
g = GetGValue(face)-10;
b = GetBValue(face)-10;
face = PALETTERGB(r,g,b);
shdw = GetSysColor(COLOR_3DSHADOW);
r = GetRValue(shdw)+10;
g = GetGValue(shdw)+10;
b = GetBValue(shdw)+10;
shdw = PALETTERGB(r,g,b);
CPen pen;
CBrush br;
pen.CreatePen(0, 1, shdw);
br.CreateSolidBrush(face);
Font = GetFont();
dc.SelectObject(Font);
dc.FillSolidRect(rt, face);
dc.SelectObject(&pen);
dc.SelectObject(&br);
// А вот непосредственно рисование:
for(int i = 0; i != GetCount(); i++)
{// Перебираемвсеиндикаторы
GetStatusBarCtrl().GetRect(i, rPane);
GetPaneText(i, Text);// Получаемтекст
rPane.bottom--;
dc.Rectangle(rPane);// Рисуем рамку
// И текст, если надо:
if(GetPaneStyle(i)) dc.TextOut(rPane.left+3, rPane.top+1, Text);
rPane.top += 1;
rPane.left += 3;
rPane.right -= 1;
if(GetPaneStyle(i)) dc.DrawText(Text, rPane, 0);
}
}
Усё! Теперь только меняем тип переменной с CStatusBar на CStatusBarXP и глядим. Вид, конечно, до первых двух классов не дотягивает, но... "сойдёт для сельской местности".
Красивого вам программирования!
Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников
Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.
Цены ниже, чем в агентствах и у конкурентов
Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит
Бесплатные доработки и консультации
Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки
Гарантируем возврат
Если работа вас не устроит – мы вернем 100% суммы заказа
Техподдержка 7 дней в неделю
Наши менеджеры всегда на связи и оперативно решат любую проблему
Строгий отбор экспертов
К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»
Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован
Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн
Выполнить 2 контрольные работы по Информационные технологии и сети в нефтегазовой отрасли. М-07765
Контрольная, Информационные технологии
Срок сдачи к 12 дек.
Архитектура и организация конфигурации памяти вычислительной системы
Лабораторная, Архитектура средств вычислительной техники
Срок сдачи к 12 дек.
Организации профилактики травматизма в спортивных секциях в общеобразовательной школе
Курсовая, профилактики травматизма, медицина
Срок сдачи к 5 дек.
краткая характеристика сбербанка анализ тарифов РКО
Отчет по практике, дистанционное банковское обслуживание
Срок сдачи к 5 дек.
Исследование методов получения случайных чисел с заданным законом распределения
Лабораторная, Моделирование, математика
Срок сдачи к 10 дек.
Проектирование заготовок, получаемых литьем в песчано-глинистые формы
Лабораторная, основы технологии машиностроения
Срок сдачи к 14 дек.
Вам необходимо выбрать модель медиастратегии
Другое, Медиапланирование, реклама, маркетинг
Срок сдачи к 7 дек.
Ответить на задания
Решение задач, Цифровизация процессов управления, информатика, программирование
Срок сдачи к 20 дек.
Написать реферат по Информационные технологии и сети в нефтегазовой отрасли. М-07764
Реферат, Информационные технологии
Срок сдачи к 11 дек.
Написать реферат по Информационные технологии и сети в нефтегазовой отрасли. М-07764
Реферат, Геология
Срок сдачи к 11 дек.
Разработка веб-информационной системы для автоматизации складских операций компании Hoff
Диплом, Логистические системы, логистика, информатика, программирование, теория автоматического управления
Срок сдачи к 1 мар.
Нужно решить задание по информатике и математическому анализу (скрин...
Решение задач, Информатика
Срок сдачи к 5 дек.
Заполните форму и узнайте цену на индивидуальную работу!