在文本(CEikRichTextEditor)中插入带背景的图片

适用版本:

Series 60 2nd , Series 60 3rd

更多关于在文本中插入图片参见这里: [1]

一般情况下,在CEikRichTextEditor中插入的图片都是绘制在白色的背景上的,包括Forum Nokia提供的示例也是如此,如果在带有背景的Editor中使用会很别扭,下面将演示如何在文本中插入带背景的图片。


方案思路:

首先CRTxPicture是一个继承自CPicture的图片类,在该类的Draw()函数中首先绘制背景,然后在其之上绘制实际的图片。

void CRTxPicture::Draw(CGraphicsContext& aGc, const TPoint& aTopLeft,   const TRect& aClipRect, MGraphicsDeviceMap* aMap) const
 {
    CBitmapContext& gc = static_cast(aGc);
    TRect bmpPieceRect(TPoint(0,0),iBitmap->SizeInPixels());
    
    // here is the skin background drawn
    iControl.RTxDrawBackground(aTopLeft, bmpPieceRect, gc);
 
    // then the picture itself
    gc.BitBltMasked(aTopLeft, iBitmap, bmpPieceRect, iBitmapMask, ETrue);
 }

背景实际是在容器(Container)中绘制的,因此Container必须继承自MRTxBackgroundDrawer类,而且必须实现其中的RTxDrawBackground ()函数。

class MRTxBackgroundDrawer
 {
 public:
    virtual void RTxDrawBackground(const TPoint& aDstPos, const TRect& aRect, CBitmapContext& gc) = 0;
 };
 class CMyAppContainer : public CCoeControl, public MRTxBackgroundDrawer
 void CMyAppContainer::RTxDrawBackground(const TPoint& aDstPos, const  TRect& aRect, CBitmapContext& gc)
 {
 #ifdef USE_SKIN
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
    AknsDrawUtils::DrawBackground(skin, cc, this, gc, TPoint(0, 0), aRect, KAknsDrawParamDefault);
 #else
    gc.SetPenStyle(CGraphicsContext::ENullPen);
    gc.SetBrushColor(KRgbBlue);
    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    gc.DrawRect(aRect);
 #endif
 }
 
然后我们就可以通过以下 InsertPictureL()函数进行插入图片了。
 
 void CRTx::InsertPictureL(MRTxBackgroundDrawer& aControl, TInt aPos, CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask)
 {
    CRTxPicture* picture;
    
    picture = new(ELeave) CRTxPicture(iTextBox->GetSystemGc(), aControl, aBitmap, aBitmapMask);
    
    CleanupStack::PushL(picture);
    TPictureHeader header;
    header.iPicture = TSwizzle(picture);
    
    iTextBox->RichText()->InsertL(aPos, header);
    
    CleanupStack::Pop(); 
 }

在绘制背景时(RTxDrawBackground函数)使用了USE_SKIN来判断应用程序中的Editor是否使用了背景,因此如果使用了背景,需要在.mmp文件中加入以下语句:

 MACRO USE_SKIN

完整的示例代码如下:

