一直没有时间来总结工作中学到的东西,也在一直想做一个自己的自定义控件库。也许是有点懒的缘故,但是真正当自己需要用这些东西的时候又要到处去寻找答案,去搜寻自己所做的项目的时候却发现还是把一下小小的零件拆下来,就不必去搜索偌大的一个项目,不必去google网上一些琐碎的记忆。有时候真会起到一种事半功倍的效果。那就让我们来珍惜时间去学习更多的东西吧。
当您觉得系统自带的TabGroup无法满足您的要求时,当您的上司需要您做个很炫的TabGroup来增加产品的吸引力,满足用户体验时,不妨试下下面的TabGroup,会让您的作品有一种焕然一新的感觉,下面就让我带着您来体验一下自定义TabGroup的全方位好处吧。
控件头文件(TabControls.h)
#ifndef TABCONTROLS_H
#define TABCONTROLS_H
// INCLUDES
#include <e32std.h>
#include <e32base.h>
#include <coecntrl.h>
#include <AknsDrawUtils.h> // skin
#include <AknsBasicBackgroundControlContext.h> //skin
// CLASS DECLARATION
class CGulIcon;
class CTabControls : public CCoeControl
{
public://析构函数和二阶段静态构造函数
~CTabControls();
static CTabControls* NewL(const TRect& aRect,const CCoeControl* aParent);
static CTabControls* NewLC(const TRect& aRect,const CCoeControl* aParent);
private://构造函数和ConstructL方法
CTabControls(const TRect& aRect);
void ConstructL(const TRect& aRect,const CCoeControl* aParent);
public://响应按钮事件
TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
protected://控件大小和位置设置
void SizeChanged();
private://绘制控件及控件区域
void Draw(const TRect& aRect) const;
public:
void SetIconArray(CArrayPtr<CGulIcon>* aIconArray,TInt aTabImageSize); //设置图标
void SetTitleAndTabBackgroundSize(TInt aTitleSize,TInt aTabBackgroundSize); //设置标题和TAB背景大小
void SetTabTitleArray(CDesCArrayFlat* aTabTitleArray); //设置标签页
TInt GetActiveTabIndex(); //获取当前活动的标签
private:
TRect iRect;
TInt iActiveTabIndex; // 当前活动的标签
CArrayPtr<CGulIcon>* iIconArray; //图标数组
CDesCArrayFlat* iTabTitleArray; //标题数组
TBuf<16> iTitle; //程序标题
TInt iNumberOfTabsToBeShown; //tab个数
TInt iTabImageSize; //tab图片大小
TInt iTitleSize; // 程序标题大小
TInt iTabBackgroundSize; //tab背景宽度 或者叫高度
};
#endif // TABCONTROLS_H
控件源文件(TabControls.cpp)
#include <gulicon.h>
#include <eikenv.h>
#include <AknAppUi.h>
#include <AknUtils.h>
#include "TabControls.h"
_LIT(KSuccess3,"UCWEB"); //刚进去默认主页
_LIT(KSuccess2,"\x9875\x9762\x4E8C"); //页面2
_LIT(KSuccess1,"\x9875\x9762\x4E00"); //页面1
_LIT(KSuccess4,"\x9875\x9762\x56DB"); //页面4
_LIT(KSuccess5,"\x9875\x9762\x4E94"); //页面5
CTabControls::CTabControls(const TRect& aRect):iRect(aRect)
{
iNumberOfTabsToBeShown = 5;
iTabImageSize = 0;
iActiveTabIndex = 3;
iTitleSize = 30;
iTabBackgroundSize = 50;
}
CTabControls::~CTabControls()
{
if(iIconArray)
{
delete iIconArray;
iIconArray = NULL;
// iIconArray->ResetAndDestroy();
}
if(iTabTitleArray)
{
iTabTitleArray->Reset();
}
}
CTabControls* CTabControls::NewLC(const TRect& aRect,const CCoeControl* aParent)
{
CTabControls* self = new (ELeave) CTabControls(aRect);
CleanupStack::PushL(self);
self->ConstructL(aRect,aParent);
return self;
}
CTabControls* CTabControls::NewL(const TRect& aRect,const CCoeControl* aParent)
{
CTabControls* self = CTabControls::NewLC(aRect,aParent);
CleanupStack::Pop(); // self;
return self;
}
void CTabControls::ConstructL(const TRect& aRect,const CCoeControl* aParent)
{
iIconArray = NULL;
iTabTitleArray = NULL;
if(aParent == NULL)
{
CreateWindowL();
iAvkonAppUi->AddToStackL(this);
}
else
{
// Part of a compound control, so just share
// the parent's window
SetContainerWindowL(*aParent);
}
SetRect(aRect);
ActivateL();
}
void CTabControls::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.Clear(aRect);
TInt aHeight = 0;
TInt aWidth = 0;
aHeight = aRect.Height();
aWidth = aRect.Width();
//画线代替渐变效果 画线效率高
TInt aStartColor = 66; //x是开始颜色的 3个值 比如 TRgb startColor(56,56,56); //开始颜色
TInt aEndColor = 1; //y是结束颜色的3个值 TRgb endColor(1,1,1); //结束颜色
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(2,2));
TInt j = 0;
while(j < iTitleSize)
{
gc.SetPenColor(TRgb(aStartColor--,aStartColor--,aStartColor--));
gc.DrawLine(TPoint(0,j),TPoint(aWidth,j));
j = j+2;
}
//画下面的TAB背景
TRect aRectBackground(TPoint(0,iTitleSize),TPoint(aWidth,iTitleSize+iTabBackgroundSize));
TRgb KTabBackgroundColor(222,226,229);
gc.SetPenColor (KTabBackgroundColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.SetBrushColor(KTabBackgroundColor);
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.DrawRect(aRectBackground);
//创建字体 在切换TAB页的时候变换标题上的字
const CFont* myfont = NULL;
myfont=CEikonEnv::Static()->TitleFont();
gc.UseFont(myfont);
//CFont* myfont = const_cast<CFont*> (ApacPlain12());
//CFont *TimeFont2 = NULL;
//TFontSpec tFontSpec2 = myfont->FontSpecInTwips();
//tFontSpec2.iFontStyle.SetStrokeWeight(EStrokeWeightBold);//修改是否加粗
//tFontSpec2.iHeight *= 2 ;//修改大小
//iCoeEnv->ScreenDevice()->GetNearestFontInTwips(TimeFont2 , tFontSpec2);
//gc.UseFont( TimeFont2 );
//画选中的状态
TInt tabWidth=aWidth/iNumberOfTabsToBeShown; //每个tab的宽度
TRgb KTabSelectedColor(142,163,184);
gc.SetPenColor (KTabSelectedColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.SetBrushColor(KTabSelectedColor);
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
switch(iActiveTabIndex)
{
case 1:
{
//选中矩形框的位置
TRect aRectTabSelected(TPoint(((tabWidth-iTabImageSize)/4),iTitleSize+3),
TPoint(tabWidth-((tabWidth-iTabImageSize)/4),iTabBackgroundSize*2-iTabImageSize/2));
gc.DrawRoundRect(aRectTabSelected,TSize(3,3));
//画程序标题上的字
TRgb KfontColor(242,242,242);
gc.SetPenColor(KfontColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.DrawText(KSuccess1,TPoint(4,iTitleSize-iTitleSize/8)); //字的位置在标题框的做上角中间
}
break;
case 2:
{
TRect aRectTabSelected(TPoint(((tabWidth-iTabImageSize)/4)+tabWidth,iTitleSize+3),
TPoint(tabWidth*2-((tabWidth-iTabImageSize)/4),iTabBackgroundSize*2-iTabImageSize/2));
gc.DrawRoundRect(aRectTabSelected,TSize(3,3));
//画程序标题上的字
TRgb KfontColor(242,242,242);
gc.SetPenColor (KfontColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.DrawText(KSuccess2,TPoint(4,iTitleSize-iTitleSize/8));
}
break;
case 3:
{
TRect aRectTabSelected(TPoint(((tabWidth-iTabImageSize)/4)+tabWidth*2,iTitleSize+3),
TPoint(tabWidth*3-((tabWidth-iTabImageSize)/4),iTabBackgroundSize*2-iTabImageSize/2));
gc.DrawRoundRect(aRectTabSelected,TSize(3,3));
//画程序标题上的字
TRgb KfontColor(242,242,242);
gc.SetPenColor (KfontColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.DrawText(KSuccess3,TPoint(4,iTitleSize-iTitleSize/8));
}
break;
case 4:
{
TRect aRectTabSelected(TPoint(((tabWidth-iTabImageSize)/4)+tabWidth*3,iTitleSize+3),
TPoint(tabWidth*4-((tabWidth-iTabImageSize)/4),iTabBackgroundSize*2-iTabImageSize/2));
gc.DrawRoundRect(aRectTabSelected,TSize(3,3));
//画程序标题上的字
TRgb KfontColor(242,242,242);
gc.SetPenColor (KfontColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.DrawText(KSuccess4,TPoint(4,iTitleSize-iTitleSize/8));
}
break;
case 5:
{
TRect aRectTabSelected(TPoint(((tabWidth-iTabImageSize)/4)+tabWidth*4,iTitleSize+3),
TPoint(tabWidth*5-((tabWidth-iTabImageSize)/4),iTabBackgroundSize*2-iTabImageSize/2));
gc.DrawRoundRect(aRectTabSelected,TSize(3,3));
//画程序标题上的字
TRgb KfontColor(242,242,242);
gc.SetPenColor (KfontColor);
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
gc.DrawText(KSuccess5,TPoint(4,iTitleSize-iTitleSize/8));
}
break;
default:
break;
}
//释放字体
gc.DiscardFont();
// gc.Device()->ReleaseFont(TimeFont2);
gc.SetBrushStyle(CGraphicsContext::ENullBrush);
gc.SetPenStyle(CGraphicsContext::ENullPen);
//画tab图片
TSize tabSize(tabWidth,aRect.Height());
TRect tabRect(tabSize);
tabRect.iTl.iX+=(tabWidth-iTabImageSize)/2; //x代表 横的左边
tabRect.iBr.iX+=(tabWidth-iTabImageSize)/2;
//宽度减去图片的宽度。KTitleSize 是黑标题的宽度 KTabBackgroundSize是白色的背景的 宽度
tabRect.iTl.iY+=iTitleSize+(iTabBackgroundSize-iTabImageSize)/2;
tabRect.iBr.iY+=iTitleSize+(iTabBackgroundSize-iTabImageSize)/2; //y代表竖的坐标
for(TInt i=0;i<iNumberOfTabsToBeShown;i++)
{
CFbsBitmap* tab=NULL;
CGulIcon* icon=NULL;
if(i<iIconArray->Count())
icon = iIconArray->At(i);
if(icon)
tab = icon->Bitmap();
if(tab)
{
TRect rect;
rect.iTl.iX=0;
rect.iTl.iY=0;
rect.iBr.iX=tabRect.Width();
rect.iBr.iY=tabRect.Height();
gc.BitBltMasked(tabRect.iTl,tab,rect,icon->Mask(),EFalse);
}
tabRect.iTl.iX+=tabWidth; // 每画一个图片,坐标想有移动 一个tab宽度
tabRect.iBr.iX+=tabWidth;
}
}
TKeyResponse CTabControls::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
{
TKeyResponse ret=EKeyWasNotConsumed;
// if(IsFocused() && EEventKeyUp == aType)
// {
switch (aKeyEvent.iScanCode)
{
case EStdKeyLeftArrow:
{
if(iActiveTabIndex>1)
iActiveTabIndex--;
else
iActiveTabIndex=iIconArray->Count();
DrawNow();
ret=EKeyWasConsumed;
}
break;
case EStdKeyRightArrow:
{
if(iActiveTabIndex<iIconArray->Count())
iActiveTabIndex++;
else
iActiveTabIndex=1;
DrawNow();
ret=EKeyWasConsumed;
}
break;
default:
break;
}
//}
return ret;
}
void CTabControls::SetIconArray(CArrayPtr<CGulIcon>*aIconArray,TInt aTabImageSize) // 设置图标
{
if(iIconArray != NULL)
{
iIconArray->ResetAndDestroy();
}
iIconArray=aIconArray;
iTabImageSize = aTabImageSize;
}
void CTabControls::SetTabTitleArray(CDesCArrayFlat* aTabTitleArray)// 设置标题
{
if(iTabTitleArray != NULL)
{
iTabTitleArray->Reset();
}
iTabTitleArray=aTabTitleArray;
}
TInt CTabControls::GetActiveTabIndex()
{
return iActiveTabIndex;
}
void CTabControls::SizeChanged()
{
DrawNow();
}
void CTabControls::SetTitleAndTabBackgroundSize(TInt aTitleSize,TInt aTabBackgroundSize) //设置标题 背景大小
{
iTitleSize = aTitleSize;
iTabBackgroundSize = aTabBackgroundSize;
}
用法(我用的svg图面,bmp请稍微改动)
//TAB 控件
iCTabControls = CTabControls::NewL(aRect,this);
CArrayPtr< CGulIcon >* aTabiconArray = NULL;
aTabiconArray = new (ELeave) CAknIconArray(5);
CleanupStack::PushL( aTabiconArray );
CFbsBitmap* aBmp1 = NULL;
CFbsBitmap* aBmp2 = NULL;
CFbsBitmap* aBmp3 = NULL;
CFbsBitmap* aBmp4 = NULL;
CFbsBitmap* aBmp5 = NULL;
CFbsBitmap* aBmpMask1 = NULL;
CFbsBitmap* aBmpMask2 = NULL;
CFbsBitmap* aBmpMask3 = NULL;
CFbsBitmap* aBmpMask4 = NULL;
CFbsBitmap* aBmpMask5 = NULL;
CGulIcon* aIcon1 = NULL;
CGulIcon* aIcon2 = NULL;
CGulIcon* aIcon3 = NULL;
CGulIcon* aIcon4 = NULL;
CGulIcon* aIcon5 = NULL;
AknIconUtils::CreateIconLC(aBmp1, aBmpMask1, KTabsFileName,
EMbmTabdraw_aifTab1,EMbmTabdraw_aifTab1_mask);
AknIconUtils::SetSize(aBmp1, TSize(40,40), EAspectRatioPreserved);
AknIconUtils::SetSize(aBmpMask1, TSize(40,40), EAspectRatioPreserved);
aIcon1 = CGulIcon::NewL(aBmp1, aBmpMask1);
CleanupStack::Pop (2); // aBmp1 aBmpMask1
CleanupStack::PushL(aIcon1);
aTabiconArray->AppendL(aIcon1);
CleanupStack::Pop (aIcon1);
AknIconUtils::CreateIconLC(aBmp2, aBmpMask2, KTabsFileName,
EMbmTabdraw_aifTab2,EMbmTabdraw_aifTab2_mask);
AknIconUtils::SetSize(aBmp2, TSize(40,40), EAspectRatioNotPreserved);
AknIconUtils::SetSize(aBmpMask2, TSize(40,40), EAspectRatioNotPreserved);
aIcon2 = CGulIcon::NewL(aBmp2, aBmpMask2);
CleanupStack::Pop (2); // aBmp2 aBmpMask2
CleanupStack::PushL(aIcon2);
aTabiconArray->AppendL(aIcon2);
CleanupStack::Pop(aIcon2);
AknIconUtils::CreateIconLC(aBmp3, aBmpMask3, KTabsFileName,
EMbmTabdraw_aifTab3,EMbmTabdraw_aifTab3_mask);
AknIconUtils::SetSize(aBmp3, TSize(40,40), EAspectRatioNotPreserved);
AknIconUtils::SetSize(aBmpMask3, TSize(40,40), EAspectRatioNotPreserved);
aIcon3 = CGulIcon::NewL(aBmp3, aBmpMask3);
CleanupStack::Pop (2); // aBmp3 aBmpMask3
CleanupStack::PushL(aIcon3);
aTabiconArray->AppendL(aIcon3);
CleanupStack::Pop(aIcon3);
AknIconUtils::CreateIconLC(aBmp4, aBmpMask4, KTabsFileName,
EMbmTabdraw_aifTab4,EMbmTabdraw_aifTab4_mask);
AknIconUtils::SetSize(aBmp4, TSize(40,40), EAspectRatioNotPreserved);
AknIconUtils::SetSize(aBmp4, TSize(40,40), EAspectRatioNotPreserved);
aIcon4 = CGulIcon::NewL(aBmp4, aBmpMask4);
CleanupStack::Pop (2); // aBmp4 aBmpMask4
CleanupStack::PushL(aIcon4);
aTabiconArray->AppendL(aIcon4);
CleanupStack::Pop(aIcon4);
AknIconUtils::CreateIconLC(aBmp5, aBmpMask5, KTabsFileName,
EMbmTabdraw_aifTab5,EMbmTabdraw_aifTab5_mask);
AknIconUtils::SetSize(aBmp5, TSize(40,40), EAspectRatioNotPreserved);
AknIconUtils::SetSize(aBmpMask5, TSize(40,40), EAspectRatioNotPreserved);
aIcon5 = CGulIcon::NewL(aBmp5, aBmpMask5);
CleanupStack::Pop (2); // aBmp5 aBmpMask5
CleanupStack::PushL(aIcon5);
aTabiconArray->AppendL(aIcon5);
CleanupStack::Pop(aIcon5);
iCTabControls->SetIconArray(aTabiconArray,40);
CleanupStack::Pop( aTabiconArray );
iCTabControls->SetTitleAndTabBackgroundSize(30,50);//设定标题大小,tab背景宽度
界面效果
分享到:
相关推荐
在这个主题中,我们将深入探讨如何在Symbian S60 2nd平台上自定义控件,包括Listbox、Grid、Calendar和Tree这四种常见的UI元素。 1. **Listbox**:Listbox控件在许多应用中用于显示一系列条目,通常是一行一行的...
\vBoy[2][1].v1.30.S60.SymbianOS.65k.Color_skyever汉化.sis\vBoy[2][1].v1.30.S60.SymbianOS.65k.Color_skyever汉化.sis\vBoy[2][1].v1.30.S60.SymbianOS.65k.Color_skyever汉化.sis\vBoy[2][1].v1.30.S60.Symbian...
Symbian S60 V3软件Symbian S60 V3软件Symbian S60 V3软件Symbian S60 V3软件Symbian S60 V3软件Symbian S60 V3软件Symbian S60 V3软件Symbian S60 V3软件打包下载 我佛痴悲 石祖江Symbian S60 V3软件打包下载 我佛...
在Symbian操作系统中,开发自定义控件是一项常见的任务,尤其对于想要为S60平台提供独特用户体验的应用开发者来说。本实例将深入探讨如何在Symbian中创建自定义控件,特别是通过分析`CjxGrid.cpp`文件来理解其内部...
支持任意列数的网格, 可以重写网格项的绘制,并附有示例 详细使用方法见:http://blog.csdn.net/roshy/archive/2009/09/21/4576742.aspx 如有问题,请联系作者QQ:39327317
【标题】"S60 V3塞班软件合集软件.rar"所指的是一份针对塞班S60 V3平台的软件集合压缩包。这个标题告诉我们,这个压缩文件里面包含了一系列适用于诺基亚等手机品牌的塞班S60第三版(Series 60 3rd Edition)操作系统...
Symbian S60是一个基于Symbian操作系统平台的手机软件开发环境,主要应用于诺基亚等早期智能手机。这个实例代码集合为初学者提供了一个学习Symbian S60编程的良好起点。Symbian系统以其高效能和低资源消耗而闻名,是...
Symbian S60 V3软件打包下载Symbian S60 V3软件打包下载Symbian S60 V3软件打包下载Symbian S60 V3软件打包下载Symbian S60 V3软件打包下载Symbian S60 V3软件打包下载Symbian S60 V3软件打包下载Symbian S60 V3软件...
在移动开发领域,S60平台是诺基亚推出的一个基于Symbian操作系统的重要分支,广泛应用于智能手机。本文将深入探讨在S60平台上ANSI C++与Symbian C++之间的差异,帮助开发者理解这两种编程语言在实际应用中的优缺点。...
标题中的"rr.rar_RR_s60_symbian_symbian s60"指的是一个RAR压缩文件,其中包含了与Symbian S60操作系统相关的资源或代码示例。RAR是一种常见的文件压缩格式,用于打包多个文件或目录以方便存储和传输。 描述中提到...
Symbian C++是Symbian操作系统上的原生编程语言,尤其在诺基亚的S60第三版平台上,它是开发应用程序的主要工具。S60第三版是一个功能强大的智能手机平台,提供了丰富的API和用户界面框架,使得开发者可以构建各种...
塞班S60开发流程详解 塞班S60平台是诺基亚手机早期采用的操作系统,具有广泛的开发者社区和丰富的应用程序。这篇文章将详细介绍如何基于Carbide++工具进行S60软件的开发流程。 首先,我们需要安装必要的开发工具:...
S60,全称Series 60,是诺基亚开发的一个智能手机用户界面,它是基于塞班操作系统(Symbian OS)的一个软件平台。S60V2,即S60第二版,是该平台的一个早期版本,主要服务于2000年代中期至后期的诺基亚手机,如6630等...
总的来说,塞班S60v1和v2软件游戏sis解压工具是为了解决在电脑上预处理和管理塞班手机应用及游戏而设计的实用工具,它们大大简化了文件转移和安装的过程,同时也为用户提供了更多自定义和调试的可能性。随着智能手机...
### S60 各 SDK 和 Symbian OS 对照表详解 #### 一、S60 SDK 与 Symbian OS 版本对应关系 在移动操作系统发展的早期阶段,Symbian OS 曾经是市场上非常流行的一个选择,特别是在功能手机时代。S60 平台作为基于 ...
首先,我们要明确Symbian S60 3rd版是一个基于塞班系统的手机平台,它为开发者提供了强大的API和工具集,其中包括用于图形处理的Open GL ES,这在2D游戏开发中尤为重要。Open GL ES是一个轻量级的3D图形库,但同样...
UC 塞班S60V3版
诺基亚SIS程序 塞班S60 V1 V2 塞班S60 V3 V5 程序 刷机软件 摩托罗拉刷机软件 JAVA程序
在Symbian操作系统中,创建自定义对话框是应用程序中常见的需求,这使得用户界面能够更加灵活和符合特定的应用场景。本篇文章将深入探讨如何在Symbian平台上使用`SimpleDlg`类来实现一个自定义对话框,以及涉及到的...