Symbian 面板

面板分为状态面板、主面板和软键面板。其中以针对状态面板的操作为主。

状态面板分为下列子面板:标题面板、上下文面板、导航面板、信号面板、电池面板和通用指示符面板。

要操作状态面板,首先应该通过CEikStatusPane* CAknAppUi::StatusPane()得到状态面板的指针。

CEikStatusPane提供了对状态面板进行操作的各种方法:

class CEikStatusPane : public CEikStatusPaneBase, public MCoeForegroundObserver;

Members

Defined in CEikStatusPane:

ApplyCurrentSettingsL(), HandleResourceChange(), MakeVisible(), NewL(), SetDimmed(), SetFaded(), ~CEikStatusPane()

Inherited from CBase:

operator new()

Inherited from CEikStatusPaneBase:

ContainerControlL(), ControlL(), Current(), GetShapeL(), IsDimmed(), IsFaded(), IsVisible(), PaneCapabilities(), PaneRectL(), ReduceRect(), SetFlags(), SetObserver(), SwapControlL(), SwitchLayoutL(), TPaneCapabilities, WindowGroup()

Inherited from MCoeForegroundObserver:

HandleGainingForeground(), HandleLosingForeground()

1.可见性操作

    CEikStatusPane* statusPane = StatusPane();

     if (statusPane->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_EMPTY)

     {

      statusPane->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_EMPTY);

     }

     else

     {

      statusPane->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL);

     }

CurrentLayoutResId()返回当前布局的资源ID,关于资源ID的定义可参照<avkon.rsg>,有以下几种, R_AVKON_STATUS_PANE_LAYOUT_IDLE,R_AVKON_STATUS_PANE_LAYOUT_USUAL, R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE, R_AVKON_STATUS_PANE_LAYOUT_EMPTY等。

SwitchLayoutL()把状态面板的布局更改为指定的资源ID。

注意,不应使用CEikStatusPane的IsVisible()和MakeVisible()来检查和设置面板的可见性,因为它们同时会隐藏电话拨入图标。

在对状态面板的子面板操作时,需要通过下面方法得到子面板(以更改标题面板文本为例):

TUid titlePaneUid;

titlePaneUid.iUid = EEikStatusPaneUidTitle;

CEikStatusPane* statusPane = StatusPane();

CEikStatusPaneBase::TPaneCapabilities subPane = statusPane->PaneCapabilities(titlePaneUid);

if (subPane.IsPresent() && subPane.IsAppOwned())

{

   CAknTitlePane* titlePane = (CAknTitlePane*)statusPane->ControlL(titlePaneUid);

   HBufC* titleText = StringLoader::LoadLC(R_HEWB_TITLE_TEXT);

   titlePane->SetTextL(*titleText);

   CleanupStack::PopAndDestroy(titleText);

}

要得到子面板,需要实现准备好子面板的ID,它们定义在<avkon.hrh>中,有下列几种: EEikStatusPaneUidSignal(信号面板),EEikStatusPaneUidBattery(电池面板), EEikStatusPaneUidContext(上下文面板),EEikStatusPaneUidTitle(标题面板), EEikStatusPaneUidNavi(导航面板),EEikStatusPaneUidIndic, EEikStatusPaneUidMessage,EEikStatusPaneUidClock。

TPaneCapabilities PaneCapabilities(TPaneId aPaneId)方法获取子面板的相关信息。TPaneCapabilities 是CEikStatusPaneBase的嵌套类,有IsPresent(),IsAppOwned(),IsInCurrentLayout()等方法。IsPresent()检查标题面板是否存在;IsAppOwned()检查面板是否能被应用程序更改;IsCurrentLayout()检测面板是否为当前面板布局的一部分。

一旦确定了面板存在并可修改,调用CCoeControl* CEikStatusPaneBase::ControlL(TPaneId aPaneId)得到子面板的指针,然后即可对其进行操作。关于标题面板和上下文面板的操作均较简单,可参照SDK中CAknTitlePane和 CAknContextPane。比较复杂的是导航面板,将另文介绍。

导航面板

2007-12-27 14:24

导航面板的主要用途是向用户显示与应用程序当前的视图和状态相关的信息,并帮助用户在应用程序内导航。导航面板默认为空,但可以使用它显示选项卡、标签、图像、指示符或自定义控件。为了用控件装饰导航面板,需要在代码中使用一个CAknNavigationControlContainer对象,或在资源文件中使用NAVI_DECORATOR资源。

