科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件编程技巧20法之五

编程技巧20法之五

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

编程技巧20法之五:判断操作系统版本

作者:徐景周  来源:赛迪网 2007年11月12日

关键字: Linux

  • 评论
  • 分享微博
  • 分享邮件
11.如何判断当前操作系统的版本













//-----------------------------------------------------------------------------
//判断操作系统涵数及变量,jingzhou xu
typedef enum tagWin32SysType{
	Windows32s,
	WindowsNT3,
	Windows95,
	Windows98,
	WindowsME,
	WindowsNT4,
	Windows2000,
	WindowsXP
}Win32SysType;
//判断操作系统涵数及变量,jingzhou xu
Win32SysType IsShellSysType()
{
	Win32SysType  ShellType;
	DWORD winVer;
	OSVERSIONINFO *osvi;

	winVer=GetVersion();
	if(winVer<0x80000000){/*NT */
		ShellType=WindowsNT3;
		osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
		if (osvi!=NULL){
			memset(osvi,0,sizeof(OSVERSIONINFO));
			osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
			GetVersionEx(osvi);
			if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;
			else 
if(osvi->dwMajorVersion==5L&&osvi->
dwMinorVersion==0L)ShellType=Windows2000;
			else 
if(osvi->dwMajorVersion==5L&&osvi->
dwMinorVersion==1L)ShellType=WindowsXP;
			free(osvi);
		}
	}
	else if  (LOBYTE(LOWORD(winVer))<4)
		ShellType=Windows32s;
	else{
		ShellType=Windows95;
		osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
		if (osvi!=NULL){
			memset(osvi,0,sizeof(OSVERSIONINFO));
			osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
			GetVersionEx(osvi);
			if(osvi->dwMajorVersion==4L&&osvi->
		dwMinorVersion==10L)ShellType=Windows98;
			else 
if(osvi->dwMajorVersion==4L&&osvi->
dwMinorVersion==90L)ShellType=WindowsME;
			free(osvi);
		}
	}
	return ShellType;
}
//-----------------------------------------------------------------------


12.如何在指定矩形框内水平/垂直显示多行文字

///////////////////////////////////////////////////////
//说明:
//  在矩形框中水平或垂直显示多行文字,jingzhou xu.
//  lMode: 排列方式,0:水平方式; 1:垂直对齐	
//  lHori: 水平对齐方式, 0:左对齐; 1:居中; 2:右对齐; 3:自定义
//  lVert: 垂直对齐方式, 0:顶对齐; 1:居中; 2:底对齐; 3:自定义
///////////////////////////////////////////////////////
CRect DrawTitleInRect(CDC *pDC, CString szString, LPRECT lpRect, long lMode, 
long lHori, long lVert)
{
	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);
	int tmpWidth=tm.tmAveCharWidth, tmpHeight=tm.tmHeight;
	CRect rcInner(lpRect);
	if(lMode==0)
	{
		rcInner.left+=tmpWidth;
		rcInner.right-=tmpWidth;
		rcInner.top-=tmpWidth;
		rcInner.bottom+=tmpWidth;
	}
	if(lMode==1)
	{
		rcInner.left+=tmpWidth;
		rcInner.right=rcInner.left+tmpWidth;
		rcInner.top-=tmpWidth;
		rcInner.bottom+=tmpWidth;
	}

	pDC->DrawText(szString, rcInner,DT_CALCRECT);

	switch(lHori)
	{
	case 0:
		break;
	case 1:
		{
			long xOutCent=(lpRect->right+lpRect->left)/2;
			long xInnCent=(rcInner.right+rcInner.left)/2;
			rcInner.left+=(xOutCent-xInnCent);
			rcInner.right+=(xOutCent-xInnCent);
		}
		break;
	case 2:
		{
			long lInWidth=rcInner.right-rcInner.left;
			rcInner.right=lpRect->right-tmpWidth;
			rcInner.left=rcInner.right-lInWidth;
		}
		break;
	default:
		break;
	}
	
	switch(lVert)
	{
	case 0:
		break;
	case 1:
		{
			long yOutCent=(lpRect->bottom+lpRect->top)/2;
			long yInnCent=(rcInner.bottom+rcInner.top)/2;
			rcInner.top-=(yInnCent-yOutCent);
			rcInner.bottom-=(yInnCent-yOutCent);
		}
		break;
	case 2:
		{
			long lInHeigh=rcInner.top-rcInner.bottom;
			rcInner.bottom=lpRect->bottom+tmpWidth;
			rcInner.top=rcInner.bottom+lInHeigh;
		}
		break;
	default:
		break;
	}
//------------------------------------------------------------------------------
	//功能:根据新、老矩形,重新计算行数,使文字多行显示,jingzhou xu
//-------------------------------------------------------------------------------
	//一行中最大字符数
	int nMaxLineChar = abs(lpRect->right - lpRect->left) / tmpWidth ;
	//记录当前行的宽度
	short theLineLength=0; 
	//记录当前行中汉字字节数,以防止将一半汉字分为两行
	unsigned short halfChinese=0;
	for(int i=0; i<=szString.GetLength()-1; i++)
	{
	if(((unsigned char)szString.GetAt(i) == 0x0d) && ((unsigned 
char)szString.GetAt(i+1) == 0x0a))
			theLineLength=0;
		//大于0xa1的字节为汉字字节
		if((unsigned char)szString.GetAt(i) >= 0xA1)
			halfChinese++;
		theLineLength++;
		//如果行宽大于每行最大宽度,进行特殊处理
		if(theLineLength > nMaxLineChar)
		{
			//防止将一个汉字分为两行,回溯
			if(halfChinese%2)
			{
				szString.Insert(i,(unsigned char)0x0a);
				szString.Insert(i,(unsigned char)0x0d);
			}
			else
			{
				szString.Insert(i-1,(unsigned char)0x0a);
				szString.Insert(i-1,(unsigned char)0x0d);
			}
			
			theLineLength = 0;
		}
	}

	//重新计算矩形边界范围
//	int tmpLine = int(abs(szString.GetLength()*tmpWidth / abs(lpRect->right - 
lpRect->left)-0.5));
//	tmpLine += (szString.GetLength()*tmpWidth % abs(lpRect->right - 
lpRect->left))? 1 : 0;
//	if(tmpLine == 0)
//		tmpLine = 1;
	if(rcInner.bottom > lpRect->bottom)
		rcInner.bottom = lpRect->bottom;
	if(rcInner.top < lpRect->top)
		rcInner.top = lpRect->top;
//------------------------------------------------------------------------------
	if(lHori==0)
		pDC->DrawText(szString, rcInner, DT_WORDBREAK|DT_LEFT);
	else if(lHori==1)
		pDC->DrawText(szString, rcInner, DT_WORDBREAK|DT_CENTER);
	else if(lHori==2)
		pDC->DrawText(szString, rcInner, DT_WORDBREAK|DT_RIGHT);

	return rcInner;
}

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章