在此看見兩個列舉,BackGroundStatus和AreaKind。
- 由於它要搭配CPatternDialog,所以背景色的型態、複雜度,會由BkMaker.h類別來負責繪製及設定,以BackGroundStatus和動態連結的技巧來設計這一個部份
- 在量測點位的歸納,大多的量測點位設計都可以分成九個區塊(九宮格)我們可以判斷點座標之後,將每一個點做標示以便排序,最佳化量測的速度。
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();
}
}
}