S60 sample project 之 Helloworldbasic

AI——修改UI的SKILL 本技能用于RYB_GCP_SETTLEMENT_V2医疗智能柜项目Android端UI美化,基于XML与Material设计规范,严格遵循“只改UI、不碰逻辑”原则。统一使用lib_ui中定义的设计令牌(如主色#467DE4、圆角12dp卡片区等),逐模块改造布局样式,确保字号(20–36sp)、资源引用及视图ID不变。每次仅改一两个模块,先输出方案待确认,再编译验证(需JDK 11)。已完第一批,第二批待确认,其余模块按相同规范推进。 阅读详情
 
1. Brief Introduction
Helloworldbasic project实现了一个比较简单的S60 GUI 应用程序的。通过实现App类,Doc类,View类,Ui类,Dialog类,实现了S60应用程序的框架。
我们应该重点了解各个Class之间的调用关系,如何用资源文件来描述一个UI,以及如何添加菜单的响应代码。

2. Design
不要被类图的繁冗的继承结构所吓倒,我们只需要研究他的很小的一部分。
序列图把调用关系基本阐述清楚了,虽然画的还是不够规范。
a. Class Diagram

b. Sequence Diagram



3. Key Concept


将App,Doc, Ui, View类的基类的官方mi摘录如下。

CAknApplication: 

Base class for a Series 60 application. S60的官方介绍真够简单的

CEikApplication

The base of all Uikon applications.

CEikApplication builds on CApaApplication, providing a basis for applications working within the framework provided by Uikon. It also contains an interface to the resource file and the document object belonging to the application.

Each Uikon  class is derived from CEikApplication. Application writers must provide at least an implementation of the pure virtual function CreateDocumentL().

The application's resource file can be changed from the default by overriding ResourceFileName().



CreateDocumentL()

Creates a new document.

This function is called by the application DLL framework during application startup to create a new instance of the document associated with this application. This implementation of the function makes a record of the CApaProcess argument, and returns a document created by the un-parameterised, private, overload.

这个函数在CHelloworldBasicApp中实现了。这个函数创建并返回了一个指向CHelloworldbasic对象的指针。但是当时我不明白,这个虚函数在何时会被调用?这段解释说地也不是很清楚,application DLL framework是什么概念,可以理解为是application server 吗?


ResourceFileName()

Gets the localized name of the resource file used by this application.

By default, this file has an extension of .rsc and uses the same name as the application file located in the same directory. Language variants are supported through BaflUtils::NearestLanguageFile().

每一个application都户默认的与其同名的rss文件相关联,在rss文件中定义了application的UI。


CAknDocument

Base class for a Series 60 application document. 等于没说


CEikDocument

In file-based applications, the document represents the data that relates to a
particular instance of the application, and should handle storing and restoring
it. In all applications, whether file-based or not, the document is used to create
the application UI.

A class derived from CEikDocument must be defined by each GUI application, and minimally
it must implement CreateAppUiL(). Note that UIs may implement their own document base class,
derived from CEikDocument, which applications may need to derive from instead.

The document is created by the application's CreateDocumentL() function.


CEikDocument负责两件事情1.应用程序相关的文件操作 2.实现CreateAppUiL()函数



CreateAppUiL()

Constructs the application UI.

This function is called by the UI framework during application start-up. It should only carry out first phase construction of the app UI, in other words, using new(ELeave). It should not call the app UI's ConstructL(), because the UI framework is responsible for this. Note also that the UI framework takes ownership of the app UI, so the document does not need to destroy it.

这个函数什么时候调用,被谁调用?文中提到在应用程序启动时被UI framework调用,这也是一个比较模糊的回答。

另外提到CreateAppUiL不负责进行Ui的construct,这个ConstructL函数被谁调用呢?估计也是UI framework


CAknAppUi

Abstract Avkon application UI class. 简单


CAknAppUiBase

Abstract Avkon application UI base class



CEikAppUi

Handles application-wide aspects of the application's user interface such
as the menu bar, toolbar pop-up menus, opening and closing files and exiting the
application cleanly.

Every GUI application should use its own class derived from CEikAppUi.

An app UI's main role is to handle commands, in its HandleCommandL() function.
These may be invoked using the menu bar, toolbar, or hotkeys; the commands
that an app UI handles are specified in the application's resource file.

In addition, the app UI normally needs to respond to other kinds of events, by
providing suitable implementations of the following virtual functions, all
inherited from CCoeAppUi:

- HandleKeyEventL(): Key events.

- HandleForegroundEventL(): Application switched to foreground.

- HandleSwitchOnEventL(): Machine switched on.

- HandleSystemEventL(): System events.

- HandleApplicationSpecificEventL(): Application-specific events.


说得比较明白了,虽然对于底层的消息调用机制仍然是透明的。



CCoeControl

Control base class from which all other controls are derived.




4. Implementation
4.1 main
  1. GLDEF_C TInt E32Main()
  2.     {
  3.     return EikStart::RunApplication( NewApplication );
  4.     }
  5. LOCAL_C CApaApplication* NewApplication()
  6.     {
  7.     return new CHelloWorldBasicApplication;
  8.     }

惯用的开局套路,以后依葫芦画瓢就可以了。
4.2 CHelloworldBasicApp
  1. CApaDocument* CHelloWorldBasicApplication::CreateDocumentL()
  2.     {
  3.     // Create an HelloWorldBasic document, and return a pointer to it
  4.     return (static_cast<CApaDocument*>
  5.                     ( CHelloWorldBasicDocument::NewL( *this ) ) );
  6.     }
标准化的调用,无须赘述。
  1. TUid CHelloWorldBasicApplication::AppDllUid() const
  2.     {
  3.     // Return the UID for the HelloWorldBasic application
  4.     return KUidHelloWorldBasicApp;
  5.     }
这个函数好像会被系统多次调用,不知为何。
4.3 CHelloworldBasicDoc
这个类的NewL,NewLC,ConstructL都是常规实现,无须赘述。
  1. CHelloWorldBasicDocument::CHelloWorldBasicDocument( CEikApplication& aApp )
  2.     : CAknDocument( aApp )
  3.     {
  4.     // No implementation required
  5.     }
注意aApp传给了基类的构造函数,说明Doc类中必定保留了只想App类的指针或引用。
  1. CEikAppUi* CHelloWorldBasicDocument::CreateAppUiL()
  2.     {
  3.     // Create the application user interface, and return a pointer to it;
  4.     // the framework takes ownership of this object
  5.     return ( static_cast <CEikAppUi*> ( new ( ELeave )
  6.                                         CHelloWorldBasicAppUi ) );
  7.     }
  4.4 CHelloworldBasicUi
CHelloworldBasicUi中重点实现了两个函数ConstructL以及HandleCommand
ConstructL首先调用了BasicConstructL函数,然后创建了一个hello.txt文件。
HandleCommand 和Windows的消息处理函数类似,一堆的switch case

5. Notes
华为Atlas200DK实战指南:从零搭建AI开发环境到人像语义分割模型部署 本文提供了一份详尽的华为Atlas 200DK AI开发环境搭建与模型部署实战指南。文章采用合设环境方案,从SD卡准备、系统镜像烧录、网络配置到必备工具安装,逐步引导开发者完成环境搭建。核心部分详细讲解了如何利用华为ATC工具将TensorFlow模型转换为昇腾专用格式,并最终成功编译和运行人像语义分割模型,实现实时人像识别效果。 阅读详情

相关推荐

山景BP10_128DBG开发板通过蓝牙连接手机放歌实验回顾

最近在学习上海山景公司的BP10_128DBG的开发板,因为网上关于BP10开发板的帖子也比较少,在学习的时候也没有太多的参考资料,基本上都是官方的历程。蓝牙放歌这个demo对我来说也比较复杂,特写下此博客进行记录、总结,大家有需要的可以参考。

weixin_56646002的博客 2021

自动化脚本中如何创建自定义界面(UI)

冰狐的 UI 体系有一个容易被低估的设计取向:它没有在脚本运行时去拼装视图树,而是把界面描述固定在 XML 模板里,把事件逻辑交给 JS 处理。这种“模板在前、逻辑在后”的分工,让界面结构在编码阶段就是确定且可读的,调试时改一行 XML 就能立刻看到效果,不需要反复重启脚本去观察视图的拼装过程。

ai_coder_ai的博客 486

Cadence DSP 算子开发实战:从入门到精通

本文详细介绍了Cadence DSP算子开发的实战技巧,从入门基础到高级优化。内容涵盖DSP架构特性、内存管理、分块计算策略、SIMD指令优化等核心知识,并提供了性能调优和调试的实用技巧,帮助开发者快速掌握Cadence DSP开发精髓,提升图像处理等计算密集型任务的开发效率。

weixin_29278805的博客 436

21st.dev 上手教程:12000+ React 组件库怎么用,6 步从挑样式到接进 Cursor

21st.dev 收录 12000+ 个 React + Tailwind 组件、297 套整站模板与 979 套主题。本文是手把手流程版:按页面用途找组件、用复制或 shadcn CLI 落地、接入 MCP 让 Cursor 自己取代码、用整站模板开局,附 10 张真实组件截图和 4 个常见坑。

懿轩的技术小窝 207

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 419

Redis TLS 加密传输实战:从证书生成到安全配置

本文详细介绍了为Redis启用TLS加密传输的完整实战流程。从阐述TLS加密的必要性开始,逐步指导读者生成自签名CA和服务器证书,并深入解析Redis服务端的核心安全配置,包括端口设置、认证模式与性能优化。最后,提供了主流客户端连接示例及生产环境下的排错与运维最佳实践,帮助构建安全的Redis通信通道。

weixin_29274969的博客 518

兰亭妙微ui设计公司分享移动端UI设计:手机UI动效怎样从漂亮展示走向可讨论的原型

移动端UI动效设计需超越“视觉好看”,聚焦用户理解与交互逻辑。通过卡片展开、手势响应等动效,强化页面间内容连续性,保留关键视觉线索。设计应明确动效触发条件、结束状态及中途打断处理,结合静态图层与动态原型并行展示,提升评审效率。强调组件一致性、真实内容测试与清晰任务引导,让动效成为可推敲的协作工具,而非仅作演示素材。

lanlanwork12的博客 206

物联网 Mixly-智能楼道灯

一、实验目的及要求 熟悉声音及人体红外传感器用法。 二、实验原理与内容 1.使用声音传感器实现声控灯功能。 2.使用人体红外传感器实现人体检测控制灯功能。 三、实验软硬件环境 硬件:Arduino、LED灯、声音传感器、人体红外传感器 软件:Mixly IDE 四、实验过程(实验步骤、记录、数据、分析) 核心代码截图 声控灯: 人体红外检测灯: 3.实验效果图: (1)、声控灯总线连接: (1)、声控灯声音大于一某个值时灯亮,经过2秒后灯灭: (3)、人体红外检测灯连接总线: (4)、人体红外

qq_43430810的博客 1917

BLG大战T1导致应用大规模启动

2026年11月9日,BLG对战T1赛事结束后4小时,因iOS灵动岛功能特性引发大规模应用后台启动。赛事期间用户开启灵动岛,赛后系统推送结束消息,但锁屏UI延迟4小时集中移除,触发大量客户端后台唤醒,导致登录态续期、设备指纹等服务告警。经排查,问题仅限iOS端,根源为灵动岛默认4小时后移除锁屏界面时自动唤醒应用。优化措施包括:临时扩容、推送打散(多通道串行+时间错峰)、客户端识别并保护后端请求,有效缓解压力。

weixin_42448366的博客 204

ns3-gym入门(二):linear-mesh例子详解

学习ns3-gym中关于IEEE 802.11网状网络中控制随机接入的例子linear-mesh

zoe2222226666的博客 1845

如何用 ABAP 以程序方式把指定表项写入 Transport Request

本文探讨了在SAP系统中运输自定义配置表数据时如何确保主表和相关文本表数据同步运输的问题。文章分析了两种实现方案:一是直接操作CTS表结构(E071和E071K)手动添加运输条目,二是使用SOBJ对象类型自动推导依赖关系。重点阐述了第一种方法的实现细节,包括如何正确拼接表键值到TABKEY字段,并提供了示例代码说明如何将ZXA_HEADER主表和ZXA_HEADERT文本表数据同时加入运输请求。文章特别指出在全球化交付场景中,文本表缺失会导致界面显示异常,强调理解底层运输机制对解决此类问题的重要性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试

本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。

信息安全领域优质创作者|操作系统领域专家 190

Apollo 9.0 速度非线性规划算法 – piecewise jerk speed nonlinear optimizer Ⅰ

二次规划的速度规划算法(PiecewiseJerkSpeedOptimizer)的存在两个问题: 这里以一张图来说明上面的问题,假设存在一个实际限速区间(或曲率很大需要降速的区间)[S1, S2],PiecewiseJerkSpeedOptimizer的做法是根据动态规划的st曲线(黑色),找到具体的时间区间[T1, T2],然后对区间[T1, T2]内所有的点施加约束或惩罚。但是二次规划平滑后的曲线(黄色)发生了变化,那么限速区间[S1, S2]对应的时间区间[T1, T2]也发生了变化,所以实际应该是对

WaiNgai 334

JS - 进阶

JavaScript的隐式类型转换遵循严格规范,核心为转原始值、数字、字符串和布尔值。对象通过Symbol.toPrimitive、toString或valueOf转换,加法运算中任一操作数为字符串则拼接,否则转数字相加;==会尝试类型转换,建议使用===。事件循环(EventLoop)中,同步代码执行后清空微任务队列(如Promise.then),再渲染界面并执行宏任务(如setTimeout)。微任务优先级高于宏任务,且可嵌套执行。async/await本质是微任务,用于简化异步编程。

D_xw_的博客 319

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

清绘AI 是什么?能力、模式、模型与适用边界

清绘AI是一站式 AI 创作平台,把生图、生视频、生音频、编辑修改、资产管理与剪辑整合在同一工作台,用于海报、电商物料、UI 概念稿、分镜脚本与短视频的批量产出。平台面向设计师、运营、产品、销售、自媒体与企业团队,网页端与手机端均可使用,提供无限画布与工作流两种创作模式。

Funkyyo的博客 89

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 333

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 203

兰亭妙微ui设计公司分享QT界面开发:Qt设备界面的改动,怎样在预览里看清楚

本文分享一套针对设备参数界面微调的评审思路:以具体操作任务为起点,明确观察范围,保留修改前状态进行对比,关注单位、输入、提示等元素在正常与异常状态下的呈现。强调在不同屏幕尺寸下重走任务流程,记录可复查的证据,区分观察与结论,确保设计变更真正服务于用户任务。实时预览虽便捷,但需明确其边界,最终以可验证、可追溯的方式推动协作与验收。

lanlanwork12的博客 163

KMP学习day9--Ktor网络层与安全请求

做一个 KMP(Kotlin Multiplatform)项目时,最先撞上的问题是:网络请求怎么写?Flutter 有 http/Dio,iOS 有 URLSession,Android 有 OkHttp——但如果业务逻辑放在共享层(commonMain),就不能直接依赖任何一端的网络库。Ktor 正是为此而生的:它是 JetBrains 官方的 Kotlin 异步框架,其 Client 模块提供了一套。

qq_63223749的博客 185

用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩

git@github.com:zoucdr/unity-skilled-mcp.git

邹杭特的博客 252

Qt_05基础界面组件

Qt 基础界面组件

u012660296的博客 256

Avalonia 设备监测实战设计|高频采样怎么接到实时曲线、热力图和 3D 视图?

设备每秒推来的采样批次和页面刷新的节奏通常不同。把每条采样直接推给 UI,会让绘制次数跟着输入速率增长。用做 Avalonia 监测页面时,可以把采集、显示窗口和视图更新拆开,再用测点 ID 把三个视图串起来。

2501_91602431的博客 58

智能体(GUI Agent / Computer-Use Agent / Action-Oriented AI)

2025–2026年,AI从“对话生成”迈向“动手执行”,指向智能体(GUI Agent)成为核心跃迁。其通过多模态理解、视觉定位与系统级操作,实现像人一样看屏、决策、点击、执行。底层依赖VLM+任务规划、坐标定位、记忆管理与环境感知。直接受益产业包括:软件工程(自动化开发)、企服SaaS(数字劳动力替代)、RPA升维、AI PC/手机端侧硬件、操作系统入口价值重估,以及推理算力与操作数据标注。未来将重塑生产力,推动“人+智能体集群”协同工作模式,实现社会全要素生产率跃升。

u013584020的博客 291

兰亭妙微ui设计公司分享:Qt桌面界面怎样把状态和操作设计清楚

左侧显示设备列表,中间展示当前设备的运行数据,右侧提供启动和暂停。列表刚切换,详情还没更新时,也要让等待状态足够明确,避免用户拿上一台设备的数据判断当前情况。视觉上可以用稳定的位置帮助确认对象身份,把设备名称、连接状态和更新时间放在容易找到的区域。界面方案刚开始时,可以挑一个范围明确的场景与开发一起验证,例如选择设备、修改一个参数、提交并看到结果。空间收窄时,次要面板是否可以折叠,工具栏是否可以分组,主操作是否仍有固定位置,都需要有清楚的取舍。只能查看的用户,和可以修改参数的用户,看到的入口可能不同。

lanlanwork12的博客 187

把 FSearch 搬上鸿蒙 PC:C 查询内核移植 + ArkTS 原生重写“秒搜“即时文件搜索全记录

这次移植的答案是"重写 + 真移植"的混合:架构层把上游的设计搬过来——core/UI 分层变成 Worker/Native 分层,GObject 信号变成回调字段,GTK headerbar 变成 ArkUI headerbar,GIO 的文件操作变成零权限的 picker 授权模型;内核层则把上游查询算法(lexer → shunting-yard → 表达式树 → matcher)用纯 C 重建并与交叉编译的 PCRE2 静态链接——正则匹配跑的就是与上游同一款引擎,连 JIT 容错语义都一脉相承。

todoitbo的博客 3977

微软技术日报 11-09:.NET 8 与 9 明日同时停止支持,注册表编辑器出了 WinUI 3 版

今天这四条消息的共同点是收口。.NET 8 和 9 的支持期到点,注册表编辑器的新界面只放在仓库里给人看,GitHub 把一类危险触发器按住默认,微软在安全报告里把防线从地址黑名单挪到行为。收口并不等于关门。.NET 10 还在支持期里,被按住的触发器可以用策略按文件放回来,实验室里的样例随时可能变成产品。区别在于这些动作要有人签字,不再是默认开着。如果今天只做一件事,去看一眼构建机上的 .NET 版本。明天之后,8 和 9 的漏洞补丁不会再来了。

海盗Sharp的博客 370
上一篇: 怎样来学习Symbian C++?
下一篇: S60 sample project 之 Myview
moonson
博客等级 码龄21年 8粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值