一,在vc自定義函數(shù)中傳定不定個數(shù)的參數(shù),即如format函數(shù)中的第二個參數(shù)"...",能接收任意個數(shù)參數(shù);
二,自定義異常的拋出,即throw一個自定義異常.
函數(shù)代碼列如下:
//ComboProp.h:interfacefortheCComboPropclass.
//
//////////////////////////////////////////////////////////////////////
#if!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
#defineAFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include"bcgpproplist.h"
classCSelItemException:publicCException//trow的異常類的定義
{
public:
CSelItemException(constint&SelIndex,constint&ItemCount)//修改構(gòu)造函數(shù),使catch時可以獲取要報告的參數(shù)
{
this->m_IndextoSeled=SelIndex;
this->m_ItemCount=ItemCount;
}
CSelItemException(CSelItemException&m)//缺省拷貝構(gòu)造函數(shù),若沒有這個函數(shù),則需要使用throw&CSelItemException(SeledIndex,pCombo->GetCount());的方式
{
this->m_IndextoSeled=m.m_IndextoSeled;
this->m_ItemCount=m.m_ItemCount;
}
virtual~CSelItemException();
public:
intm_IndextoSeled;
intm_ItemCount;
};
classCComboProp:publicCBCGPProp
{
public:
CComboBox*CreateCombo(CWnd*pWndParent,CRectrect,intSeledIndex=-1,LPCTSTRItemString1=NULL, ...);
BOOLAddOption(intnSeledIndex=-1,LPCTSTRItemString1=’’,...);//向?qū)傩粤斜碇性黾酉铝羞x項
CComboProp(constCString&strGroupName,DWORD_PTRdwData=0,BOOLbIsValueList=FALSE)
:CBCGPProp(strGroupName,dwData,bIsValueList){}
CComboProp(constCString&strName,const_variant_t&varValue,LPCTSTRlpszDescr=NULL,
DWORD_PTRdwData=0,LPCTSTRlpszEditMask=NULL,LPCTSTRlpszEditTemplate=NULL,LPCTSTRlpszValidChars=NULL)
:CBCGPProp(strName,varValue,lpszDescr,dwData,lpszEditMask,lpszEditTemplate,lpszValidChars){}
virtual~CComboProp();
};
#endif//!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
//ComboProp.cpp:implementationoftheCComboPropclass.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"GDFCheck.h"
#include"ComboProp.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSelItemException::~CSelItemException()
{
}
CComboProp::~CComboProp()
{
} BOOLCComboProp::AddOption(intnSeledIndex,LPCTSTRItemString1,...)
{
LPCTSTRstrArg=NULL;
va_listargList;
va_start(argList,nSeledIndex);//取頭個參數(shù)地址
_variant_tvtDefault;
intnCount=0;
for(strArg=va_arg(argList,LPCTSTR);strArg!=NULL;strArg=va_arg(argList,LPCTSTR))
{
CBCGPProp::AddOption(strArg,FALSE);
if(nSeledIndex==nCount++)
{
vtDefault.SetString(strArg);
}
}
va_end(argList);
if(nSeledIndex>=0)
{
if(nSeledIndex {this->SetValue(vtDefault);
}
else
{
throwCSelItemException(nSeledIndex,nCount);//拋出設(shè)定異常
}
}
returnTRUE;
}
CComboBox*CComboProp::CreateCombo(CWnd*pWndParent,CRectrect,
intSeledIndex,LPCTSTRItemString1,...)
{
CComboBox*pCombo=CBCGPProp::CreateCombo(pWndParent,rect);
intnArgCout=0;
LPCTSTRstrArg=NULL;
va_listargList;
va_start(argList,SeledIndex);//獲取SeledIndex參數(shù)的地址
//va_startva_arg va_end是三個宏,內(nèi)容參照mfc代碼
for(strArg=va_arg(argList,LPCTSTR);//按LPCTSTR類型獲取下一個參數(shù)的地址,考試,大提示提取參數(shù)值,這里的參數(shù)類型必須自己指定,Format是根據(jù)%s,%c等符號來判斷的
strArg!=NULL;//判斷參數(shù)是否0,即最后一個參數(shù),所以這里約定最后一個參數(shù)必須傳0,或’’;也可以自定義其他截止符
strArg=va_arg(argList,LPCTSTR))//獲取下一個參數(shù)值
{
pCombo->AddString(strArg);
}
va_end(argList);//善后工作,體現(xiàn)coder品質(zhì)的地方
if(SeledIndex>=0)
{
if(pCombo->GetCount()>SeledIndex)
{
if(pCombo->SetCurSel(SeledIndex)==CB_ERR)
{
throwCSelItemException(SeledIndex,pCombo->GetCount());//catch時將調(diào)用CSelItemException的拷貝構(gòu)造函數(shù),若缺少默認(rèn)拷貝構(gòu)造函數(shù)定義則編譯無法通過,報cannotthrowCSelItemException
}
}
else
{
throw&CSelItemException(SeledIndex,pCombo->GetCount());//拋出設(shè)定異常
}
}
returnpCombo;
}
二,自定義異常的拋出,即throw一個自定義異常.
函數(shù)代碼列如下:
//ComboProp.h:interfacefortheCComboPropclass.
//
//////////////////////////////////////////////////////////////////////
#if!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
#defineAFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include"bcgpproplist.h"
classCSelItemException:publicCException//trow的異常類的定義
{
public:
CSelItemException(constint&SelIndex,constint&ItemCount)//修改構(gòu)造函數(shù),使catch時可以獲取要報告的參數(shù)
{
this->m_IndextoSeled=SelIndex;
this->m_ItemCount=ItemCount;
}
CSelItemException(CSelItemException&m)//缺省拷貝構(gòu)造函數(shù),若沒有這個函數(shù),則需要使用throw&CSelItemException(SeledIndex,pCombo->GetCount());的方式
{
this->m_IndextoSeled=m.m_IndextoSeled;
this->m_ItemCount=m.m_ItemCount;
}
virtual~CSelItemException();
public:
intm_IndextoSeled;
intm_ItemCount;
};
classCComboProp:publicCBCGPProp
{
public:
CComboBox*CreateCombo(CWnd*pWndParent,CRectrect,intSeledIndex=-1,LPCTSTRItemString1=NULL, ...);
BOOLAddOption(intnSeledIndex=-1,LPCTSTRItemString1=’’,...);//向?qū)傩粤斜碇性黾酉铝羞x項
CComboProp(constCString&strGroupName,DWORD_PTRdwData=0,BOOLbIsValueList=FALSE)
:CBCGPProp(strGroupName,dwData,bIsValueList){}
CComboProp(constCString&strName,const_variant_t&varValue,LPCTSTRlpszDescr=NULL,
DWORD_PTRdwData=0,LPCTSTRlpszEditMask=NULL,LPCTSTRlpszEditTemplate=NULL,LPCTSTRlpszValidChars=NULL)
:CBCGPProp(strName,varValue,lpszDescr,dwData,lpszEditMask,lpszEditTemplate,lpszValidChars){}
virtual~CComboProp();
};
#endif//!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
//ComboProp.cpp:implementationoftheCComboPropclass.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"GDFCheck.h"
#include"ComboProp.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSelItemException::~CSelItemException()
{
}
CComboProp::~CComboProp()
{
} BOOLCComboProp::AddOption(intnSeledIndex,LPCTSTRItemString1,...)
{
LPCTSTRstrArg=NULL;
va_listargList;
va_start(argList,nSeledIndex);//取頭個參數(shù)地址
_variant_tvtDefault;
intnCount=0;
for(strArg=va_arg(argList,LPCTSTR);strArg!=NULL;strArg=va_arg(argList,LPCTSTR))
{
CBCGPProp::AddOption(strArg,FALSE);
if(nSeledIndex==nCount++)
{
vtDefault.SetString(strArg);
}
}
va_end(argList);
if(nSeledIndex>=0)
{
if(nSeledIndex
}
else
{
throwCSelItemException(nSeledIndex,nCount);//拋出設(shè)定異常
}
}
returnTRUE;
}
CComboBox*CComboProp::CreateCombo(CWnd*pWndParent,CRectrect,
intSeledIndex,LPCTSTRItemString1,...)
{
CComboBox*pCombo=CBCGPProp::CreateCombo(pWndParent,rect);
intnArgCout=0;
LPCTSTRstrArg=NULL;
va_listargList;
va_start(argList,SeledIndex);//獲取SeledIndex參數(shù)的地址
//va_startva_arg va_end是三個宏,內(nèi)容參照mfc代碼
for(strArg=va_arg(argList,LPCTSTR);//按LPCTSTR類型獲取下一個參數(shù)的地址,考試,大提示提取參數(shù)值,這里的參數(shù)類型必須自己指定,Format是根據(jù)%s,%c等符號來判斷的
strArg!=NULL;//判斷參數(shù)是否0,即最后一個參數(shù),所以這里約定最后一個參數(shù)必須傳0,或’’;也可以自定義其他截止符
strArg=va_arg(argList,LPCTSTR))//獲取下一個參數(shù)值
{
pCombo->AddString(strArg);
}
va_end(argList);//善后工作,體現(xiàn)coder品質(zhì)的地方
if(SeledIndex>=0)
{
if(pCombo->GetCount()>SeledIndex)
{
if(pCombo->SetCurSel(SeledIndex)==CB_ERR)
{
throwCSelItemException(SeledIndex,pCombo->GetCount());//catch時將調(diào)用CSelItemException的拷貝構(gòu)造函數(shù),若缺少默認(rèn)拷貝構(gòu)造函數(shù)定義則編譯無法通過,報cannotthrowCSelItemException
}
}
else
{
throw&CSelItemException(SeledIndex,pCombo->GetCount());//拋出設(shè)定異常
}
}
returnpCombo;
}