///
 // MyAppContainer.cpp (parts)
 ///
 
 #include 
 #include 
 #include 
 #include 
 #include "RTx.h"
 #include 
 #include "MyAppDocument.h"
 #include "MyAppViewDevices.h"
 #include "MyAppContainer.h"
 
 #ifdef USE_SKIN
 #include 
 #include 
 #endif
 
 #define LKMyAppMIF L"\\resource\\apps\\myapp.mif"
 
 CMyAppContainer::CMyAppContainer(CMyAppViewDevices* aView) : iView(aView)
 {
 }
 
 CMyAppContainer::~CMyAppContainer()
 {
    delete iRTx;
    delete iTextBox;
    for(int i = 0; i < iBitmap->Count(); i++)
        delete iBitmap->At(i);
    delete iBitmap;
    for(int i = 0; i < iBitmapMask->Count(); i++)
        delete iBitmapMask->At(i);
    delete iBitmapMask;
 #ifdef USE_SKIN
    delete iBackGround;
 #endif
 }
 
 void CMyAppContainer::LoadBitmapListL()
 {
    _LIT(KMyAppMif, KMyAppMIF);
    PrepareBitmapL(KMyAppMif, EMbmMyAppmifImage, EMbmMyAppmifImage_mask);  // the image (bitmap or svg)
 }
 
 void CMyAppContainer::AddSomeTextAndImageL()
 {
    _LIT(KText1, "Hello World!");
 
    iRTx->AddTextL(KText1);
    iRTx->AddCarriageReturnL();
    iRTx->AddPictureL(*this, *(iBitmap->At(0)), *(iBitmapMask->At(0)));
 }
 
 void CMyAppContainer::ConstructL(const TRect& aRect)
 {
    CreateWindowL();
 
    iBitmap = new (ELeave) CArrayFixFlat(1);
    iBitmapMask = new (ELeave) CArrayFixFlat(1);
 
    LoadBitmapListL();
 
    iTextBox = new (ELeave) CRTxEditor(TGulBorder::ENone);
    iTextBox->SetMopParent(this);
    iRTx = new (ELeave) CRTx(iTextBox);
 
    TInt edwinFlags = EEikEdwinInclusiveSizeFixed|EEikEdwinNoAutoSelection|EEikEdwinDisplayOnly|EEikEdwinReadOnly|
        EEikEdwinLineCursor|EEikEdwinNoHorizScrolling|EEikEdwinAvkonDisableCursor;
 
    iTextBox->ConstructL(this, 0, 0, edwinFlags,EGulFontControlAll, EGulAllFonts);
    iTextBox->SetAknEditorFlags(edwinFlags);
 
    iTextBox->SetContainerWindowL(*this);
    iTextBox->SetFocus(ETrue);
 
    AddSomeTextAndImageL(); 
    
    SetRect(aRect);
 #ifdef USE_SKIN
    iBackGround = CAknsBasicBackgroundControlContext::NewL( KAknsIIDQsnBgAreaMain, Rect(), EFalse );
 #endif
    ActivateL();
 }
 
 void CMyAppContainer::SizeChanged()
 {
    TRect r = Rect();
    if (iTextBox)
    {
        TSize scr = CEikonEnv::Static()->ScreenDevice()->SizeInPixels();
        iTextBox->SetExtent(TPoint(0, 0), TSize(r.Width(), r.Height()));
    }
 }
 
 void CMyAppContainer::HandleResourceChange(TInt aType)
 {
    CCoeControl::HandleResourceChange(aType);
    if (aType == KEikDynamicLayoutVariantSwitch)
    {
        SetRect(iView->ClientRect());
    }
 }
 
 void CMyAppContainer::Draw(const TRect& aRect) const
 {
    CWindowGc& gc = SystemGc();
 #ifdef USE_SKIN
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
    AknsDrawUtils::Background(skin, cc, this, gc, aRect);
 #else
    gc.SetPenStyle(CGraphicsContext::ENullPen);
    gc.SetBrushColor(KRgbBlue);
    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    gc.DrawRect(aRect);
 #endif
 }
 
 TInt CMyAppContainer::CountComponentControls() const
 {
    return 1;
 }
 
 CCoeControl* CMyAppContainer::ComponentControl(TInt aIndex) const
 {
    switch (aIndex)
    {
    case 0:
        return iTextBox;
    default:
        return NULL;
    }
 }
 
 TKeyResponse CMyAppContainer::OfferKeyEventL(const TKeyEvent& keyEvent, TEventCode type)
 {
    if (type != EEventKey )
        return EKeyWasNotConsumed;
 
    switch (keyEvent.iCode)
    {
    case EKeyLeftArrow:
    case EKeyRightArrow:
        return EKeyWasNotConsumed;
    }
    return iRTx->OfferKeyEventL(keyEvent, type);
 }
 
 // from MRTxBackgroundDrawer
 void CMyAppContainer::RTxDrawBackground(const TPoint& aDstPos, const  TRect& aRect, CBitmapContext& gc)
 {
 #ifdef USE_SKIN
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
    AknsDrawUtils::DrawBackground(skin, cc, this, gc, TPoint(0, 0), aRect, KAknsDrawParamDefault);
 #else
    gc.SetPenStyle(CGraphicsContext::ENullPen);
    gc.SetBrushColor(KRgbBlue);
    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    gc.DrawRect(aRect);
 #endif
 }
 
 #ifdef USE_SKIN
 TTypeUid::Ptr CMyAppContainer::MopSupplyObject(TTypeUid aId)
 {
    if (aId.iUid == MAknsControlContext::ETypeId && iBackGround)
        return MAknsControlContext::SupplyMopObject(aId, iBackGround);
    return CCoeControl::MopSupplyObject(aId);
 }
 #endif
 
 void CMyAppContainer::PrepareBitmapL(const TDesC& aFileName, TInt aId, TInt aIdMask)
 {
    CFbsBitmap* bitmap, *bitmap_mask;
    AknIconUtils::CreateIconL(bitmap, bitmap_mask, aFileName, aId, aIdMask);
    TSize scr = CEikonEnv::Static()->ScreenDevice()->SizeInPixels();
    TSize iconSize(scr.iWidth / 2, scr.iWidth / 3); // sample resizing - depends on the image
    AknIconUtils::SetSize(bitmap, iconSize, EAspectRatioNotPreserved);
    AknIconUtils::SetSize(bitmap_mask, iconSize, EAspectRatioNotPreserved);
    iBitmap->AppendL(bitmap);
    iBitmapMask->AppendL(bitmap_mask);
 }
