📄 tinyhelp.h
字号:
#ifndef TINY_HELP_H
#define TINY_HELP_H
#include <assert.h>
//==========================
//为使代码简洁而使用的一些宏
//==========================
//等于某值时返回
/*
if(ptr == NULL)
{
return;
}
=>
RETURN(ptr,NULL)
*/
/*得到原始数组的长度*/
#define COUNTOF(x) (sizeof(x) / sizeof(x[0]))
//指针为空时返回
#define NULL_RETURN(ptr)\
if (ptr ==NULL) {\
return;\
}
//指针为空时返回指定值
#define NULL_RETURN_EX(ptr,rlt)\
if (ptr ==NULL) {\
return rlt;\
}
#define RETURN(T)\
if (T) {\
return ;\
}
#define RETURN_EX(T,rlt)\
if (T) {\
return rlt;\
}
//是否为有效的variant类型
inline bool ValidateVariant(_variant_t & var)
{
if(var.vt==VT_EMPTY ||var.vt==VT_NULL)
return false;
else
return true;
}
//是否为有效的CString类型
inline bool ValidateString(CString & str)
{
if (str.Trim().IsEmpty())
return false;
else
return true;
}
inline BOOL V2S(const _variant_t &vtValue,CString &sRet)
{
sRet = _T("");
if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY))
{
sRet = (LPCTSTR)(_bstr_t)vtValue;
return TRUE;
}
return FALSE;
}
inline CString V2S(const _variant_t &var)
{
CString sInfo = _T("");
switch(var.vt)
{
case VT_I2:
sInfo.Format(_T("%d"),V_I2(&var));
break; //短整型
case VT_I4:
sInfo.Format(_T("%ld"),V_I4(&var));
break; //长整型
case VT_R4: //浮点型
case VT_R8: //双精度型
sInfo.Format(_T("%f"),V_R8(&var));
break;
case VT_BSTR: //字符型
sInfo = (LPCTSTR)(_bstr_t)var;
break;
#ifdef ___ATLCOMTIME_H__
case VT_DATE:
{
COleDateTime time = var;
sInfo.Format("%d-%d-%d",time.GetYear(),time.GetMonth(),time.GetDay());
}
break;
#endif
default:break;
}
return sInfo;
}
inline DOUBLE V2D(_variant_t vtValue)
{
DOUBLE dRet = 0.00;
if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY))
{
try
{
dRet = (DOUBLE)vtValue;
}
catch (_com_error &e)
{
ATLTRACE("\nV2D::%s\n",(LPCTSTR)e.Description());
}
}
return dRet;
}
inline BOOL V2L(_variant_t vtValue,LONG &lRet)
{
lRet = -1;
if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY))
{
try
{
lRet = (LONG)vtValue;
}
catch (_com_error &e)
{
ATLTRACE("\nV2L::%s\n",(LPCTSTR)e.Description());
}
return TRUE;
}
return FALSE;
}
inline long V2L(_variant_t vtValue)
{
long lRet = -1;
if((vtValue.vt != VT_NULL) && (vtValue.vt != VT_EMPTY))
{
try
{
lRet = (LONG)vtValue;
}
catch (_com_error &e)
{
ATLTRACE("\nV2L::%s\n",(LPCTSTR)e.Description());
}
}
return lRet;
}
#if defined(_WINDOWS_) && defined(__cplusplus)
//ATL中使用的等待光标
inline void ATLBeginWaitCursor(void) {
HCURSOR cur = reinterpret_cast< HCURSOR >(::LoadCursor( NULL, MAKEINTRESOURCE( IDC_WAIT ) ));
if ( NULL == cur ) {
assert( FALSE && _T("Call BeginWaitCursor Failed") );
}
HCURSOR hSetOK = ::SetCursor( cur );
}
inline void ATLEndWaitCursor(void) {
HCURSOR cur = reinterpret_cast< HCURSOR >(::LoadCursor( NULL, MAKEINTRESOURCE( IDC_ARROW ) ));
if ( NULL == cur ) {
assert( FALSE && _T("Call EndWaitCursor Failed "));
}
::DestroyCursor( ::SetCursor( cur ) );
}
class CATLWaitCursor
{
public:
CATLWaitCursor(){ATLBeginWaitCursor();}
~CATLWaitCursor(){ATLEndWaitCursor();}
};
#ifdef _DEBUG
#define TRY_AT_DEBUG() \
try {
#define CATCH_COM_ERROR_AT_DEBUG(msg_header, notify) \
}\
catch (_com_error & err) {\
_bstr_t a = err.Description();\
_bstr_t b = err.ErrorMessage();\
TCHAR buf[BUFSIZ] = _T("");\
_stprintf(buf, _T("\r\n%s!! Error Description = [%s] ; \r\nError Message = [%s]"), (msg_header),(const TCHAR *)a, (const TCHAR *)b);\
OutputDebugString(buf);\
\
if ((notify))\
{\
TCHAR * msg = buf;\
::MessageBox(0, buf, _T("something wrong!~"), MB_OK);\
}\
}\
#else
#define TRY_AT_DEBUG()
#define CATCH_COM_ERROR_AT_DEBUG(msg_header, notify)
#endif
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -