把自己在界面设计时碰到的问题及解决方法整理出来和大家分享,相信对大家有所帮助。 不断更新...
1.按下导航OK键能弹出菜单
看SDK根目录"/Series60Ex/menu/"这个例子,注意一下"aknexmenuokcontainer.cpp",它实现了一个很不错的功能:在按下导航键"OK"时能弹出菜单。可以看出主要是它的OfferKeyEventL()函数在起作用,所以试试把相关代码移到HandleCommandL()函数中应该就可以实现你要的功能。(from chenziteng)
- TKeyResponse CAknExMenuOkContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
- TEventCode aType )
- {
- TKeyResponse keyResponce( EKeyWasNotConsumed );
- keyResponce = iLowerText->OfferKeyEventL( aKeyEvent, aType );
- if ( keyResponce == EKeyWasNotConsumed )
- {
- if ( ( aType == EEventKey ) && ( aKeyEvent.iCode == EKeyOK ) )
- {
- // 从这儿
- iParent->MenuBar()->
- SetMenuTitleResourceId( R_AKNEXMENU_MENUBAR_OK_TEST );
- if ( iParent->MenuBar() )
- {
- iParent->MenuBar()->StopDisplayingMenuBar();
- }
- if (iParent->MenuBar())
- {
- iParent->MenuBar()->TryDisplayMenuBarL();
- }
- }
- iParent->MenuBar()->
- SetMenuTitleResourceId( R_AKNEXMENU_MENUBAR_OK_MENU );
- // 到这儿
- return EKeyWasConsumed;
- }
- return keyResponce;
- }
2. 动态改变左右softkeys
- .rss文件
- RESOURCE CBA r_yourapp_softkeys_options_stop
- {
- buttons =
- {
- CBA_BUTTON { id=EAknSoftkeyOptions; txt = "Options"; },
- CBA_BUTTON { id=EYourAppCmdStopApp; txt = "Stop"; }
- };
- }
- .hrh文件
- enum TYourAppCommandIds
- {
- // ...
- id=EYourAppCmdOpenApp,
- id=EYourAppCmdStopApp,
- // ...
- };
- appui.cpp
- DynInitMenuPaneL()
- {
- Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);//换成r_yourapp_softkeys_options_stop
- Cba()->MakeVisible(ETrue);
- Cba()->DrawDeferred();
- }
3. 在任意位置动态显示图片
void CAppContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
{
CreateWindowL();
_LIT( KMbmFilePlay, "
//System//apps//Password//PlayStatus.mbm");
iPlayBmp = new ( ELeave ) CFbsBitmap();
TFileName aFile1( KMbmFilePlay );
int err3=CompleteWithAppPath( aFile1 );
int err4=iPlayBmp->Load( aFile1,0);
iPlayRecStatus=0;
SetRect(aRect);
ActivateL();
}
iPlayBmp = new ( ELeave ) CFbsBitmap();
TFileName aFile1( KMbmFilePlay );
int err3=CompleteWithAppPath( aFile1 );
int err4=iPlayBmp->Load( aFile1,0);
iPlayRecStatus=0;
SetRect(aRect);
ActivateL();
}
void CAppContainer::Draw(const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.Clear( aRect );
{
CWindowGc& gc = SystemGc();
gc.Clear( aRect );
if(iPlayRecStatus==1)//playing
{
TPoint aPos(10, 200);
gc.BitBlt( aPos, iPlayBmp );
}
}
{
TPoint aPos(10, 200);
gc.BitBlt( aPos, iPlayBmp );
}
}
void CAppContainer::StartDisplay(const TInt i)
{
iPlayRecStatus=i;
DrawDeferred();//调用Draw()
}
{
iPlayRecStatus=i;
DrawDeferred();//调用Draw()
}
4.
如何使Symbian程序一直全屏显示
一般而言有如下几种方法:
一般而言有如下几种方法:
1,在Container的ConstructL中,调用SetExtentToWholeScreen ();
缺点是一按下“选项”,StatusPane和CBA又出来了。
2,在View的DoActivateL中,调用AppUi()->ApplicationRect()。
同样有如上的问题。
iMobile517MainContainer = CMobile517MainContainer::NewL(AppUi()->ApplicationRect(), NULL, this );
3,通过隐藏Status Pane和CBA,这种方法比较灵光(需要和2同时使用)!
在Container的ConstructL函数中调用:
CEikStatusPane* statusp = iEikonEnv->AppUiFactory()->StatusPane();
if(statusp) statusp->MakeVisible(EFalse);
iEikonEnv->AppUiFactory()->Cba()->MakeVisible(EFalse);
if(statusp) statusp->MakeVisible(EFalse);
iEikonEnv->AppUiFactory()->Cba()->MakeVisible(EFalse);
5. 怎样开发自适应各种屏幕尺寸的程序?
s60手机尺寸共三种:176*208,240*320,352*416。初期可只考虑240*320(覆盖了三版大多数机型),为保证图片在不同分辨率下都能正常显示,如果不是商业产品, 那么可以考虑 svg, 但是如果比较正式的话, 做3套UI, 代码里使用宏一类的技术手段去条件编译, 不同的机型会出不同的版本,SVG只能处理简单图形,类似游戏中用的复杂图形也无能为力.
可参考的可缩放界面实例有
S60 Platform: Scalable UI Example和
S60 Platform: Scalable Screen-Drawing Example实例都是不错的,可以参考
http://www.forum.nokia.com/main/reso.../graphics.html
S60 Platform: Scalable Screen-Drawing Example实例都是不错的,可以参考
http://www.forum.nokia.com/main/reso.../graphics.html