///
 // RTxBackgroundDrawer.h       
 ///
 
 /* Leszek Buczkowski, Ingraal 2006 */
 
 #ifndef __RTX_BACKGROUND_DRAWER_H__
 #define __RTX_BACKGROUND_DRAWER_H__
 
 class MRTxBackgroundDrawer
 {
 public:
    virtual void RTxDrawBackground(const TPoint& aDstPos, const TRect& aRect, CBitmapContext& gc) = 0;
 };
 
 #endif
///
 // RTxPicture.h                
 ///
 
 /* Leszek Buczkowski, Ingraal 2006 */
 
 #ifndef __RTX_PICTURE_H__
 #define __RTX_PICTURE_H__
 
 #include 
 
 class CWindowGc;
 class TSize;
 class CFbsBitmap;
 class MRTxBackgroundDrawer;
 
 class CRTxPicture : public CPicture
 {
 public:  // no destructor - bitmap not owned
    CRTxPicture(CWindowGc& gc, MRTxBackgroundDrawer& aControl, CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask);
 
 public: 
    TBool LineBreakPossible(TUint aClass, TBool aBeforePicture, TBool aHaveSpaces) const {return EFalse;};
    void Draw(CGraphicsContext& aGc, const TPoint& aTopLeft, const TRect& aClipRect, MGraphicsDeviceMap* aMap) const;
    void ExternalizeL(RWriteStream& aStream) const {};
    void GetOriginalSizeInTwips(TSize& aSize) const {aSize = iSizeInTwips;};
 
 protected:
    TSize iSizeInTwips;
    MRTxBackgroundDrawer& iControl;
    CFbsBitmap* iBitmap;
    CFbsBitmap* iBitmapMask;
 };
 
 #endif
