symbian UI 简介

 简单些个关于UI方面的笔记吧。

File—New—Symbian OS C++ Project。

使用的是GUI Application。

rss是资源文件,关于一些资源的注册信息。

rls则是一些在rss文件中会使用到的本地字符串。

hrh文件则是rss和cpp都会使用到的一些定义。

pan文件是定义panic的文件。

建立一个UI工程可以看到默认的5个文件,XXAppUi,XX.CPP,XXDocument,XXAppView,XXApplication。发现和MFC很相似哦。如果熟悉MFC的应该觉得很眼熟吧。其实也就是这么回事。

具体是什么以后再写好了,没时间了。XXAppUi就是MFC的框架类,其他四个类就是对应的类。XX.CPP是程序入口了哦。

第二天, 继续。

可以看到E32Main在XX.CPP里面,这是入口啊。紧接着就创建了一个XXApplication,在XXApplication里面又创建了一个XXDocument,XXDocument里面创建XXAppUi,XXAppUi里面看到没有,一个XXAppView指针变量哦,又开始创建XXAppView了。

XXAppView继承的CCoeControl类,control可以控制屏幕上显示的那块长方形区域。几乎所有UI单元都是control。control继承CCoeControl类,使用Draw函数,其中通过SystemGc()获取CWindowGc,就可以在其中进行绘制操作了。如果一个control想获得按键事件,那么可以使用:

TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType );
返回值:EKeyWasConsumed和EKeyWasNotConsumed两种。
CCoeControl就是control的容器。
 
class CExContainer : public CCoeControl
{
  void ConstructL ( const TRect& aRect )
  virtual TInt CountComponentControls () const ;
  virtual CCoeControl* ComponentControl ( TInt aIndex ) const ;
  virtual void SizeChanged ();
  CExControl* iControl; // may have several child controls
}
内容:
 
void CExContainer::ConstructL ( const TRect& aRect )
  CreateWindowL();
  CExControl* iControl = new ( ELeave ) CExControl();
  iControl->SetContainerWindowL( *this );
  iControl-> (do some other control initialization)
TInt CExContainer::CountComponentControls ()
    return KNumberOfChildControls; (defines valid aIndex values)
CCoeControl* CExContainer::ComponentControl ( TInt aIndex )
  switch ( aIndex )
    (return a child control for each valid aIndex)
    (in default clause return NULL)
 
void CExContainer::SizeChanged ()
  iControl-> (set size and position relative to new size)
 
举个例子定义菜单资源,可以在option中看到添加了一个新的选项。步骤:
1、在rls中增加一个字符串define,比如我增加一个名字为qtn_test的字符串,内容是“test button”
#define qtn_test “test button”
2、在inc文件夹里面也就是include文件夹,可以找到一个后缀名为hrh的头文件,在XXIds的枚举里增加一个ETest。
3、在rss文件里面的RESOURCE MENU_PANE r_menu里面增加一个
MENU_ITEM
    {
    command = ETest;
    txt = qtn_test;
    },
也就是增加菜单项了。
4、这个时候全部都有了,可以使用了,就在XXAppUi里面的HandleCommandL函数里面增加一个case就可以了。
case ETest:
   {
   ...
   }
   break;
大括号里面的内容就可以随意发挥了,你希望按钮按下后怎么做,就怎么写。
然后呢我决定使用一个label,使用CEikLabel类。要想正确使用它就要确保有eikcoctl.lib。在使用carbide时其mmp文件中可以手动也可以利用其工具,添加:
LIBRARY eikcoctl.lib
我在view类里面添加了一个public成员变量,其实用私有成员变量,再添加个公有接口更好,不过现在是练习,这样更方便而已。
别忘记在析构函数中delete。
我在view类的ConstructL里面new ( ELeave )CEikLabel一个指针赋值给成员变量,然后再将其SetTextL, 最重要的来了,一定要重写虚函数
virtual CCoeControl* ComponentControl( TInt aIndex ) const;
virtual TInt CountComponentControls() const;
后者是当前view里面有多少个组件,比如label的个数或是其他什么按钮的个数总和。
前者组件的控制,可以用一个switch语句,根据序号返回组件的指针。序号次序不论。
还有一个很重要就是尺寸和位置问题,否则也是无法显示出来的。在SizeChanged里面,label使用SetExtent设置其位置和大小。
如果你想要画些什么东西在里面,那么就在draw里面绘制吧。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值