討論區快速選單
知識庫快速選單
網路投保旅行平安險 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
如何設計一個簡潔有彈性的操作框架?
更改我的閱讀文章字型大小
作者 : cromayen2000(CROMAYEN2000) OpenGL卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 646 | 人氣 22308 | 評價 2260 | 評價/貼文 3.5 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/1/20 上午 06:37:29
各位好 ^ ^~

我在 OpenGL 的環境下想設計一個類似 3D Stdio Max 的操作框架,勉強設計出來了,可是隨著功能的增加發現程式碼會隨著動作累積在一起像這樣

// 滑鼠移動的事件
void CUserControlDICOMView::MouseMove( CViewObject * ViewObject, int PosX, int PosY, unsigned int Flag ) {
// 檢查操作的功能
if(CViewObject::m_UserModeActive != UM_None ) {
     // 根據功能選擇游標
DICOMViewport->SetCursor(CViewObject::m_UserModeActive);
     // 根據功能執行動作
switch(CViewObject::m_UserModeActive) {
case UM_WindowLevel:
     .................................
break;
case UM_MoveWindow:
     .................................
break;
case UM_RotateImageS1:
     .................................
break;
case UM_DrawShutterRect2DS1:
     .................................
break;
case UM_DrawShutterEllipse2DS1:
case UM_DrawShutterEllipse2DS2:
     .................................
break;

case UM_DrawMeasurementLineLength2DS1:
     .................................
break;
case UM_DrawMeasurement2LineLengthRate2DS1:
case UM_DrawMeasurement2LineLengthRate2DS2:
case UM_DrawMeasurement2LineLengthRate2DS3:
     .................................
break;
case UM_DrawMeasurementEllipseArea2DS1:
case UM_DrawMeasurementEllipseArea2DS2:
     .................................
break;
case UM_DrawMeasurement3PointAngle2DS1:
case UM_DrawMeasurement3PointAngle2DS2:
     .................................
break;
     .................................
     .................................
     .................................

}
}
}

功能操作的程式碼會像這樣累積在滑鼠事件內,同一個功能還會受到事件的不同被拆散在不同的位置變得非常難維護,請問各位有沒有這方面的處理經驗能夠給我一些建議
作者 : cromayen2000(CROMAYEN2000) OpenGL卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 646 | 人氣 22308 | 評價 2260 | 評價/貼文 3.5 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/1/20 上午 06:47:52
我試著將使用者的操作抽象化,各功能繼承後覆寫需要的部份

class CUserControl {
public:

/// 建構式
CUserControl(void);
/// 解構式
virtual ~CUserControl(void);

/// 滑鼠滾輪向下的事件
virtual void MouseWheeledDown(CViewObject * ViewObject) = 0;
/// 滑鼠滾輪下上的事件
virtual void MouseWheeledUp(CViewObject * ViewObject) = 0;
/// 滑鼠移動的事件
virtualvoid MouseMove(CViewObject * ViewObject, int PosX, int PosY, unsigned int Flag) = 0;
/// 滑鼠左鍵按下的事件
virtual void MouseButtonLeftDown(CViewObject * ViewObject, int PosX, int PosY, unsigned int Flag) = 0;
................................
................................
................................
};

然後掛載視窗的事件處理函數裡,透過堆疊的方式管理抽換,用起來還是卡卡的不是很簡潔有彈性
std::vector<CUserControl *> m_UserControl;
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/1/20 下午 06:58:50
maybe Inheritance is better
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625