ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Реалізація стилю 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 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 і дивимось. Вид, звичайно, до перших двох класів не дотягує, але ... "зійде для сільської місцевості".

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

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

    Для підготовки даної роботи були використані матеріали з сайту http://www.realcoding.net/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status