///
 // RTxPicture.cpp              
 ///
 
 /* Leszek Buczkowski, Ingraal 2006 */
 
 #include 
 #include 
 #include "RTxPicture.h"
 #include "RTxBackgroundDrawer.h"
 
 #ifdef USE_SKIN
 #include 
 #include 
 #endif
 
 CRTxPicture::CRTxPicture(CWindowGc& gc, MRTxBackgroundDrawer& aControl,  CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask) : iControl(aControl), iBitmap(&aBitmap), iBitmapMask(&aBitmapMask)
 {
    TSize sizeInPixels = gc.Device()->SizeInPixels();
    TSize sizeInTwips = gc.Device()->SizeInTwips();
    TSize bitmapSizeInPixels = aBitmap.SizeInPixels();
    iSizeInTwips = TSize(sizeInTwips.iWidth * bitmapSizeInPixels.iWidth / sizeInPixels.iWidth, sizeInTwips.iHeight * bitmapSizeInPixels.iHeight / sizeInPixels.iHeight);
 }
 
 void CRTxPicture::Draw(CGraphicsContext& aGc, const TPoint& aTopLeft, const TRect& aClipRect, MGraphicsDeviceMap* aMap) const
 {
    CBitmapContext& gc = static_cast(aGc);
    TRect bmpPieceRect(TPoint(0,0),iBitmap->SizeInPixels());
    
    // here is the skin background drawn
    iControl.RTxDrawBackground(aTopLeft, bmpPieceRect, gc);
 
    // then the picture itself
    gc.BitBltMasked(aTopLeft, iBitmap, bmpPieceRect, iBitmapMask, ETrue);
 }
///                 
 // RTx.h                       
 ///
 
 /* Leszek Buczkowski, Ingraal 2006 */
 
 #ifndef __RTX_H__
 #define __RTX_H__
 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include "RTxBackgroundDrawer.h"
 
 class CWindowGc;
 class CFbsBitmap;
  
 // CRTxEditor is derived from CEikRichTextEditor in order to make  protected GetSystemGc available
 // as public (used in CRTx::InsertPictureL)
 class CRTxEditor : public CEikRichTextEditor
 {
 public:
    CRTxEditor(const TGulBorder& aBorder) { iBorder = aBorder; };
    CWindowGc& GetSystemGc() const { return SystemGc(); };
 };
 
 class CRTx : public CBase
 {
 public:
    CRTx(CRTxEditor* aTextBox);
    ~CRTx();
    TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
    void AddCarriageReturnL();
    void AddTextL (const TDesC& aText);
    void InsertPictureL(MRTxBackgroundDrawer& aControl, TInt aPos, CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask);
    void AddPictureL(MRTxBackgroundDrawer& aControl, CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask);
 
 private: 
    CRTxEditor* iTextBox;
    TCharFormatMask iCharFormatMask;
    TCharFormat iCharFormat;
 };
 
 #endif
///
 // RTx.cpp                     
 ///
 
 /* Leszek Buczkowski, Ingraal 2006 */
 
 #include "RTx.h"
 #include "RTxPicture.h"
 #include 
 #include 
 
 CRTx::CRTx(CRTxEditor* aTextBox)
 {
    iTextBox = aTextBox;
 }
 
 CRTx::~CRTx()
 {
 }
 
 void CRTx::AddCarriageReturnL()
 {
    CRichText* richText = iTextBox->RichText();
    richText->InsertL(richText->DocumentLength(), CEditableText::ELineBreak);
    iTextBox->HandleTextChangedL();
 }
 
 void CRTx::AddTextL(const TDesC& aText)
 {
    CRichText* richText = iTextBox->RichText();
    TInt documentLength = richText->DocumentLength();
    richText->InsertL (documentLength, aText);
    richText->ApplyCharFormatL(iCharFormat, iCharFormatMask,documentLength,aText.Length());
    iTextBox->HandleTextChangedL();
 }
 
 void CRTx::InsertPictureL(MRTxBackgroundDrawer& aControl, TInt aPos, CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask)
 {
    CRTxPicture* picture;
    picture = new(ELeave) CRTxPicture(iTextBox->GetSystemGc(), aControl, aBitmap, aBitmapMask);
    CleanupStack::PushL(picture);
    TPictureHeader header;
    header.iPicture = TSwizzle(picture);
    iTextBox->RichText()->InsertL(aPos, header);
    CleanupStack::Pop(); 
 }
 
 void CRTx::AddPictureL(MRTxBackgroundDrawer& aControl, CFbsBitmap& aBitmap, CFbsBitmap& aBitmapMask)
 {
    CRichText* richText = iTextBox->RichText();
    TInt documentLength = richText->DocumentLength();
    InsertPictureL(aControl, documentLength, aBitmap, aBitmapMask);
 }
 
 TKeyResponse CRTx::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
 {
    if (aType == EEventKey)
    {
        if (aKeyEvent.iCode == EKeyDownArrow)
        {
            iTextBox->MoveCursorL (TCursorPosition::EFPageDown, EFalse);
            return EKeyWasConsumed;
        }
        else if (aKeyEvent.iCode == EKeyUpArrow)
        {
            iTextBox->MoveCursorL (TCursorPosition::EFPageUp, EFalse);
            return EKeyWasConsumed;
        }
        else
        {
            return iTextBox->OfferKeyEventL(aKeyEvent, aType);
        }
    }
    return EKeyWasNotConsumed;
 }

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17096048/viewspace-590713/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17096048/viewspace-590713/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字乡村和智慧农业的数字化转型是当前农业发展的新趋势,旨在通过应用数字技术,实现农业全流程的再造和全生命周期的管理服务。国政府高度重视这一领域的发展,提出“数字国”和“乡村振兴”战略,以提升国家治理能力,推动城乡融合发展。 数字乡村的建设面临乡村治理、基础设施、产业链条和公共服务等方面的问题,需要分阶段实施《数字乡村发展战略纲要》来解决。农业数字化转型的需求包括满足市民对优质农产品的需求、解决产销对接问题、形成优质优价机制、提高农业劳动力素质、打破信息孤岛、提高农业政策服务的精准度和有效性,以及解决农业融资难的问题。 数字乡村建设的关键在于构建“1+3+4+1”工程,即以新技术、新要素、新商业、新农民、新文化、新农村为核心,推进数据融合,强化农业大数据的汇集功能。数字农业大数据解决方案以农业数字底图和数据资源为基础,通过可视化监管,实现区域农业的全面数字化管理。 数字农业大数据架构基于大数据、区块链、GIS和物联网技术,构建农业大数据心、农业物联网平台和农村综合服务指挥决策平台三大基础平台。农业大数据心汇聚各类涉农信息资源和业务数据,支持大数据应用。信息采集系统覆盖市、县、乡、村多级,形成高效的农业大数据信息采集体系。 农业物联网平台包括环境监测系统、视频监控系统、预警预报系统和智能控制系统,通过收集和监测数据,实现对农业环境和生产过程的智能化管理。综合服务指挥决策平台利用数据分析和GIS技术,为农业决策提供支持。 数字乡村建设包括三大服务平台:治理服务平台、民生服务平台和产业服务平台。治理服务平台通过大数据和AI技术,实现乡村治理的数字化;民生服务平台利用互联网技术,提供各类民生服务;产业服务平台融合政企关系,支持农业产业发展。 数字乡村的应用场景广泛,包括农业生产过程、农产品流通、农业管理和农村社会服务。农业生产管理系统利用AIoT技术,实现农业生产的标准化和智能化。农产品智慧流通管理系统和溯源管理系统提高流通效率和产品追溯能力。智慧农业管理通过互联网+农业,提升农业管理的科学性和效率。农村社会服务则通过数字化手段,提高农村地区的公共服务水平。 总体而言,数字乡村和智慧农业的建设,不仅能够提升农业生产效率和管理水平,还能够促进农村地区的社会经济发展,实现城乡融合发展,是推动国农业现代化的重要途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值