| 
 
界面处理类 CShowGUI,数据上传类 CUploadData 
  
 
class CUploadData  {  ......  typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);  int UploadFile(LPCTSTR lpFileNamePath,LPVOID lparam,SetUploadCaller Caller );  // 接受外界出入的参数,主要是回调函数的地址通过参数Caller,   int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;   ...... // 注意此时不在需要GetCurState 函数了 。 }
  class CShowGUI: public CDialog {  .......  typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);  void SetCallBack(LPCTSTR strPath);  static int GetCurState(int nCurData, int nInAll, void * pParam) ;   CUploadData m_Uploa  d ; // 数据上传类是界面显示类的一个成员变量。   ....... }
  void CShowGUI :: SetCallBack(LPCTSTR strPath) {  CUploadData myUploadData ;  SetUploadCaller myCaller; // 声明一个函数指针变量   myCaller = CurState ; // 取得界面处理函数的地址  myUploadData .UploadFile(strPath,this,myCaller); // 界面处理类的函数传入,实现了数据传入与界面处理的分离 . } |      通过上面的演示做到了界面与数据的分离,回调函数分别扮演了不同角色,所以随着处理问题的不同应灵活应用,但同样因为处理数据类不知道界面处理类或外部调用类的类型,而更无法灵活地处理界面的不同显示方式。这方面还希望喜欢钻研技术的朋友继续研究。  |