今天下午学习了两点,一,在vc自定义函数中传定不定个数的参数,即如format函数中的第二个参数"...",能接收任意个数参数;二,自定义异常的抛出,即throw一个自定义异常.
函数代码列如下:
函数代码列如下:
- // ComboProp.h: interface for the CComboProp class.
- //
- //
- #if !defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
- #define AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include "bcgpproplist.h"
- class CSelItemException: public CException//trow的异常类的定义
- {
- public:
- CSelItemException (const int& SelIndex, const int& ItemCount)//修改构造函数,使catch时可以获取要报告的参数
- {
- this->m_IndextoSeled = SelIndex;
- this->m_ItemCount = ItemCount;
- }
- CSelItemException(CSelItemException& m)//缺省拷贝构造函数,若没有这个函数,则需要使用throw &CSelItemException(SeledIndex, pCombo->GetCount()); 的方式
- {
- this->m_IndextoSeled = m.m_IndextoSeled;
- this->m_ItemCount = m.m_ItemCount;
- }
- virtual ~CSelItemException();
- public:
- int m_IndextoSeled;
- int m_ItemCount;
- };
- class CComboProp : public CBCGPProp
- {
- public:
- CComboBox* CreateCombo(CWnd*pWndParent, CRect rect, int SeledIndex = -1, LPCTSTR ItemString1 = NULL, ...);
- BOOL AddOption (int nSeledIndex = -1, LPCTSTR ItemString1 = '/0', ...);//向属性列表中增加下列选项
- CComboProp(const CString&strGroupName,DWORD_PTR dwData=0,BOOL bIsValueList=FALSE)
- : CBCGPProp (strGroupName, dwData, bIsValueList){}
- CComboProp(const CString&strName,const _variant_t&varValue,LPCTSTR lpszDescr=NULL,
- DWORD_PTR dwData=0,LPCTSTR lpszEditMask=NULL,LPCTSTR lpszEditTemplate=NULL,LPCTSTR lpszValidChars=NULL)
- : CBCGPProp (strName,varValue,lpszDescr,dwData,lpszEditMask,lpszEditTemplate,lpszValidChars){}
- virtual ~CComboProp();
- };
- #endif // !defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
- // ComboProp.cpp: implementation of the CComboProp class.
- //
- //
- #include "stdafx.h"
- #include "GDFCheck.h"
- #include "ComboProp.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //
- // Construction/Destruction
- //
- CSelItemException::~CSelItemException()
- {
- }
- CComboProp::~CComboProp()
- {
- }
- BOOL CComboProp::AddOption (int nSeledIndex, LPCTSTR ItemString1, ...)
- {
- LPCTSTR strArg = NULL;
- va_list argList;
- va_start(argList, nSeledIndex); //取头个参数地址
- _variant_t vtDefault;
- int nCount = 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 < nCount)
- {
- this->SetValue(vtDefault);
- }
- else
- {
- throw CSelItemException(nSeledIndex, nCount); //抛出设定异常
- }
- }
- return TRUE;
- }
- CComboBox* CComboProp::CreateCombo(CWnd *pWndParent, CRect rect,
- int SeledIndex, LPCTSTR ItemString1, ...)
- {
- CComboBox* pCombo = CBCGPProp::CreateCombo(pWndParent, rect);
- int nArgCout = 0;
- LPCTSTR strArg = NULL;
- va_list argList;
- va_start(argList, SeledIndex); //获取SeledIndex参数的地址
- //va_start va_arg va_end是三个宏,内容参照mfc代码
- for (strArg = va_arg(argList, LPCTSTR); //按LPCTSTR类型获取下一个参数的地址,并提取参数值,这里的参数类型必须自己指定,Format是根据%s,%c等符号来判断的
- strArg != NULL; //判断参数是否0,即最后一个参数,所以这里约定最后一个参数必须传0,或'/0';也可以自定义其他截止符
- strArg = va_arg(argList, LPCTSTR))//获取下一个参数值
- {
- pCombo->AddString(strArg);
- }
- va_end(argList); //善后工作,体现coder品质的地方
- if (SeledIndex >= 0)
- {
- if (pCombo->GetCount() > SeledIndex)
- {
- if (pCombo->SetCurSel(SeledIndex) == CB_ERR)
- {
- throw CSelItemException(SeledIndex, pCombo->GetCount()); //catch时将调用CSelItemException的拷贝构造函数,若缺少默认拷贝构造函数定义则编译无法通过,报cannot throw CSelItemException
- }
- }
- else
- {
- throw &CSelItemException(SeledIndex, pCombo->GetCount()); //抛出设定异常
- }
- }
- return pCombo;
- }