| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Реализация стиля Office XP
Недавно я пытался найти в сети ToolBar-элемент в стиле Office XP. Поиски мои
не увенчались успехом - все элементы были либо сложны в встраивании в проект,
либо платны. Тогда я принял отчаянные меры - написал сам... А, как оказалось, в
написании тулбара не было оссобенных проблем. Вот как я сделал. { 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. { 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. Лицезреем красочный тулбар. Так, тулбар есть. Далее - 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-команду). Так, так... ToolBarXP и ReBarXP есть. Теперь StatusBar'ом займёмся. Проект
как создавать я писать не буду, сразу переходим к делу. { 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 и глядим. Вид, конечно, до первых двух классов не дотягивает, но... "сойдёт для сельской местности". Красивого вам программирования!Архив примера лежит здесь. На моём сайте, может, уже появилось обновление - проверьте. Рубрика: Visual C++
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|