📄 mycmnhdr.h
字号:
/*
模块名称:MyCmnHdr.h
版 本:0.1 Alpha
版 权:Copyright (C) 2005 wlzqi
模块功能:自定义的常用宏和函数集
作 者:wlzqi
作者邮箱:mailto:wlzqi@3stonesoft.com
建立时间:2005年1月19日 甲申猴年十二月初十
最后修改:wlzqi
修改历程:2005年1月21日 甲申猴年十二月初十一 去掉了 UNICODE 宏定义
2005年1月21日 甲申猴年十二月初十二 修改代码为 UNICODE 和 ANSI 通用版
改进了 ToWChar 函数
2005年2月4日 甲申猴年十二月廿六 增加 求三个数的最大、最小值
注意事项:1.SETDLGICONS 宏 ( 改变对话框图标 ) 要在 VC.net 下编译才有效
2.要使用 CTimer 类,请定义 _MY_TIME 宏
备 注:( 参:《核心编程》附A )
:支持 UNICODE 和 ANSI 编码
:测试平台 Windows 2000、IE6、Direcx9、 AMD Xp 2000 + CPU
*/
#pragma once
#include "stdafx.h"
////////////////////////////// Windows的建立 //////////////////////////////////
// 因为可能要使用 Windows 2000 中的新函数、同时也要在 Windows 98 、NT 等多个
// 版本中能够编译,所以使用如下定义
// Windows 2000 中的新函数定义在 Windows 头文件中被定义成如下原形:
// #if ( _WIN32_WINNT_ >= 0x0500 )
// .
// .
// .
// .
// #endif // _WIN32_WINNT_ >= 0x0500
#define _WIN32_WINNT_ 0x0500
//#ifdef WINVER
//#undef WINVER
//#define WINVER 0x0500
//#endif
////////////////////////////// 对 UniCode 的建立 //////////////////////////////
//// 如果不是 X86 CPU 则总是使用 UniCode 方式编译
//#ifndef _M_IX86_
//#define UNICODE
//#endif
//
//// 如果需要在 X86 CPU 上编译,请使用这行
////#define UNICODE
//
//// 定义使用 UNICODE
//#ifdef UNICODE
//#define _UNICODE
//#endif
// 编码
#ifdef UNICODE
#pragma message ( "************** 使用 UNICODE 字符集 ****************" )
#else
#pragma message ( "************** 使用 ANSI 字符集 ****************" )
#endif
// 编译方式
#ifdef _DEBUG
#pragma message ( "************** Debug 版本 ****************" )
#else
#pragma message ( "************** Release 版本 ****************" )
#endif
// 编译器版本
#ifdef _MSC_VER
#if (_MSC_VER >= 1300)
#pragma message ( "************** 编译器版:VC.NET ****************" )
#else
#if (_MSC_VER >= 1200 && _MSC_VER < 1300)
#pragma message ( "************** 编译器版:VC 6.0 ****************" )
#else
#pragma message ( "************** 编译器版:VC 5.0 或更低版本 ********" )
#endif
#endif
#endif
// 类库版本
#ifdef _MFC_VER
#if (_MFC_VER >= 0x0700)
#pragma message ( "************** 类库 版本号:7.0 ****************" )
#else
#if (_MFC_VER >= 0x0421 && _MFC_VER < 0x0700)
#pragma message ( "************** 类库 版本号:4.21 ****************" )
#else
#pragma message ( "************** 类库 版本号:未知 ****************")
#endif
#endif
#endif
#ifdef _WIN64
#pragma message ( "************** 64位程序 ****************" )
#endif
#pragma message ( "************** 最后一次编译日期:"__TIME__" "__DATE__)
#pragma message ( "************** 最后一次修改日期:"__TIMESTAMP__)
//////////////////////////// Include Windows 定义 /////////////////////////////
// 屏蔽第 4 级警告
#pragma warning ( push , 3 )
#include <Windows.h>
#pragma warning ( pop )
#pragma warning ( push , 4 )
////////////////////////////// 校验头文件是否被用 /////////////////////////////
#ifdef WT_EXECUTEINPERSISTENTTHREAD
#pragma message ( "你没有使用最新的 SDK 或 Lib" )
#pragma message ( "这可能影响工程正确的编译" )
#endif
/////////////////////////// 屏蔽掉一些无关紧要的警告 //////////////////////////
// 不标准的注释
#pragma warning ( disable : 4001 )
// 未优化的参数
#pragma warning ( disable : 4100 )
// 注意:建立预编译头文件
#pragma warning ( disable : 4699 )
// 函数不能内联
#pragma warning ( disable : 4710 )
// 无关紧要的内联被移除
#pragma warning ( disable : 4514 )
// assignment operator could not be generated
#pragma warning ( disable : 4512 )
////////////////////////////////// MSG帮助宏 //////////////////////////////////
// 当使用如下使用时
// #pragma MSG ( error_info )
// 将提示类似 c:\windows\system32\MyCmnHdr.h(68):error_info
// 可以用来提示注意某一行代码
// 注意使用本宏时,提示的字符串不需要加""
#define STR2(X) #X
#define STR(X) STR2(X)
#define MSG(desc) message(__FILE__ "(" STR(__LINE__) "):" #desc)
////////////////////////////////// INRANGE 宏 /////////////////////////////////
// 如果返回 TRUE ,表示这个数字在两个数之间
#define INRANGE( Low , Num , High ) ( ( ( Low ) <= ( Num ) ) && ( ( Num ) <= ( High ) ) )
//inline int INRANGE( int Low , int Num ,int High ) { return ( ( Low <= Num ) && ( Num <= High ) ) ; }
////////////////////////////////// DIMOF 宏 ///////////////////////////////////
// 返回数组中元素的数目
#define DIMOF(Array) ( sizeof ( Array ) / sizeof ( Array[0] ) )
////////////////////////////////// DebugBreak 宏 //////////////////////////////
// X86 平台的断点调试改进
#ifdef _X86_
#define DebugBreak() _asm { int 3 }
#endif
/////////////////////////// MAKESOFTWAREEXCEPTION 宏 //////////////////////////
// 建立自己的软件异常
// 异常代码要符合 WinError.h 文件中定义的有关错误代码的规则,每个 DWORD 被划分
// 为如下所示:
// 错误代码的构成(表 - 1)
// ----------------------------------------------------------------------------
// 位 31-30 29 28 27-16 15-0
// ----------------------------------------------------------------------------
// 内 严重系数 微软/客户 保留 设备代码 异常代码
// 容 0 = 成功 0 - 微软定义 必须 微软定义 微软/客户
// 意 1 = 信息 的代码 为 0 详见下表 定义
// 义 2 = 警告 1 - 客户定义 - 2
// 3 = 错误 的代码
// ----------------------------------------------------------------------------
// 设备代码及其值(表 - 2)
// ----------------------------------------------------------------------------
// 设备代码 值 | 设备代码 值
// ----------------------------------------------------------------------------
// FACILITY_FULL 0 | FACILITY_CONTROL 10
// FACILITY_RPC 1 | FACILITY_CERT 11
// FACILITY_DISPATCH 2 | FACILITY_INTERNET 12
// FACILITY_STORAGE 3 | FACILITY_MEDIASERVER 13
// FACILITY_ITF 4 | FACILITY_MSMQ 14
// FACILITY_WIN32 7 | FACILITY_SETUPAPI 15
// FACILITY_WINDOWS 8 | FACILITY_SCARD 16
// FACILITY_SECURITY 9 | FACILITY_COMPLUS 17
// ----------------------------------------------------------------------------
// 例如:EXCEPTION_ACCESS_VIOLATION 代码的值为 0xC0000005
// C 0 0 0 0 0 0 5
// 1100 0000 0000 0000 0000 0000 0000 0101
// 表示一个存取异常错误(不可恢复)设备代码FACILITY_FULL(存取异常可能发生在
// 系统任何地方,不是特定设备发生的),微软定义该异常代码为 5
#define MAKESOFTWAREEXCEPTION(Severity,Facility,Exception) \
( ( DWORD ) ( \
/*严重系数 */( Severity ) | \
/*微软(0)客户(1)*/( 1 << 29 ) | \
/*保留必须为0 */( 0 << 28 ) | \
/*设备代码 */( Facility << 16 ) | \
/*异常代码 */( Exception << 0 ) ) )
/////////////////////////////// ToWChar 函数 //////////////////////////////////
// 单字节字符串转换为宽字节
inline WCHAR * ToWChar( PSTR pMultiByteStr )
{
//该函数是将传统字符串进行转换。
static WCHAR wszBuffer [MAX_PATH] ;
wcsset( wszBuffer , 0 ) ;
int iLenOfWideCharStr = MultiByteToWideChar ( CP_ACP , 0 ,
pMultiByteStr , -1 , NULL , 0 ) ;
if ( ! MultiByteToWideChar ( CP_ACP , 0 , pMultiByteStr , -1 , wszBuffer , iLenOfWideCharStr ) )
{
return NULL ;
}
return wszBuffer ;
}
////////////////////////// 快速对话框显示提示消息 宏 //////////////////////////
// 代替 MessageBox 可以显示出文件的路径
inline void MsgBox ( PCTSTR s )
{
TCHAR chTemp [MAX_PATH] ;
GetModuleFileName ( NULL , chTemp , DIMOF ( chTemp ) ) ;
MessageBox ( GetActiveWindow () , s , chTemp , MB_OK ) ;
}
inline void MsgBox ( bool bfOk, PCTSTR s )
{
if (!bfOk) {
TCHAR chTemp [MAX_PATH] ;
GetModuleFileName ( NULL , chTemp , DIMOF ( chTemp ) ) ;
MessageBox ( GetActiveWindow () , s , chTemp , MB_OK ) ;
}
}
inline void DebugMsgBox ( PCTSTR s )
{
#ifdef _DEBUG
TCHAR chTemp [MAX_PATH] ;
GetModuleFileName ( NULL , chTemp , DIMOF ( chTemp ) ) ;
MessageBox ( GetActiveWindow () , s , chTemp , MB_OK ) ;
#endif
}
inline void DebugMsgBox ( bool bfOk, PCTSTR s )
{
#ifdef _DEBUG
if (!bfOk) {
TCHAR chTemp [MAX_PATH] ;
GetModuleFileName ( NULL , chTemp , DIMOF ( chTemp ) ) ;
MessageBox ( GetActiveWindow () , s , chTemp , MB_OK ) ;
}
#endif
}
/////////////////////////// myASSERT / myVERIFY 宏 ////////////////////////////
// 自定义代替 ASSERT 和 VERIRY的宏,可以显示错误的文件(包括路径)和行号
// myASSERT 在调试版本中有效,发行版中什么也不做。myVERIFY 在调试版本中作用和
// myASSERT一样,在发行版本中只是对条件进行判断,可用在if条件中
inline void FAIL ( PTSTR pszMsg )
{
MsgBox ( pszMsg ) ;
DebugBreak () ;
}
// 定义断言错误消息框
inline void ASSERTFAIL ( LPCSTR lpszfile , int iLine , PCSTR pszException )
{
TCHAR chTemp [MAX_PATH] ;
#ifdef UNICODE
_stprintf ( chTemp , _TEXT ( "文件: %S \n行号: %d \n错误原因: %S\n" ) , lpszfile , iLine , pszException ) ;
#else
_stprintf ( chTemp , _TEXT ( "文件: %s \n行号: %d \n错误原因: %s\n" ) , lpszfile , iLine , pszException ) ;
#endif
FAIL ( chTemp ) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -