自定义的symbian图片控件,可在任意的位置放图片(转)


首先给出这个控件类:

头文件:

#ifndef CMyPicture_H
#define CMyPicture_H

// INCLUDES
#include <e32std.h>
#include <e32base.h>
#include <f32file.h>
#include <fbs.h>
#include <coecntrl.h>

// CLASS DECLARATION


//class RFs;
class CMyPicture : public CCoeControl
{
public: // Constructors and destructor

 /**
        * Destructor.
        */
 ~CMyPicture();

        /**
        * Two-phased constructor.
        */
 static CMyPicture* NewL();

        /**
        * Two-phased constructor.
        */
 static CMyPicture* NewLC();

public:

 /**
        * Constructor for performing 1st stage construction
        */
 CMyPicture();

 /**
        * EPOC default constructor for performing 2nd stage construction
        */
 void ConstructL();

 virtual void Draw(const TRect& aRect) const;
 void SetPicture(TDesC& aFilePath);
 void SetVisiable(TBool aVisiable);
 void GetPng(RFs& aFs,const TDesC& afilepath,CFbsBitmap* iBitmap,CFbsBitmap* iBmpMask );
private:
 TBuf<100> iFilePath;
 RFs fs;
 CFbsBitmap* iBitmapBack;
 CFbsBitmap* iBitmapBackMask;
 TBool iBVisiable;

};

#endif // CMyPicture_H

然后是cpp文件:

#include "CMyPicture.h"
#include <eikenv.h>
#include <ImageConversion.h>

CMyPicture::CMyPicture()
{
 // No implementation required
}


CMyPicture::~CMyPicture()
{
}

CMyPicture* CMyPicture::NewLC()
{
 CMyPicture* self = new (ELeave)CMyPicture();
 CleanupStack::PushL(self);
 self->ConstructL();
 return self;
}

CMyPicture* CMyPicture::NewL()
{
 CMyPicture* self=CMyPicture::NewLC();
 CleanupStack::Pop(); // self;
 return self;
}

void CMyPicture::ConstructL()
{

 CreateWindowL();
 fs=iEikonEnv->FsSession();
 iBitmapBack=new (ELeave) CFbsBitmap();
 iBitmapBackMask=new (ELeave) CFbsBitmap();
 _LIT(KBackPath,"c:\\system\\apps\\SG\\back2.png");
 GetPng(fs,KBackPath,iBitmapBack,iBitmapBackMask);
 iBVisiable = ETrue;
}

void CMyPicture::SetPicture(TDesC& aFilePath)

{
 iFilePath = aFilePath;

}

void CMyPicture::SetVisiable(TBool aVisiable)

{
 iBVisiable = aVisiable;
 DrawNow();
}

void CMyPicture::GetPng(RFs &aFs,const TDesC &afilepath,CFbsBitmap *iBitmap,CFbsBitmap* iBmpMask)

{
 _LIT8(MimeType, "image/png");
 CImageDecoder* imageDecoder = CImageDecoder::FileNewL(aFs,afilepath,
                                                     MimeType, 
                 CImageDecoder::EOptionAlwaysThread
                 );
 iBitmap->Create(imageDecoder->FrameInfo().iOverallSizeInPixels, 
              imageDecoder->FrameInfo().iFrameDisplayMode /*was EColor4K*/);
 // its a EColor16M
 iBmpMask->Create(imageDecoder->FrameInfo().iOverallSizeInPixels,EGray256 /*was EGray2*/ );
 TRequestStatus status;
 imageDecoder->Convert( &status, *iBitmap, *iBmpMask );
 User::WaitForRequest( status );
 delete imageDecoder;

}

void CMyPicture::Draw(const TRect& aRect) const
{
 CWindowGc& gc = SystemGc();
 if (iBVisiable) 
 {
  TRect bmpEmaPieceRect(TPoint(0,0),iBitmapBack->SizeInPixels());
  gc.BitBltMasked(TPoint(10,10),iBitmapBack,bmpEmaPieceRect,iBitmapBackMask,ETrue);
 }

}

使用这个类就可以实现自定义图片控件了。

原文地址:https://www.cnblogs.com/yaoliang11/p/1862851.html