class//Cartridge2

這是要給CPatternDialog吃的參數們,參數是給機器看的表示法,有別於Nucleotide的表示法,但是都有背景色、量測點....等重覆的成員變數,每一個Cartridge2代表的是一個點。
在此看見兩個列舉,BackGroundStatus和AreaKind。
  • 由於它要搭配CPatternDialog,所以背景色的型態、複雜度,會由BkMaker.h類別來負責繪製及設定,以BackGroundStatus和動態連結的技巧來設計這一個部份
  • 在量測點位的歸納,大多的量測點位設計都可以分成九個區塊(九宮格)我們可以判斷點座標之後,將每一個點做標示以便排序,最佳化量測的速度
而且在此還有一點和Nucleotide不同的就是要搭載「資料」,所以有Bullet類別在這裡面。

Cartridge2.h

#ifndef  CARTRIDGE2_H
#define  CARTRIDGE2_H

#include "Bullet.h"
#include "CColorRef.h"
#include "Bkxxx.h"
#include "BkMaker.h"

enum BackGroundStatus { BGS_Normal = 0, AXXPos... };
enum AreaKind { AA_00, AA_01, AA_02, AA_03, AA_04, AA_05, AA_06, AA_07, AA_08, AA_09};

class Cartridge2
{
//建解構子
public:
    Cartridge2();
    Cartridge2(const Cartridge2&);
    ~Cartridge2();
//表格順序
private:              UINT m_sequenceFrom;
public:               void SetSqncFrm(const UINT&);
                const UINT GetSqncFrm() const;
//區域順序
private:          AreaKind m_sequenceArea;
public:               void SetSqncArea(const AreaKind&);
            const AreaKind GetSqncArea() const;
//點位置
private:            CPoint m_PointPosition;
public:       const CPoint GetPointPosi() const;
                      void SetPointPosi(const CPoint&);
//背景
private:
public:           BkMaker* m_pBackGorund;
                  ColorRef GetBkColor() const;  //operator==() can't return const
                      void SetBkColor(const ColorRef&);
//背景狀態(描述符)
private:  BackGroundStatus m_bkStatus;
public:               void SetBkStatus( const BackGroundStatus& _BGS,
                                        const BOOL& creatBGS = TRUE );
          BackGroundStatus GetBkStatus() const;
             const CString GetStrBkStatus() const;
//資料
private:            Bullet m_Data;
public:       const Bullet GetBullet() const;
                   Bullet& GetBullet();
                      void SetBullet(const Bullet& Pd);
//文字描述
private:           CString m_Description;
public:               void SetDescrip(const CString&);
             const CString GetDescrip() const;
//運算子和其它
public:         const BOOL operator==(const Cartridge2& vCar) const;
                      void operator= (const Cartridge2& vCar);
//////////////////////////////////////////////////////////////////////////
             const CString ShowMe() const;
};

#endif

Cartridge2.cpp

m_pBackGorund設計成SmartPtr

為了預防Cartridge2消失時,成員指標不會成為Garbage Collection的負擔,設計m_pBackGround的類別BkMaker時就將它設計成SmartPtr,會計數自己還有指著幾個物件 ,特別在Cartridge2複製時,會出現這個問題。
Cartridge2::~Cartridge2()
{ 
    if (m_pBackGorund->IsPtrToNull())
        delete m_pBackGorund;
}

動態連結的方式產生不同的背景特色

動態連結真的可以很有效的簡化程式碼,也是使用繼承最佳理由之一。
在此將生成的類別做馬賽克,不同的類別也使用不同的參數做初始化。
每一個Cartridge2代表的是一個點,這個想法很重要。
void Cartridge2::SetBkStatus(const BackGroundStatus& _BGS, const BOOL& creatBGS)
{
    m_bkStatus = _BGS;
    if (creatBGS)//一般都要執行生成m_pBackGorund,除非特殊的地方需要純設定Status
    {
        if (m_pBackGorund != 0)
            delete m_pBackGorund;
        switch(_BGS)
        {
        case BGS_AXXPos:     m_pBackGorund = new BkAXX(ND_Pos);                break;
        case BGS_AXXNeg:     m_pBackGorund = new BkAXX(ND_Neg);                break;
        case BGS_BXXDark:    m_pBackGorund = new BkBXX(RGB(0, 0, 0));          break;
        case BGS_BXXWrite:   m_pBackGorund = new BkBXX(RGB(255, 255, 255));    break;
        case BGS_Normal:
        default:             m_pBackGorund = new BkMaker();
        }
    }
}

文章分類維度