Реализация стилю Office XP

Тип работы:
Реферат
Предмет:
Информатика, программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Реализация стилю Office XP

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 і = 0, x = 0, n = 0; і ≠ 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 == і)// На кнопці мышка?

{

// Створюємо долоню й перо

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 і = 0; і ≠ GetToolBarCtrl (). GetButtonCount (); i++)

{

GetToolBarCtrl (). GetButton (i, & btn);// Отримуємо даних про кнопке

GetItemRect (i, rt); // Отримуємо рект кнопки

if (btn. fsStyle & TBSTYLE_SEP) continue; // Сепаратори пропускаем

if (rt. PtInRect (point) && m_nSelected ≠ і)// Мишка над этой?

{

m_nSelected = і; // Зберігаємо выделение

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 і = 0; і ≠ 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 і = 0; і ≠ 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 і дивимося. Вигляд, звісно, до у перших двох класів не дотягує, але… «сойдёт для сільській місцевості «.

Красивого вам программирования!

Список литературы

Для підготовки даної праці були використані матеріали із сайту internet

ПоказатьСвернуть
Заполнить форму текущей работой