在AppUi类中定义CAknNavigationDecorator* iNaviDecorator;

以下代码示例了在导航面板显示两个选项卡:

    TUid naviPaneUid;

    naviPaneUid.iUid = EEikStatusPaneUidNavi;

    CEikStatusPane* statusPane = StatusPane();

    CEikStatusPaneBase::TPaneCapabilities subPane =

     statusPane->PaneCapabilities(naviPaneUid);

     // if we can access the navigation pane

    if (subPane.IsPresent() && subPane.IsAppOwned())

     {

     CAknNavigationControlContainer* naviPane =

      (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);

      delete iNaviDecorator;

      iNaviDecorator = NULL;

     // ownership is transferred to us here

     iNaviDecorator = naviPane->CreateTabGroupL();

     // ownership not transferred

    CAknTabGroup* tabGroup = (CAknTabGroup*) iNaviDecorator->DecoratedControl();

     // Display two tabs of normal length on the navigation pane at a time

     tabGroup->SetTabFixedWidthL(KTabWidthWithTwoTabs);

     TInt tabId = 0;

     // load the text to be displayed in the tabs

     HBufC* tab1Text = StringLoader::LoadLC(R_TAB1_TEXT);

     tabGroup->AddTabL(tabId++, *tab1Text);

     CleanupStack::PopAndDestroy(tab1Text);

     HBufC* tab2Text = StringLoader::LoadLC(R_TAB2_TEXT);

     tabGroup->AddTabL(tabId++, *tab2Text);

     CleanupStack::PopAndDestroy(tab2Text);

     // highlight the first tab

     tabGroup->SetActiveTabByIndex(0);

     naviPane->PushL(*iNaviDecorator);

    

比标题面板和上下文面板复杂了些,但并不难理解,前两者在ControlL()返回CAknTitlePane和CAknContextPane指针,这里返回的是CAknNavigationControlContainer,从命名上就可以看出,它是一个Container,可以盛放TagGroup,Label,Bitmap或其他控件,这样可以从该类的一系列成员函数CAknNavigationDecorator* CreateXXXL()看出。

CAknTabGroup::SetTabFixedWidthL()控制导航面板显示的选项卡个数和尺寸。

最后两句,No.1是把第一个选项卡设置为活动选项卡;No.2是吧选项卡组推入导航面板的对象栈,只有这样,选项卡组才能实际出现在导航面板中。

下面代码示例了在选项卡中显示位图,使用了AddTabL()的重载版本。

// ..........

TInt tabId = 0;

// load the bitmap to be displayed in the tabs

CFbsBitmap* bitmap = iEikonEnv->CreateBitmapL(KTitleBitMapFile, EMbmTitlepaneTab);

// display a bitmap in the tab

tabGroup->AddTabL(tabId++, bitmap);

// ...........

显示标签

// ...............

delete iNaviDecorator;

iNaviDecorator = NULL;

HBufC* labelText = StringLoader::LoadLC(R_NAVIGATION_LABEL_TEXT);

   //set the navigation pane's label

iNaviDecorator = naviPane->CreateNavigationLabelL(*labelText);

CleanupStack::PopAndDestroy(labelText);

naviPane->PushL(*iNaviDecorator);

// .....................

显示控件(以音量控件为例)

// ...........

// if we can access the navigation pane

if (subPane.IsPresent() && subPane.IsAppOwned())

     {

    CAknNavigationControlContainer* naviPane = (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);

     delete iNaviDecorator;

      iNaviDecorator = NULL;

      // create a volume indicator on the navigation pane

     iNaviDecorator = naviPane->CreateVolumeIndicatorL(R_AVKON_NAVI_PANE_VOLUME_INDICATOR);

    naviPane->PushL(*iNaviDecorator);

    }

CAknVolumeControl* volumeControl = (CAknVolumeControl*) iNaviDecorator->DecoratedControl();

// Get the current volume level

TInt curVolume = volumeControl->Value();

// Increase the volume level by one                

volumeControl->SetValue(++curVolume);

// ...........

显示图片

// ...........

delete iNaviDecorator;

iNaviDecorator = NULL;

// Create a bitmap to display

CFbsBitmap* bitmap = iEikonEnv->CreateBitmapL(KTitleBitMapFile, EMbmTitlepaneNavigation);

// create an image on the navigation pane

iNaviDecorator = naviPane->CreateNavigationImageL(bitmap);

naviPane->PushL(*iNaviDecorator);

// ...........

1. 使用资源更改标题面板的文本

除了可以动态地设置标题面板的文本外,还可以在资源文件中设置它们,这通过指定一个TITLE_PANE资源来实现,例如:
RESOURCE TITLE_PANE r_my_title_pane
{
txt = TITLE_TEXT;
}

txt字段用于指定显示在标题面板中的文本,可以在本地化文件中定义#define TITLE_TEXT "New Title"

之后在状态面板资源STATUS_PANE_APP_MODEL中引用该TITLE_PANE资源,而在EIK_APP_INFO资源中引用状态面板资源:

RESOURCE STATUS_PANE_APP_MODEL r_my_status_pane
{
panes =
    {
    SPANE_PANE
        {
        id = EEikStatusPaneUidTitle;
        type = EAknCtTitlePane;
        resource = r_my_title_pane;
        }
    };
}

RESOURCE EIK_APP_INFO
{
status_pane = r_my_status_pane;
}

2. 使用资源在标题面板中显示图像
可以通过指定TITLE_PANE结构中的bmpfile,bmpid和bmpmask字段定义显示在标题面板中的图像。bmpfile指定用于从中获取图像的.mbm文件;bmpid字段指定使用的位图在多位图文件中的索引;bmpmask字段根据需要指定使用的遮罩的索引。

RESOURCE TITLE_PANE r_my_title_pane
{
bmpid = EMbmMyBitmapIndex;
bmpmask = EMbmMyBitmapMaskIndex;
bmpfile = "//system//apps//myapplication//myapplication.mbm";
}

3. 使用资源在上下文面板中显示图像
可以在资源文件中指定CONTEXT_PANE资源可以设置上下文面板的图标。该资源和TITLE_PANE资源的工作方式相同。
RESOURCE CONTEXT_PANE r_my_context_pane
{
bmpid = EMbmMyBitmapIndex;
bmpmask = EMbmMyBitmapMaskIndex;
bmpfile = "//system//apps//myapplication//myapplication.mbm";
}

下面是STATUS_PANE_APP_MODEL的结构,可见panes为面板数组,当同时在资源中指定多个面板时,可以在此数组中挨个指定。
STRUCT STATUS_PANE_APP_MODEL     // Application specific status pane
{
LLINK layout=EEikStatusPaneUseDefaults;   // STATUS_PANE_LAYOUT to use for this app
STRUCT panes[];        // SPANE_PANE overrides to use for this app
}

4. 使用资源在导航面板中显示选项卡

可以在资源文件中使用NAVI_DECORATOR资源定义应用程序启动时出现的选项卡。使用tab_width字段指定显示的选择卡的个数和宽度;使用active字段指定初始时突出显示的选项卡的索引;使用tab字段指定所有选项卡:选项卡的ID和内容。
NAVI_DECORATOR结构如下:
STRUCT NAVI_DECORATOR
{
WORD type=ENaviDecoratorControlNone;
STRUCT control;
}

下面示例:

RESOURCE NAVI_DECORATOR r_navigationpane_navi_tabgroup
    {
    type = ENaviDecoratorControlTabGroup;
    control = TAB_GROUP
        {
        tab_width = EAknTabWidthWithTwoTabs; // display two tabs
        active = 0;
        tabs = {
            TAB
                {
                id = ENavigationPaneTab1;
                txt = TAB1_TEXT;
                },
            TAB
                {
                id = ENavigationPaneTab2;
                txt = TAB2_TEXT;
                }
            };
        };
    }
   
RESOURCE STATUS_PANE_APP_MODEL r_navigationpane_status_pane
{
panes=
   {
  SPANE_PANE
    {
            id = EEikStatusPaneUidNavi;
            type = EAknCtNaviPane;
            resource = r_navigationpane_navi_tabgroup;
    }
   };
}

RESOURCE EIK_APP_INFO
{
status_pane = r_navigationpane_status_pane;
}

除了在应用程序中动态创建选项卡和在资源文件中定义选项卡外,还可以在运行期使用在资源文件中指定的资源创建选项卡,为此,首先需要在资源文件中指定资源TAB_GROUP;然后在代码中使用TResourceReader对象读取该资源。
RESOURCE TAB_GROUP r_navigationpane_tabgroup
    {
    tab_width = EAknTabWidthWithTwoTabs; // display two tabs
    active = 0;
    tabs = {
        TAB
            {
            id = ENavigationPaneTab1;
            txt = TAB1_TEXT;
            },
        TAB
            {
            id = ENavigationPaneTab2;
            txt = TAB2_TEXT;
            }
        };
    }
   
    TUid naviPaneUid;
    naviPaneUid.iUid = EEikStatusPaneUidNavi;

    CEikStatusPane* statusPane = StatusPane();

    CEikStatusPaneBase::TPaneCapabilities subPane =
     statusPane->PaneCapabilities(naviPaneUid);

            // if we can access the navigation pane
    if (subPane.IsPresent() && subPane.IsAppOwned())
     {

     CAknNavigationControlContainer* naviPane =
      (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);

                // read the tab group resource
                TResourceReader reader;
                iCoeEnv->CreateResourceReaderLC(reader, R_NAVIGATIONPANE_TABGROUP);

                if (iNaviDecorator)
                    {
                    delete iNaviDecorator;
                    iNaviDecorator = NULL;
                    }

                // set the navigation pane tab group
                iNaviDecorator = naviPane->CreateTabGroupL(reader);
                CleanupStack::PopAndDestroy(); // pushed by CreateResourceReaderLC
     naviPane->PushL(*iNaviDecorator);
     }

5. 使用资源在导航面板显示标签
在资源文件中使用NAVI_LABEL资源为导航面板指定标签,此资源只有一个txt字段,用于指定在导航面板中显示的文本。
RESOURCE NAVI_LABEL r_navigationpane_navi_text
{
txt = LABEL_TEXT;
}

之后在应用程序中读取该资源,并使用它设置导航面板的标签:
TUid naviPaneUid;
    naviPaneUid.iUid = EEikStatusPaneUidNavi;
    CEikStatusPane* statusPane = StatusPane();


    CEikStatusPaneBase::TPaneCapabilities subPane =
     statusPane->PaneCapabilities(naviPaneUid);

     // if we can access the navigation pane
    if (subPane.IsPresent() && subPane.IsAppOwned())
     {

          CAknNavigationControlContainer* naviPane =
        (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);

                // read the navigation pane text resource
                TResourceReader reader;
                iCoeEnv->CreateResourceReaderLC(reader, R_NAVIGATIONPANE_NAVI_TEXT);

                if (iNaviDecorator)
                    {
                    delete iNaviDecorator;
                    iNaviDecorator = NULL;
                    }

                // set the navigation pane label
             iNaviDecorator = naviPane->CreateNavigationLabelL(reader);
                CleanupStack::PopAndDestroy(); // pushed by CreateResourceReaderLC
     
                naviPane->PushL(*iNaviDecorator);
              }


6. 使用资源在导航面板中显示图像

在资源文件中使用NAVI_IMAGE资源为导航面板指定图像,跟前面指定图像的方法相同。
RESOURCE NAVI_IMAGE r_navigationpane_navi_image
{
bmpfile = "z://system/data/avkon.mbm";
bmpid = EMbmAvkonQgn_stat_keyguard;
}

    TUid naviPaneUid;
    naviPaneUid.iUid = EEikStatusPaneUidNavi;
    CEikStatusPane* statusPane = StatusPane();


    CEikStatusPaneBase::TPaneCapabilities subPane =
     statusPane->PaneCapabilities(naviPaneUid);

   // if we can access the navigation pane
    if (subPane.IsPresent() && subPane.IsAppOwned())
     {

          CAknNavigationControlContainer* naviPane =
        (CAknNavigationControlContainer *) statusPane->ControlL(naviPaneUid);

                // read the navigation pane image resource
                TResourceReader reader;
                iCoeEnv->CreateResourceReaderLC(reader, R_NAVIGATIONPANE_NAVI_IMAGE);

                if (iNaviDecorator)
                    {
                    delete iNaviDecorator;
                    iNaviDecorator = NULL;
                    }

                // set the navigation pane image
             iNaviDecorator = naviPane->CreateNavigationImageL(reader);
                CleanupStack::PopAndDestroy(); // pushed by CreateResourceReaderLC
     
                naviPane->PushL(*iNaviDecorator);

      }

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值