编程技巧20法之六:旋转显示文字

发表于:2007-06-17来源:作者:点击数: 标签:
13.如何在指定矩形中旋转显示文字 //在矩形框中旋转方式显示文字,jingzhouxu //参数: //pDC: DC指针 //str: 显示文字 //rect: 显示范围 //angle: 旋转角度 //nOptions:ExtTextOut()中相应设置ETO_CLIPPED和ETO_OPAQUE voidDrawRotatedText(CDC*pDC,constCS

          
13.如何在指定矩形中旋转显示文字 

//  在矩形框中旋转方式显示文字,jingzhou xu
//参数: 
//  pDC: DC指针
//  str: 显示文字

//  rect: 显示范围
//  angle: 旋转角度
//  nOptions: ExtTextOut()中相应设置<ETO_CLIPPED 和 ETO_OPAQUE>

void DrawRotatedText(CDC* pDC, const CString str, CRect rect, double angle, UINT nOptions)
{
   //按比例转换角度值
   double pi = 3.141592654;
   double radian = pi * 2 / 360 * angle;
 
   //获取显示文字中心点
   CSize TextSize = pDC->GetTextExtent(str);
   CPoint center;
   center.x = TextSize.cx / 2;
   center.y = TextSize.cy / 2;
   //计算显示文字新的中心点
   CPoint rcenter;
   rcenter.x = long(cos(radian) * center.x - sin(radian) * center.y);
   rcenter.y = long(sin(radian) * center.x + cos(radian) * center.y);
   //绘制文字
   pDC->SetTextAlign(TA_BASELINE);
   pDC->SetBkMode(TRANSPARENT);
   pDC->ExtTextOut(rect.left + rect.Width() / 2 - rcenter.x, rect.top + rect.Height() / 2 + rcenter.y,
        nOptions, rect, str, NULL);
}
 
14.如何将32 x 32像素图标转换为16 x 16像素值的图标 

HICON Convert32x32IconTo16x16(HICON h32x32Icon)
{
  HDC hMainDC, hMemDC1, hMemDC2;
  HICON h16x16Icon;
  BITMAP bmp;
  HBITMAP hOldBmp1, hOldBmp2;
  ICONINFO IconInfo32x32, IconInfo16x16;

  GetIconInfo(h32x32Icon, &IconInfo32x32);
  hMainDC = ::GetDC(m_hWnd);
  hMemDC1 = CreateCompatibleDC(hMainDC);
  hMemDC2 = CreateCompatibleDC(hMainDC);

  GetObject(IconInfo32x32.hbmColor, sizeof(BITMAP), &bmp);
  IconInfo16x16.hbmColor = CreateBitmap( 16, 16, bmp.bmPlanes,bmp.bmBitsPixel,NULL);

  hOldBmp1 = (HBITMAP) SelectObject( hMemDC1, IconInfo32x32.hbmColor);
  hOldBmp2 = (HBITMAP) SelectObject( hMemDC2,IconInfo16x16.hbmColor);

  StretchBlt(hMemDC2,0, 0,16, 16,hMemDC1,0, 0,32, 32,SRCCOPY);

  GetObject(IconInfo32x32.hbmMask, sizeof(BITMAP), &bmp);

  IconInfo16x16.hbmMask = CreateBitmap( 16, 16, bmp.bmPlanes, bmp.bmBitsPixel,NULL);

  SelectObject(hMemDC1, IconInfo32x32.hbmMask);
  SelectObject(hMemDC2, IconInfo16x16.hbmMask);

  StretchBlt(hMemDC2,0, 0,16, 16,hMemDC1,0, 0,32, 32,SRCCOPY);

  SelectObject(hMemDC1, hOldBmp1);
  SelectObject(hMemDC2, hOldBmp2);

  IconInfo16x16.fIcon = TRUE;
  h16x16Icon = CreateIconIndirect(&IconInfo16x16);

  DeleteObject(IconInfo32x32.hbmColor);
  DeleteObject(IconInfo16x16.hbmColor);
  DeleteObject(IconInfo32x32.hbmMask);
  DeleteObject(IconInfo16x16.hbmMask);

  DeleteDC(hMemDC1);
  DeleteDC(hMemDC2);
  ::ReleaseDC(m_hWnd, hMainDC);
  return h16x16Icon;
}

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