blog.TangGaowei.com

设置 Symbian 应用程序的背景图片

作者 Neot 写于 2011-12-08 | 49 次浏览

(红色字体为添加的代码)

1. 环境

  • Carbide C++ 2.7 (注:Carbide C++ 3.2 适于 S60 的开发,且没有 UI 编辑器)
  • S60 3rd Edition FP1 SDK(FP2 没有测过)
  • Windows 7(Windows xp 应该也不会有什么问题)

2. 新建 Symbian OS C++ Project

  • 选择 S60/GUI Application with UI Designer,Next
  • Project Name 处输入 Skinned,其它默认,Next
  • 选择 S60_3rd_FP1,其它默认,Next
  • Inital language 选择 Peoples Republic of Chinas Chinese(31),其它默认,Next
  • S60 UI Design Selection 默认,Next
  • Container Name and Type 默认,Finish

3. 在项目的 group/Skinned.mmp 文件里添加 Library 引用

LIBRARY aknskins.lib aknskinsrv.lib aknswallpaperutils.lib

4. 将图片添加到项目

将准备好的图片入在 gfx 目录下,并刷新项目。本例使用 cba_bg.bmp 文件作为 CBA 区的背景,使用 main_bg.bmp 文件作为主显示区的背景。作者还未研究过 svg 图片的使用,所以这里都使用的是 BMP 图片。还要注意,其它格式的图片,如 PNG 类型的好像用不了,作者也未深入研究。

5. 将图片添加到项目的资源库

在 MMP 文件中进行添加(红色字体部分),然后重新编译:
START BITMAP      Skinned.mbm
HEADER
TARGETPATH        \resource\apps
SOURCEPATH        ..\gfx
SOURCE      c12,1 list_icon.bmp list_icon_mask.bmp
SOURCE      c24 cba_bg.bmp main_bg.bmp END
(“c24”可能是 24 位位图的意思)

编译后,系统自动重新生成 Epoc32\include\Skinned.mbg 文件:
enum TMbmSkinned {  EMbmSkinnedList_icon, 
EMbmSkinnedList_icon_mask, EMbmSkinnedCba_bg,  EMbmSkinnedMain_bg  };
(MBG 文件是系统自动生成的,最好不要自己修改)

6.修改 inc/SkinnedContainer.h 文件

#include <AknsBasicBackgroundControlContext.h> //for CAknsBasicBackgroundControlContext
#include <AknsDrawUtils.h> //for AknsDrawUtils, CAknsItemDef and MAknskinInstance
#include <AknUtils.h> //for CompeleteWithAppPath()
class CSkinnedContainer : public CCoeControl
{
protected:
virtual TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
private:
CAknsBasicBackgroundControlContext* iBackGround;
}

7.修改 src/SkinnedContainer.cpp 文件

 // EMbmSkinnedMain_bg、EMbmSkinnedCba_bg
#include <Skinned.mbg>

// bitmapFile
_LIT( KSkinnedFile, ”\\resource\\apps\\Skinned.mbm” );

// MopSupplyObject must provide a pointer to the control context, in this example the CAknsBasicBackgroundControlContext instance.
TTypeUid::Ptr CSkinnedContainer::MopSupplyObject(TTypeUid aId)
    {
    if(aId.iUid == MAknsControlContext::ETypeId && iBackGround)
        {
        return MAknsControlContext::SupplyMopObject( aId, iBackGround);
        }
    return CCoeControl::MopSupplyObject( aId );
    }

// Init
void CSkinnedContainer::ConstructL(
            const TRect& aRect,
            const CCoeControl* aParent,
            MEikCommandObserver* aCommandObserver )
      {
      if ( aParent == NULL )
          {
            CreateWindowL();
          }
      else
          {
          SetContainerWindowL( *aParent );
          }
      iFocusControl = NULL;
      iCommandObserver = aCommandObserver;
      InitializeControlsL();
      SetRect( aRect );
      
      iBackGround = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgAreaMain, Rect(), EFalse );
      TFileName bitmapFile (KSkinnedFile);
      User::LeaveIfError(CompleteWithAppPath(bitmapFile));
            
      MAknsSkinInstance* skin = AknsUtils::SkinInstance();
      skin->SetLocalItemDefL(AknsUtils::CreateBitmapItemDefL(KAknsIIDQsnBgAreaMain, bitmapFile, EMbmSkinnedMain_bg));
      skin->SetLocalItemDefL(AknsUtils::CreateBitmapItemDefL(KAknsIIDQsnBgAreaControl, bitmapFile, EMbmSkinnedCba_bg));
            
      ActivateL();
      // [[[ begin generated region: do not modify [Post-ActivateL initializations]
      // ]]] end generated region [Post-ActivateL initializations]      
      }

