`
totoxian
  • 浏览: 1073963 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

彻底解决Symbian全屏显示问题

阅读更多

Author:孙东风 2007-04-06

最近总有同行问我Symbian全屏显示的问题,说是参考了网上的方法也无法设置成全屏。其实,归根结底还是不明白Symbian框架的调用机制。这篇文章里我就来彻底研究一下Symbian全屏的机制。

首先,我们可以利用Carbide.vs向导建一个项目,名字就叫"TestScreen",选择基于Eikon的传统控件架构。

那么在CTestScreenAppUi的二阶构造函数里就有如下代码:

void CTestScreenAppUi::ConstructL()
{
BaseConstructL();

iAppContainer = new (ELeave) CTestScreenContainer;
iAppContainer->SetMopParent( this );
iAppContainer->ConstructL( ClientRect() );

AddToStackL(iAppContainer);

}

这里面有很关键的一句,就是我用红色显示的那段代码。它把当前UI的ClientRect()传递给Container类,我们都知道Container类是控件类,负责整个程序的界面显示,那么UI传递给Container的这个ClientRect()到底是什么东东呢?我们看看SDK HELP:

ClientRect()

TRect ClientRect() const;

Description

Gets the area of the screen available to the application for drawing, not including the space that is available for any of the following, where required: non-application areas which should always be displayed, an application status pane, an application button group, an application menu bar, an application title band and an application tool bar.

Importantly, the co-ordinates of the rectangle are relative to the whole screen area so, for example, the co-ordinate for the top, left point of the area available for drawing may be (0, 45).

Return value

TRect

The area of the screen available to the application for drawing.

从Description我们可以看到:ClientRect()获得应用程序绘制的有效屏幕区域,但是这个区域不包括那些总是显示的非应用程序区域,比如:应用程序状态面板(application status pane)、按钮(button group)、应用程序的菜单bar、标题、工具条。

而且更重要的是从下面一行可以看出,这个ClientRect()所获得区域的top-left坐标是(0,45)。

通过上面的分析我们知道,UI在构造我们的Container时传递一个所谓的"客户矩形区域",这个"客户矩形区域"的top-left坐标是(0,45),从而也就知道如果要让我们的程序全屏显示,那么我们需要改变的是构造Container的时候传递的矩形大小。

那么就有如下几种方法:

如果我们知道屏幕尺寸,那么就可以把iAppContainer->ConstructL( );里面的参数改为TRect (0,0,176,208)。

上面的程序不具有适配性,因为我们把屏幕的宽度和高度写死了。

我们来看Symbian给我们提供的一个方法

ApplicationRect()

TRect ApplicationRect() const;

Description

Gets the total area of the screen available to the application. This includes the space that is available for a toolbar, toolband or title band, if the application requires them.

Return value

TRect

The total area of the screen available to the application.

Description写的很明显了,我就不翻译了。这个方法可以获得屏幕的整个尺寸,我们把程序可以改为:

iAppContainer->ConstructL( ApplicationRect() );从而实现程序的全屏显示。

第三中方法是最笨的方法了,那就是不改变UI所传递的"客户矩形区域"的大小,传递的仍然是ClientRect()。但是到了Container后再采用"亡羊补牢"的做法!把status pane、menu bar等隐藏起来。

而且这种方法也容易出错误,下面是一个同行犯的错误,他在Container类里写入下面代码:

void CTestScreenContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();

iLabel = new (ELeave) CEikLabel;
iLabel->SetContainerWindowL( *this );
iLabel->SetTextL( _L("Example View") );

iToDoLabel = new (ELeave) CEikLabel;
iToDoLabel->SetContainerWindowL( *this );
iToDoLabel->SetTextL( _L("Add Your controls\n here") );

SetRect(aRect);

CEikStatusPane* statusp = iEikonEnv->AppUiFactory()->StatusPane();
if(statusp)
statusp->MakeVisible(EFalse);

iEikonEnv->AppUiFactory()->Cba()->MakeVisible(EFalse);

ActivateL();
}

为了使用CEikStatusPane类要加入头文件#include <eikspane.h>

为了使用CEikButtonGroupContainer类要加入头文件#include <eikbtgpc.h>

其中iEikonEnv->AppUiFactory()是在Symbian中获取UI实例常用的方法,这和MFC是一样,你千万不能new一个CTestScreenAppUi出来,因为他们是由框架调用的,我们并不知道何时调用。

但是因为他是在Container类里调用这两个方法,也就是说ClientRect()获取"矩形区域"之后程序才设置status pane、Cba为不可见!所以当然也没什么用,程序仍然无法全屏显示。

所以说即使你在UI类里写下面的代码,但因为代码是在获取"矩形区域"之后才设置status pane、Cba为不可见,程序仍然无法全屏显示!

void CTestScreenAppUi::ConstructL()
{
BaseConstructL();
iAppContainer = new (ELeave) CTestScreenContainer;
iAppContainer->SetMopParent( this );
iAppContainer->ConstructL( ClientRect() );

//在获取"矩形区域"后设置status pane、Cba为不见

CEikStatusPane* statusp = StatusPane();
if(statusp)
statusp->MakeVisible(EFalse);

Cba()->MakeVisible(EFalse);

AddToStackL( iAppContainer );
}

所以千万记住:如果要通过设置status pane、Cba为不可见的方法获得全屏,千万要在获取"矩形区域"之前设置!

上面集中方法都是通过在UI类设置"矩形区域"的大小,或者通过设置status pane、Cba不可见隐式改变"矩形区域"的大小实现全屏的。

这里我们介绍一种在Container类里,在UI设置完"矩形区域"后再改变屏幕为全屏显示的方法。

void CTestScreenContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();

iLabel = new (ELeave) CEikLabel;
iLabel->SetContainerWindowL( *this );
iLabel->SetTextL( _L("Example View") );

iToDoLabel = new (ELeave) CEikLabel;
iToDoLabel->SetContainerWindowL( *this );
iToDoLabel->SetTextL( _L("Add Your controls\n here") );

SetRect(aRect);

SetExtentToWholeScreen();

ActivateL();
}

但是要千万记得:SetExtentToWholeScreen()一定要在SetRect(aRect)之后调用才有效果。这点很容易理解,因为如果SetExtentToWholeScreen()改变屏幕为全屏后,再调用SetRect(aRect)又把屏幕尺寸设置为UI里传递的"矩形区域"的大小了。

分享到:
评论

相关推荐

    飞信塞班S60V5全屏触摸版

    飞信塞班S60V5全屏触摸版是一款专为使用塞班S60第五版(S60v5)操作系统的智能手机设计的应用程序,如Nokia 5800和N97等。这款应用是针对触摸屏设备优化的,提供了全屏交互体验,提升了用户在操作和通信时的便捷性和...

    解决symbian 2版模拟器引起的电脑蓝屏问题

    暂时禁用这些软件,看看是否能解决问题。 7. **更新模拟器**:确保你正在使用Symbian模拟器的最新版本,因为旧版本可能包含已知的bug和兼容性问题。 解决蓝屏问题通常需要尝试多种方法,逐步排除可能的原因。一旦...

    解决s60 5tr模拟器V0.9 不显示中文 问题

    关于标签 "源码" 和 "工具",这提示了解决问题可能需要查看和修改相关应用的源代码,或者使用一些工具来辅助诊断和修复。例如,使用文本编辑器检查和修改源码中的编码设置,或者使用日志分析工具来查看模拟器的运行...

    symbian S60 5th触摸全屏到位范例源代码

    【Symbian S60 5th 触摸全屏到位范例源代码】是一个针对初学者设计的教程,旨在帮助开发者理解和掌握Symbian S60第五版平台上的触摸屏编程技术。在这个实例中,重点是实现触摸事件的全方位处理,确保在全屏模式下的...

    一键锁屏软件 用于NOKIA C7-00手机一键锁屏软件,彻底解决侧键。

    用于NOKIA C7-00手机一键锁屏软件,彻底解决侧键。

    Symbian塞班操作系统

    ### Symbian塞班操作系统深度解析 #### Symbian简介:智能移动终端的先驱者 Symbian操作系统,源自英国宝意昂公司(Psion)的EPOC操作系统,其设计理念强调“使用电子产品如同品尝乳酪般简单”。EPOC的命名灵感...

    全屏信息 塞班第三版来电通改进型

    20K不到的小程序满足你的全屏需求,20号的字体,目前还没有修改其他版本,尽情关注

    Symbian中显示中文汉字(3种方法).

    ### Symbian中显示中文汉字(3种方法) 在Symbian操作系统中处理中文显示是一项基本但又重要的功能。本文将详细介绍三种不同的方法来实现这一功能,并解释每种方法的具体步骤和技术要点。 #### 方法一:使用UTF-8...

    解决Symbian 3RD FP1 SDK模拟器报错 _NCNList_KERN-EXEC_3 补丁

    2. **更新或重新安装SDK**:有时,SDK本身可能存在bug,更新到最新版本或完全重新安装可能解决问题。 3. **应用补丁**:如果存在官方或社区提供的补丁,按照说明安装。 4. **排查第三方库**:检查引入的第三方库是否...

    symbian 快速显示例子

    在Symbian操作系统中,快速显示(Direct Screen Access,DSA)是一种高级图形处理技术,它允许应用程序直接访问手机屏幕的像素数据,以实现高效的图形绘制和更新。这个"CDirectScreenAccess"是Symbian平台上的一个...

    Symbian(塞班)智能手机应用技巧

    ### Symbian(塞班)智能手机应用技巧 #### 塞班智能手机概述 智能手机的核心特征在于其搭载了一个开放式操作系统,这种系统允许用户直接安装并使用第三方软件,而非仅仅局限于预装的功能或者仅支持JAVA程序的手机。...

    symbian png图片显示

    本文将深入探讨如何在Symbian平台上处理和显示PNG图片,以及解码过程中的关键知识点。 首先,了解Symbian操作系统的基本架构是必要的。Symbian是一个微内核的实时操作系统,主要用于智能手机和平板电脑。它采用C++...

    Symbian多语言显示源代码

    在Symbian操作系统中,尤其是S60 3rd Edition平台,处理多语言显示是开发者必须面对的一个关键问题。这个“Symbian多语言显示源代码”示例着重于展示如何在S60设备上有效地支持中英文显示,这对于创建国际化应用至关...

    symbian 百宝箱

    本篇文章将深入探讨Symbian系统中的常见功能实现,包括全屏显示、开机自启动等关键点,旨在帮助开发者更好地理解和应用Symbian系统。 1. **全屏显示**: 全屏显示是Symbian应用程序中常见的需求,通过调整窗口管理...

    基于 CSS3 的全屏网页过渡特效

    和大家分享一个来自 Codrops 的基于CSS3实现的全屏网页过渡特效。页面初始布局是四个盒子,点击其中一个会扩张到全屏,其它的会淡出隐藏;关闭当前视图的时候又恢复到初始状态。 建议开发童鞋使用统一开发环境UDE来...

    Symbian塞班智能手机签名工具

    本文将深入探讨Symbian塞班智能手机签名工具的相关知识,帮助你理解其工作原理、使用方法以及为何它对Symbian用户至关重要。 首先,我们需要了解什么是签名工具。在Symbian系统中,应用软件需要经过签名才能在设备...

    symbian塞班软件开发工程师培训班实施方案.doc

    "Symbian塞班软件开发工程师培训班实施方案" 本文档主要介绍了Symbian塞班软件开发工程师培训班实施方案的整个项目计划,包括市场需求、人才缺口、薪资待遇、认证考试等方面的分析和讨论。 1. 市场需求方面,随着...

    Symbian s60 问题汇集

    《Symbian S60 问题汇集》 在智能手机领域,Symbian操作系统以其独特的魅力和广泛的用户基础,尤其在S60平台上的应用,曾经占据了重要的地位。这份名为"S60 问题汇集"的资料,无疑为Symbian S60用户提供了宝贵的...

    推荐-symbian塞班软件开发工程师培训班实施方案 精品.pdf

    【Symbian塞班软件开发工程师培训班实施方案】 随着信息技术的快速发展,Symbian操作系统作为曾经在智能手机领域的主导者,曾引领了移动开发的热潮。本文将深入探讨Symbian平台的开发现状、ASD(Accredited Symbian...

    Symbian S60 进度条显示 源码

    在Symbian S60平台,特别是在V5版本中,进度条显示是用户界面(UI)设计中的一个重要元素,它提供了对程序运行状态的可视化反馈。这篇文章将深入探讨如何在Symbian S60 V5中实现进度条的源码编程。 首先,Symbian...

Global site tag (gtag.js) - Google Analytics