2011-04-25 38 views
1

我正在實現一個生活在屏幕上的視圖。根據以下配置參數,只要屏幕尺寸發生變化,視圖就會定位並調整大小。使用枚舉來使用按位參數組合的最佳做法?

enum DLViewLayout 
{ 
    DLViewLayoutSolo = 1, 
    DLViewLayoutDual = 2 
}; 
enum DLViewFixedHorizontalProperty 
{ 
    DLViewFixedHorizontalPropertyWidth = 4, // View margins scale with the screen width. 
    DLViewFixedHorizontalPropertyMargin = 8 // View width scales with the screen width. 
}; 
enum DLViewFixedVerticalProperty 
{ 
    DLViewFixedVerticalPropertyHeight = 16, 
    DLViewFixedVerticalPropertyMargin = 32 
}; 
enum DLViewHorizonalAlignment 
{ 
    DLViewHorizonalAlignmentLeft = 64, 
    DLViewHorizonalAlignmentCenter = 128, 
    DLViewHorizonalAlignmentRight = 256 
}; 
enum DLViewVerticalAlignment 
{ 
    DLViewVerticalAlignmentTop = 512, 
    DLViewVerticalAlignmentMiddle = 1024, 
    DLViewVerticalAlignmentBottom = 2048 
}; 

我不知道在什麼情況下會是有意義的按位OR結合枚舉值傳遞一個視圖狀態。

int viewState = DLViewLayoutSolo | DLViewFixedHorizontalPropertyWidth | DLViewFixedVerticalPropertyMargin | DLViewHorizonalAlignmentCenter | DLViewVerticalAlignmentMiddle; 
// viewState = 1189 

我希望類的用戶配置所有參數。我如何執行此操作?

在課堂上,我可以通過按位組合AND來檢索各個設置。

if (viewState & DLViewLayoutSolo) 
{ 
    // Set up solo view layout. 
} 
else if (viewState & DLViewLayoutDual) 
{ 
    // Set up dual view layout. 
} 
+0

哪種編程語言? – nos 2011-04-25 16:31:46

+0

編程語言是C++。 – JJD 2011-04-25 16:38:46

回答

3

你想使用來自不同枚舉值的標誌嗎?

這是永遠將是最好的做法,其實,我從來沒有見過它任何做法,好或壞。這樣,除了其他問題之外,使用暴露這些標誌的屬性的實例的任何元素必須知道或預期知道它是來自這些不同的enum類型的值的合併。

由於這些值合乎情理地上升,爲什麼不簡單地使用由所有成員組成的恰當命名的枚舉呢?

此外,如果我們在這裏談論.NET(雖然合法,分號告訴我,也許不是),這樣enum類型應與[Flags]屬性來裝飾,不過,只有結合起來,同enum類型的值。

+0

考慮您的建議:如何使用由所有成員組成的枚舉防止值的無效組合?例如:'.. | DLViewHorizo​​nalAlignmentLeft | DLViewHorizo​​nalAlignmentRight | ..' – JJD 2011-04-25 16:52:09

+0

@JJD:檢查給定的標誌集合中是否存在「DLViewHorizo​​nalAlignmentLeft」和「DLViewHorizo​​nalAlignmentRight」,並且處理爲(將要)記錄,由視圖所期望的內容定義。 – 2011-04-25 17:01:23

+0

是的,但您只希望班級的用戶通過其中一個或另一個。我想,我無法確保。 – JJD 2011-04-25 20:12:44

1

這聽起來好像你想要的字段,其值取各子條件的狀態:

enum DLViewLayout 
{ 
    DLViewLayoutSolo, 
    DLViewLayoutDual 
}; 
enum DLViewFixedHorizontalProperty 
{ 
    DLViewFixedHorizontalPropertyWidth, // View margins scale with the screen width. 
    DLViewFixedHorizontalPropertyMargin // View width scales with the screen width. 
}; 
enum DLViewFixedVerticalProperty 
{ 
    DLViewFixedVerticalPropertyHeight, 
    DLViewFixedVerticalPropertyMargin 
}; 
enum DLViewHorizonalAlignment 
{ 
    DLViewHorizonalAlignmentLeft, 
    DLViewHorizonalAlignmentCenter, 
    DLViewHorizonalAlignmentRight 
}; 
enum DLViewVerticalAlignment 
{ 
    DLViewVerticalAlignmentTop, 
    DLViewVerticalAlignmentMiddle, 
    DLViewVerticalAlignmentBottom 
}; 

struct DLView { 
    DLViewLayout layout; 
    DLViewFixedHorizontalProperty fixed_horizontal; 
    DLViewFixedVerticalProperty fixed_vertical; 
    DLViewHorizonalAlignment horizontal; 
    DLViewVerticalAlignment vertical; 
}; 

// ... 
DLView viewState; 
// ... 
if (viewState.layout == DLViewLayoutSolo) { ... } 
else if (viewState.layout == DLViewLayoutDual) { ... } 
} 

/// repeat per field 

如果您擔心內存消耗,並有正當的理由是,那麼你可以使用非便攜式位域結構:

struct DLView { 
    DLViewLayout layout : 1; 
    DLViewFixedHorizontalProperty fixed_horizontal : 1; 
    DLViewFixedVerticalProperty fixed_vertical : 1; 
    DLViewHorizonalAlignment horizontal : 2; 
    DLViewVerticalAlignment vertical : 2; 
}; 
+1

好主意。所以我可以將整個配置集合封裝到一個將被傳遞的參數中。位字段對我來說是新的,但是您要提及它們。我已經閱讀過它。 – JJD 2011-04-25 20:16:34