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

发表于:2007-06-17来源:作者:点击数: 标签:
11.如何判断当前操作系统的版本 //判断操作系统涵数及变量,jingzhouxu typedefenumtagWin32SysType { Windows 32s, WindowsNT3, Windows95, Windows98, WindowsME, WindowsNT4, Windows2000, Windows XP }Win32SysType; //判断操作系统涵数及变量,jingzhou

          
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;
}

原文转自:http://www.ltesting.net