// Draw container contents.
void CSkinnedContainer::Draw( const TRect& aRect ) const
      {
      // [[[ begin generated region: do not modify [Generated Contents]
      CWindowGc& gc = SystemGc();
      gc.Clear( aRect );
     
      MAknsSkinInstance* skin = AknsUtils::SkinInstance();
      MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
      AknsDrawUtils::Background( skin, cc, this, gc, aRect );
      
      // ]]] end generated region [Generated Contents]      
      }// Resize

void CSkinnedContainer::SizeChanged()

      {
      CCoeControl::SizeChanged();
      LayoutControls();
      // [[[ begin generated region: do not modify [Generated Contents]
      if ( iBackGround )
            {
            iBackGround->SetRectRect() );
            if ( &Window() )
                  iBackGround->SetParentPosPositionRelativeToScreen() );
            }
      // ]]] end generated region [Generated Contents]
      
      }


// Destroy child controls
CSkinnedContainer::~CSkinnedContainer()
      {
      // [[[ begin generated region: do not modify [Generated Contents]
      delete iBackGround;
      iBackGround = NULL;
      // ]]] end generated region [Generated Contents]
      
      }
//(如果有资源方面的错误,请做一次Clear,并重新编译)

8. 备注

如果有设置状态栏的背景,可以使用以下代码:

skin->SetLocalItemDefL(AknsUtils::CreateBitmapItemDefL(KAknsIIDQsnBgAreaStatus, bitmapFile, EMbmSkinnedStatus_bg));

但是,在 S60 3rd Edition FP1 下,设置状态栏背景的效果并不好,只对状态栏的一部分有效。在 S60 3rd Edition FP2 下设置状态栏背景可以获得满意的效果。

如果不想使用状态,可以将其隐藏:
CEikStatusPane* statusp = iEikonEnv->AppUiFactory()->StatusPane();
if(statusp)
{
statusp->MakeVisible(EFalse);
}
S60 3rd Edition FP1 下隐藏状态栏和全屏都不能达到完美的效果,在程序启动时会有一个原始默认的窗口一闪而过。S60 3rd Edition FP1 系统自带的软件也同样存在这样的问题。非全屏的应用程序也是先出现一个原始默认窗口,再出现正式的窗口。有网友称此问题无法得到解决。

 

[ 标签: symbian ]
[ 固定链接:http://blog.tanggaowei.com/2011/12/symbian-skin.html ]

OPENCART 1.5.1.3.1 中文支付宝版(集成3个支付宝插件)

作者 Neot 写于 2011-11-29 | 137 次浏览

OpenCart 1.5.1.3.1 中文版,并集成支付宝插件,即装即用

该版本不只使用汉化包汉化,还有数据库数据的汉化,包括货币、库存状态、订单状态、国家、地区、税种、单位等。基本上是安装好了,配置系统基本信息和支付宝插件就可以使用了。

集成的支付宝插件包括:担保交易即时到帐双功能三个版本。

获取地址:http://item.taobao.com/item.htm?id=13386946961 (购买后我用邮件发送给您)

 

[ 标签: 无 ]
[ 固定链接:http://blog.tanggaowei.com/2011/11/opencart-width-alipay.html ]

Outlook导入CVS文件出错的可能原因

作者 Neot 写于 2011-05-21 | 248 次浏览

我用 Java 程序从其它系统导出 CVS 文件,然后将此文件导入 Outlook,但是一直报以下错误:

“文件错误出现在逗号分隔的值(Windows) 转换程序 初始化转换程序用于生成字段映射时。”

用 Excel 打开后另存为新的 CVS 文件,然后用新的文件导入 Outlook 又可能成功。我用 Editplus 比对了两个 CVS 文件,但是看不出任何区别。真是让人摸不着头脑。网上搜了一下,只有提问,没有一个有用的回答。无奈之下,换一种思考方式:看看人家用 Java 写的 CVS 导出代码跟我有什么不同。结果还真让我发现了问题。

原来,我写的 Java 代码里用 “\n” 换行,别人写的用 “\r\n” 换行。我改成 “\r\n” 换行后就i能成功导入 Outlook 了。

不知道大家是否和我的原因相同。

[ 标签: CVS, Excel ]
[ 固定链接:http://blog.tanggaowei.com/2011/05/outlookcvs.html ]

解决 Nutz Dao 事务处理不能返回执行状态的问题

作者 Neot 写于 2011-05-13 | 54 次浏览

1. 在项目中创建 org.nutz.trans.MyTrans

2.写入一下代码

  1. package org.nutz.trans;
  2.  
  3. import java.sql.Connection;
  4.  
  5. import org.nutz.lang.Lang;
  6. import org.nutz.lang.Mirror;
  7.  
  8. public abstract class MyTrans {
  9.  
  10. private static Class<? extends Transaction> implClass;
  11.  
  12. static ThreadLocal<Transaction> trans = new ThreadLocal<Transaction>();
  13. static ThreadLocal<Integer> count = new ThreadLocal<Integer>();
  14.  
  15. public static Transaction get() {
  16. return trans.get();
  17. }
  18.  
  19. public static void setup(Class<? extends Transaction> classOfTransaction) {
  20. implClass = classOfTransaction;
  21. }
  22.  
  23. private static void begain(int level) throws Exception {
  24. if (null == trans.get()) {
  25. Transaction tn = null == implClass ? new NutTransaction() : Mirror.me(implClass).born();
  26. tn.setLevel(level);
  27. trans.set(tn);
  28. count.set(0);
  29. }
  30. count.set(count.get() + 1);
  31. }
  32.  
  33. private static void commit() throws Exception {
  34. count.set(count.get() - 1);
  35. if (count.get() == 0)
  36. trans.get().commit();
  37. }
  38.  
  39. private static void depose() {
  40. if (count.get() == 0)
  41. try {
  42. trans.get().close();
  43. }
  44. catch (Throwable e) {
  45. throw Lang.wrapThrow(e);
  46. }
  47. finally {
  48. trans.set(null);
  49. }
  50. }
  51.  
  52. private static void rollback(Integer num) {
  53. count.set(num);
  54. if (count.get() == 0)
  55. trans.get().rollback();
  56. }
  57.  
  58. public static boolean exec(Atom... atoms) {
  59. return exec(Connection.TRANSACTION_READ_COMMITTED, atoms);
  60. }
  61.  
  62. public static boolean exec(int level, Atom... atoms) {
  63. if (null == atoms)
  64. return true;
  65. int num = count.get() == null ? 0 : count.get();
  66. try {
  67. begain(level);
  68. for (Atom atom : atoms)
  69. atom.run();
  70. commit();
  71. }
  72. catch (Throwable e) {
  73. rollback(num);
  74. //throw Lang.wrapThrow(e);
  75. return false;
  76. }
  77. finally {
  78. depose();
  79. }
  80.  
  81. return true;
  82. }
  83. }

 

3.用法

  1. boolean flag = false;
  2.  
  3. final User u = new User();
  4. final Role r = new Role();
  5.  
  6. if (role.getId() == 0) {
  7. // Begin transaction
  8. flag = MyTrans.exec(new Atom(){
  9. public void run() {
  10. basicDao.save(u);
  11. basicDao.save(r);
  12. }
  13. });
  14. // End transaction
  15. }
[ 标签: Nutz, 事务 ]
[ 固定链接:http://blog.tanggaowei.com/2011/05/nutz-dao.html ]

Nutz 中 Ico 的深一层理解

作者 Neot 写于 2011-05-10 | 31 次浏览
  1. // 构建 IOC 对象
  2. Ioc ioc = new NutIoc(new JsonLoader("conf/dao.js"));
  3. // 从 ICO 中提取 Dao 类型的对象 dao
  4. Dao dao = ioc.get(null, "dao");

Ioc.get()方法的第一个参数等于null 时,那么返回的类型就由 dao.js 文件中定义的类型来决定。

一般情况 dao.js 中定义的类型是 org.nutz.dao.impl.NutDao。但是你也可以定义自己的类型作为 ico.get(null,”dao”) 方法的返类型,比如 com.dao.impl.MyDao。只要 com.dao.impl.MyDao 实现了 Dao 接口就是对的。这样,我们就可以通过修改 dao.js 文件来改变程序的执行。

如果再在 dao.js 中加入事件监听,甚至可以通过监听器从数据库里取出数据,为 ico.get() 的返回对象赋值。

[ 标签: ICO, Nutz ]
[ 固定链接:http://blog.tanggaowei.com/2011/05/nutz-ico.html ]

订阅

 

手机访问

http://blog.tanggaowei.com/wap/

Google